package com.battery.business.service.impl; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.List; import java.util.function.Function; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import com.battery.device.api.DeviceAdapter; import com.battery.device.api.discovery.InMemoryDeviceDiscoveryCandidateStore; import com.battery.device.api.model.ChannelIdentity; import com.battery.device.api.model.DetectedChannel; import com.battery.device.api.registry.DeviceAdapterRegistry; import com.battery.business.mapper.TDetectionCabinetMapper; import com.battery.business.mapper.TTestMapper; class DeviceDiscoveryPersistenceServiceTest { @Test void failedDiscoveryInvalidatesSuccessfulSnapshotUntilSoftwareReturns() throws Exception { try (var simulator = new com.battery.device.simulator.BtsDevelopmentSimulator(0); var registry = new DeviceAdapterRegistry(List.of(new com.battery.device.bts.BtsDeviceAdapterFactory()))) { registry.synchronize(new com.battery.device.api.registry.AdapterInstanceConfig("dev-sim", "BTS", "127.0.0.1", simulator.port(), 5000, "Asia/Hong_Kong", true, com.battery.device.api.model.AdapterCapabilities.observeOnly())); var store = new InMemoryDeviceDiscoveryCandidateStore(); var mapper = Mockito.mock(TDetectionCabinetMapper.class); var persistence = new DeviceDiscoveryPersistenceService(store, mapper); var scheduler = new com.battery.business.runtime.DevelopmentSimulatorDiscoveryScheduler(registry, persistence); simulator.updateChannel(1, 1, true, com.battery.device.api.model.DeviceWorkStatus.WORKING); scheduler.discover(); var before = store.snapshot(java.time.Instant.now()).cabinets().get(0); org.junit.jupiter.api.Assertions.assertNotNull(before.channels().get(0).latestSnapshot()); simulator.setSoftwareAccessible(false); scheduler.discover(); var failed = store.snapshot(java.time.Instant.now()).cabinets().get(0); assertEquals(before.deviceCode(), failed.deviceCode()); org.junit.jupiter.api.Assertions.assertFalse(failed.online()); org.junit.jupiter.api.Assertions.assertNull(failed.channels().get(0).latestSnapshot()); verify(mapper).markRegisteredCabinetsOffline("dev-sim"); simulator.setSoftwareAccessible(true); scheduler.discover(); org.junit.jupiter.api.Assertions.assertTrue(store.snapshot(java.time.Instant.now()).cabinets().get(0).online()); } } @Test void discoveryPersistsCandidatesWithoutReceivingTest() { InMemoryDeviceDiscoveryCandidateStore candidateStore = new InMemoryDeviceDiscoveryCandidateStore(); TDetectionCabinetMapper cabinetMapper = Mockito.mock(TDetectionCabinetMapper.class); TTestMapper testMapper = Mockito.mock(TTestMapper.class); DeviceAdapterRegistry registry = Mockito.mock(DeviceAdapterRegistry.class); DeviceAdapter adapter = Mockito.mock(DeviceAdapter.class); ChannelIdentity identity = new ChannelIdentity("lab-bts", 22, 1, 1, 1); when(testMapper.hasReceivingTestForAdapter("lab-bts")).thenReturn(0); when(adapter.discoverChannels()).thenReturn(List.of(new DetectedChannel(identity, "127.0.0.1", true))); when(registry.execute(eq("lab-bts"), any())).thenAnswer(invocation -> { @SuppressWarnings("unchecked") Function operation = (Function) invocation.getArgument(1); return operation.apply(adapter); }); DeviceDiscoveryPersistenceService service = new DeviceDiscoveryPersistenceService(candidateStore, cabinetMapper, testMapper); var result = service.discoverForReception(registry, new DeviceDiscoveryPersistenceService.DiscoverySource("lab-bts", 7L, "一号 BTS", 1000)); assertEquals(1, result.cabinetCount()); assertEquals(1, candidateStore.snapshot(java.time.Instant.now()).cabinets().size()); verify(adapter).discoverChannels(); } }