package jmri.jmrix.dcc4pc; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import jmri.util.JUnitUtil; import org.junit.jupiter.api.*; /** * * @author Paul Bender Copyright (C) 2017 */ public class Dcc4PcSensorManagerTest extends jmri.managers.AbstractSensorMgrTestBase { private Dcc4PcReporterManager rm = null; @Override public String getSystemName(int i) { return "DS0:" + i; } @Override protected String getASystemNameWithNoPrefix() { return "0:1"; } @Override @Test public void testDefaultSystemName() { // create -- requires module:contact form. jmri.Sensor t = l.provideSensor("DS0:" + getNumToTest1()); // check assertNotNull( t, "real object returned "); assertEquals( t, l.getBySystemName(getSystemName(getNumToTest1())), "system name correct "); } @Override @Test public void testProvideName() { // create -- requires module:contact form. jmri.Sensor t = l.provideSensor("DS0:" + getNumToTest1()); // check assertNotNull( t, "real object returned "); assertTrue( t == l.getBySystemName(getSystemName(getNumToTest1())), "system name correct "); } @Test public void checkReceiveRawRailComData() { // Raw RailCom message copied from section 9.3 of the // DCC4PC omnibus specification. // packet contains both occupancy information and RailCom data. byte packetData[] = {(byte) 0x0b, (byte) 0x00, (byte) 0x42, (byte) 0x01, (byte) 0x3F, (byte) 0xA8, (byte) 0x90, (byte) 0x90, (byte) 0xC0, (byte) 0x00, (byte) 0x00, (byte) 0x42, (byte) 0x02, (byte) 0xA3, (byte) 0xAC, (byte) 0x8B, (byte) 0x69, (byte) 0x4E, (byte) 0xA5, (byte) 0x99, (byte) 0x9A, (byte) 0x01, (byte) 0x01, (byte) 0x91, (byte) 0x04, (byte) 0x22, (byte) 0x99, (byte) 0xA5, (byte) 0xA3, (byte) 0xAC, (byte) 0x81, (byte) 0x42, (byte) 0x03, (byte) 0x3F, (byte) 0xBC, (byte) 0x80, (byte) 0x90, (byte) 0xC0, (byte) 0x00, (byte) 0x20, (byte) 0x24, (byte) 0x8E, (byte) 0xD4, (byte) 0x4E, (byte) 0x59, (byte) 0xA3, (byte) 0xAC}; Dcc4PcReply rep = new Dcc4PcReply(packetData); rep.setOriginalRequest(Dcc4PcMessage.pollBoard(0)); ((Dcc4PcSensorManager) l).addActiveBoard(0, "1", 16, 0); l.provideSensor("DS0:1"); l.provideSensor("DS0:2"); l.provideSensor("DS0:3"); l.provideSensor("DS0:4"); // creae a reporter for DR0:4, because it has railcom data. rm.provideReporter("DR0:4"); ((Dcc4PcSensorManager) l).reply(rep); JUnitUtil.waitThreadTerminated("Dcc4PCSensor Process Packet for 0"); /* Asserts below fail. The Sensor does not go active */ // JUnitUtil.waitFor(() -> { // return l.provideSensor("DS0:4").getState() == jmri.Sensor.ACTIVE; // },"Sensor goes active"); // Assert.assertEquals("sensor DS0:1 state after packet", jmri.Sensor.INACTIVE, l.provideSensor("DS0:1").getState()); // Assert.assertEquals("sensor DS0:2 state after packet", jmri.Sensor.INACTIVE, l.provideSensor("DS0:2").getState()); // packet above has input 2 (sensor 3) occupied //Assert.assertEquals("sensor DS0:3 state after packet",jmri.Sensor.ACTIVE,l.getSensor("DS0:3").getState()); // packet above has input 3 (sensor 4) occupied with railcom data. //Assert.assertEquals("DR0:4 report","",rm.provideReporter("DR0:4").getCurrentReport()); //Assert.assertEquals("sensor DS0:4 state after packet",jmri.Sensor.ACTIVE,l.getSensor("DS0:4").getState()); } @Test @Disabled("it appears this packet is not yet decoded") public void checkReceiveCookedRailComData() { // Cooked RailCom message copied from section 9.4 of the // DCC4PC omnibus specification. // This packet contains occupancy information only. byte packetData[] = {(byte) 0x0b, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x00}; Dcc4PcReply rep = new Dcc4PcReply(packetData); rep.setOriginalRequest(Dcc4PcMessage.pollBoard(0)); ((Dcc4PcSensorManager) l).addActiveBoard(0, "1", 16, 0); l.provideSensor("DS0:1"); l.provideSensor("DS0:2"); l.provideSensor("DS0:3"); l.provideSensor("DS0:4"); ((Dcc4PcSensorManager) l).reply(rep); JUnitUtil.waitFor(() -> { return l.provideSensor("DS0:3").getState() == jmri.Sensor.ACTIVE;}, "Sensor goes active"); assertEquals( jmri.Sensor.ACTIVE, l.provideSensor("DS0:3").getState(), "sensor state after packet"); } private Dcc4PcSystemConnectionMemo memo = null; @BeforeEach @Override public void setUp() { JUnitUtil.setUp(); Dcc4PcTrafficController tc = new Dcc4PcTrafficController() { @Override public void sendDcc4PcMessage(Dcc4PcMessage m, Dcc4PcListener reply) { } }; memo = new Dcc4PcSystemConnectionMemo(tc); memo.configureManagers(); l = memo.getSensorManager(); rm = memo.getReporterManager(); } @AfterEach public void tearDown() { l.dispose(); assertNotNull(memo); memo.getDcc4PcTrafficController().terminateThreads(); memo.dispose(); l = null; JUnitUtil.tearDown(); } // private static final Logger log = LoggerFactory.getLogger(Dcc4PcSensorManagerTest.class); }