| | |
| | | package com.zy.core.utils; |
| | | |
| | | import com.zy.asrs.entity.BasStationOpt; |
| | | import com.zy.asrs.entity.BasDevp; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.asrs.service.BasDevpService; |
| | | import com.zy.asrs.service.BasStationOptService; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import com.zy.asrs.service.WrkAnalysisService; |
| | | import com.zy.asrs.utils.NotifyUtils; |
| | |
| | | import org.junit.jupiter.api.Test; |
| | | import org.springframework.test.util.ReflectionTestUtils; |
| | | |
| | | import java.util.Date; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | |
| | | import static org.mockito.ArgumentMatchers.eq; |
| | | import static org.mockito.ArgumentMatchers.same; |
| | | import static org.mockito.Mockito.mock; |
| | | import static org.mockito.Mockito.inOrder; |
| | | import static org.mockito.Mockito.times; |
| | | import static org.mockito.Mockito.never; |
| | | import static org.mockito.Mockito.verify; |
| | | import static org.mockito.Mockito.when; |
| | | |
| | | class StationOperateProcessUtilsReroutePipelineTest { |
| | | |
| | | @SuppressWarnings("unchecked") |
| | | private void stubTaskDispatchLock(StationMoveCoordinator coordinator) { |
| | | when(coordinator.withTaskDispatchLock(any(), any())).thenAnswer(invocation -> { |
| | | java.util.function.Supplier<Object> supplier = invocation.getArgument(1); |
| | | return supplier == null ? null : supplier.get(); |
| | | }); |
| | | } |
| | | |
| | | @Test |
| | | void choosesRunBlockCommandBuilderForRunBlockRerouteScene() { |
| | |
| | | StationOperateProcessUtils utils = new StationOperateProcessUtils(); |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | RedisUtil redisUtil = mock(RedisUtil.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | ReflectionTestUtils.setField(utils, "stationMoveCoordinator", coordinator); |
| | | ReflectionTestUtils.setField(utils, "redisUtil", redisUtil); |
| | | |
| | |
| | | } |
| | | |
| | | @Test |
| | | void idleRecover_skipsWhenCurrentStationIsStillInsideRecentlyIssuedActiveRoute() { |
| | | StationOperateProcessUtils utils = new StationOperateProcessUtils(); |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | RedisUtil redisUtil = mock(RedisUtil.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | ReflectionTestUtils.setField(utils, "stationMoveCoordinator", coordinator); |
| | | ReflectionTestUtils.setField(utils, "redisUtil", redisUtil); |
| | | |
| | | StationMoveSession session = new StationMoveSession(); |
| | | session.setStatus(StationMoveSession.STATUS_RUNNING); |
| | | session.setDispatchStationId(196); |
| | | session.setCurrentStationId(189); |
| | | session.setFullPathStationIds(List.of(196, 195, 189, 121, 124)); |
| | | session.setLastIssuedAt(System.currentTimeMillis()); |
| | | when(coordinator.loadSession(10510)).thenReturn(session); |
| | | |
| | | StationCommand command = new StationCommand(); |
| | | command.setTaskNo(10510); |
| | | command.setStationId(121); |
| | | command.setTargetStaNo(124); |
| | | |
| | | StationOperateProcessUtils.RerouteContext context = StationOperateProcessUtils.RerouteContext.create( |
| | | StationOperateProcessUtils.RerouteSceneType.IDLE_RECOVER, |
| | | buildBasDevp(1), |
| | | mock(StationThread.class), |
| | | buildStationProtocol(121, 10510, 121), |
| | | buildWrkMast(10510, 124), |
| | | Collections.emptyList(), |
| | | 0.0d, |
| | | "checkStationIdleRecover" |
| | | ).withRecentDispatchGuard(); |
| | | |
| | | StationOperateProcessUtils.RerouteExecutionResult result = utils.executeReroutePlan( |
| | | context, |
| | | StationOperateProcessUtils.RerouteCommandPlan.dispatch( |
| | | command, |
| | | StationOperateProcessUtils.RerouteDecision.proceed(124), |
| | | "checkStationIdleRecover" |
| | | ) |
| | | ); |
| | | |
| | | assertTrue(result.skipped()); |
| | | assertEquals("recent-dispatch", result.skipReason()); |
| | | verify(coordinator, never()).cancelSession(10510); |
| | | } |
| | | |
| | | @Test |
| | | void idleRecover_skipsWhenStationCommandLogShowsRecentIssuedMove() { |
| | | StationOperateProcessUtils utils = new StationOperateProcessUtils(); |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | BasStationOptService basStationOptService = mock(BasStationOptService.class); |
| | | RedisUtil redisUtil = mock(RedisUtil.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | ReflectionTestUtils.setField(utils, "stationMoveCoordinator", coordinator); |
| | | ReflectionTestUtils.setField(utils, "basStationOptService", basStationOptService); |
| | | ReflectionTestUtils.setField(utils, "redisUtil", redisUtil); |
| | | |
| | | StationMoveSession session = new StationMoveSession(); |
| | | session.setStatus(StationMoveSession.STATUS_RUNNING); |
| | | session.setDispatchStationId(136); |
| | | session.setCurrentStationId(145); |
| | | session.setFullPathStationIds(List.of(136, 137, 139, 142, 143, 145, 148, 149, 151)); |
| | | session.setLastIssuedAt(System.currentTimeMillis() - 20_000L); |
| | | when(coordinator.loadSession(10493)).thenReturn(session); |
| | | |
| | | BasStationOpt recentOpt = new BasStationOpt(); |
| | | recentOpt.setTaskNo(10493); |
| | | recentOpt.setStationId(148); |
| | | recentOpt.setSend(1); |
| | | recentOpt.setMode(String.valueOf(com.zy.core.enums.StationCommandType.MOVE)); |
| | | recentOpt.setSendTime(new Date()); |
| | | when(basStationOptService.list(any(com.baomidou.mybatisplus.core.conditions.Wrapper.class))) |
| | | .thenReturn(Collections.singletonList(recentOpt)); |
| | | |
| | | Boolean skipped = ReflectionTestUtils.invokeMethod(utils, |
| | | "shouldSkipIdleRecoverForRecentDispatch", |
| | | 10493, |
| | | 148); |
| | | |
| | | assertTrue(Boolean.TRUE.equals(skipped)); |
| | | } |
| | | |
| | | @Test |
| | | void checkStationOutOrder_skipsWhenActiveSessionAlreadyOwnsCurrentStation() { |
| | | StationOperateProcessUtils utils = new StationOperateProcessUtils(); |
| | | BasDevpService basDevpService = mock(BasDevpService.class); |
| | |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | RedisUtil redisUtil = mock(RedisUtil.class); |
| | | StationThread stationThread = mock(StationThread.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | |
| | | ReflectionTestUtils.setField(utils, "basDevpService", basDevpService); |
| | | ReflectionTestUtils.setField(utils, "wrkMastService", wrkMastService); |
| | |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | RedisUtil redisUtil = mock(RedisUtil.class); |
| | | StationThread stationThread = mock(StationThread.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | |
| | | ReflectionTestUtils.setField(utils, "basDevpService", basDevpService); |
| | | ReflectionTestUtils.setField(utils, "wrkMastService", wrkMastService); |
| | |
| | | void executePlan_runBlockReroute_reissuesWhenBlockedSessionMatchesCandidatePath() { |
| | | StationOperateProcessUtils utils = new StationOperateProcessUtils(); |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | RedisUtil redisUtil = mock(RedisUtil.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | ReflectionTestUtils.setField(utils, "stationMoveCoordinator", coordinator); |
| | | ReflectionTestUtils.setField(utils, "redisUtil", redisUtil); |
| | | |
| | | StationCommand command = new StationCommand(); |
| | | command.setTaskNo(100); |
| | |
| | | ); |
| | | |
| | | assertTrue(!result.skipped()); |
| | | org.mockito.InOrder inOrder = inOrder(coordinator); |
| | | inOrder.verify(coordinator).markCancelPending(100, "reroute_pending"); |
| | | inOrder.verify(coordinator).cancelSession(100); |
| | | verify(coordinator, times(1)).cancelSession(100); |
| | | } finally { |
| | | MessageQueue.clear(SlaveType.Devp, 1); |
| | |
| | | StationOperateProcessUtils utils = new StationOperateProcessUtils(); |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | RedisUtil redisUtil = mock(RedisUtil.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | ReflectionTestUtils.setField(utils, "stationMoveCoordinator", coordinator); |
| | | ReflectionTestUtils.setField(utils, "redisUtil", redisUtil); |
| | | |
| | |
| | | StationOperateProcessUtils utils = new StationOperateProcessUtils(); |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | RedisUtil redisUtil = mock(RedisUtil.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | ReflectionTestUtils.setField(utils, "stationMoveCoordinator", coordinator); |
| | | ReflectionTestUtils.setField(utils, "redisUtil", redisUtil); |
| | | |
| | |
| | | WrkAnalysisService wrkAnalysisService = mock(WrkAnalysisService.class); |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | StationThread stationThread = mock(StationThread.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | |
| | | ReflectionTestUtils.setField(utils, "basDevpService", basDevpService); |
| | | ReflectionTestUtils.setField(utils, "wrkMastService", wrkMastService); |
| | |
| | | NotifyUtils notifyUtils = mock(NotifyUtils.class); |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | StationThread stationThread = mock(StationThread.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | |
| | | ReflectionTestUtils.setField(utils, "wrkMastService", wrkMastService); |
| | | ReflectionTestUtils.setField(utils, "redisUtil", redisUtil); |
| | |
| | | StationMoveCoordinator coordinator = mock(StationMoveCoordinator.class); |
| | | RedisUtil redisUtil = mock(RedisUtil.class); |
| | | StationThread stationThread = mock(StationThread.class); |
| | | stubTaskDispatchLock(coordinator); |
| | | |
| | | ReflectionTestUtils.setField(utils, "basDevpService", basDevpService); |
| | | ReflectionTestUtils.setField(utils, "wrkMastService", wrkMastService); |