yeg
4 天以前 99fd4ccdf5d410e78a3785375036c34a2132ee04
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.battery.device.bts;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.time.Duration;
import java.time.ZoneId;
import java.util.Set;
import org.junit.jupiter.api.Test;
import com.battery.device.api.DeviceAdapter;
import com.battery.device.api.model.ChannelIdentity;
import com.battery.device.api.model.DeviceConnectionStatus;
import com.battery.device.api.model.DeviceWorkStatus;
import com.battery.device.api.model.ObservationFailureReason;
 
class DeviceObservationSeamContractTest
{
    private static final ChannelIdentity CHANNEL = new ChannelIdentity("lab-bts", 22, 1, 1, 1);
 
    @Test
    void successfulResponseIsOnlineAndCarriesDeviceTimeAndPlan() throws Exception
    {
        try (ScriptedBtsTcpSimulator simulator = new ScriptedBtsTcpSimulator();
             BtsTcpTransport transport = new BtsTcpTransport("127.0.0.1", simulator.port(),
                     Duration.ofSeconds(1), Duration.ofSeconds(1));
             DeviceAdapter adapter = new BtsDeviceAdapter("lab-bts", transport,
                     new BtsXmlCodec("lab-bts", ZoneId.of("Asia/Hong_Kong"))))
        {
            simulator.enqueue("<bts><cmd>inquire_resp</cmd><list><inquire dev=\"22-1-1-1-0\""
                    + " workstatus=\"working\" device_time=\"2026-09-04 18.00.00\"><plan>"
                    + "<step step_no=\"1\" step_type=\"cc\" name=\"恒流\" duration_seconds=\"60\"/>"
                    + "</plan></inquire></list></bts>");
 
            var observation = adapter.observe(Set.of(CHANNEL)).get(CHANNEL);
 
            assertEquals(DeviceConnectionStatus.ONLINE, observation.connectionStatus());
            assertEquals(DeviceWorkStatus.WORKING, observation.workStatus());
            assertEquals("2026-09-04T10:00:00Z", observation.deviceTime().toString());
            assertEquals(1, observation.plannedSteps().size());
            assertEquals("cc", observation.plannedSteps().get(0).stepType());
            assertEquals(null, observation.failureReason());
        }
    }
 
    @Test
    void missingChannelResponseIsOfflineAndUnobservable() throws Exception
    {
        try (ScriptedBtsTcpSimulator simulator = new ScriptedBtsTcpSimulator();
             BtsTcpTransport transport = new BtsTcpTransport("127.0.0.1", simulator.port(),
                     Duration.ofSeconds(1), Duration.ofSeconds(1));
             DeviceAdapter adapter = new BtsDeviceAdapter("lab-bts", transport,
                     new BtsXmlCodec("lab-bts", ZoneId.of("Asia/Hong_Kong"))))
        {
            simulator.enqueue("<bts><cmd>inquire_resp</cmd><list count=\"0\"/></bts>");
 
            var observation = adapter.observe(Set.of(CHANNEL)).get(CHANNEL);
 
            assertEquals(DeviceConnectionStatus.OFFLINE, observation.connectionStatus());
            assertEquals(DeviceWorkStatus.UNOBSERVABLE, observation.workStatus());
            assertEquals(ObservationFailureReason.OFFLINE, observation.failureReason());
        }
    }
 
    @Test
    void timeoutAndParseFailureBecomeStableOfflineReasons() throws Exception
    {
        try (ScriptedBtsTcpSimulator simulator = new ScriptedBtsTcpSimulator();
             BtsTcpTransport transport = new BtsTcpTransport("127.0.0.1", simulator.port(),
                     Duration.ofSeconds(1), Duration.ofMillis(50));
             DeviceAdapter adapter = new BtsDeviceAdapter("lab-bts", transport,
                     new BtsXmlCodec("lab-bts", ZoneId.of("Asia/Hong_Kong"))))
        {
            simulator.enqueueDelayed(Duration.ofMillis(200), "<bts><cmd>inquire_resp</cmd><list/></bts>");
            assertEquals(ObservationFailureReason.TIMEOUT, adapter.observe(Set.of(CHANNEL)).get(CHANNEL).failureReason());
        }
 
        try (ScriptedBtsTcpSimulator simulator = new ScriptedBtsTcpSimulator();
             BtsTcpTransport transport = new BtsTcpTransport("127.0.0.1", simulator.port(),
                     Duration.ofSeconds(1), Duration.ofSeconds(1));
             DeviceAdapter adapter = new BtsDeviceAdapter("lab-bts", transport,
                     new BtsXmlCodec("lab-bts", ZoneId.of("Asia/Hong_Kong"))))
        {
            simulator.enqueue("<bts><cmd>inquire_resp</cmd>");
            assertEquals(ObservationFailureReason.PARSE_FAILED, adapter.observe(Set.of(CHANNEL)).get(CHANNEL).failureReason());
        }
    }
}