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<DeviceAdapter, Object> operation = (Function<DeviceAdapter, Object>) 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();
|
}
|
}
|