package jmri.jmrix.openlcb; import jmri.InstanceManager; import jmri.IdTagManager; import jmri.util.JUnitUtil; import org.openlcb.*; import org.junit.Assert; import org.junit.jupiter.api.*; /** * Tests for the OlcbSignalMast implementation * * @author Bob Jacobsen Copyright (C) 2013, 2017, 2018 * updated to JUnit4 2016 */ public class OlcbSignalMastTest { @Test public void testCtor1() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($5)"); Assert.assertEquals("system name", "MF$olm:AAR-1946:PL-1-high-abs($5)", t.getSystemName()); // check last reference using 5 above Assert.assertEquals(5, OlcbSignalMast.getLastRef()); } @Test public void testStopAspect() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); t.setOutputForAppearance("Stop", "1.2.3.4.5.6.7.8"); Assert.assertEquals("Stop aspect event", "1.2.3.4.5.6.7.8", t.getOutputForAppearance("Stop")); } @Test public void testSetGetEvents() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); t.setLitEventId("1.2.3.4.5.6.7.1"); Assert.assertEquals("lit", "1.2.3.4.5.6.7.1", t.getLitEventId()); t.setNotLitEventId("1.2.3.4.5.6.7.2"); Assert.assertEquals("not lit", "1.2.3.4.5.6.7.2", t.getNotLitEventId()); t.setHeldEventId("1.2.3.4.5.6.7.3"); Assert.assertEquals("held", "1.2.3.4.5.6.7.3", t.getHeldEventId()); t.setNotHeldEventId("1.2.3.4.5.6.7.4"); Assert.assertEquals("lit", "1.2.3.4.5.6.7.4", t.getNotHeldEventId()); } @Test public void testUnsetEvents() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); Assert.assertEquals("lit", "00.00.00.00.00.00.00.00", t.getLitEventId()); Assert.assertEquals("not lit", "00.00.00.00.00.00.00.00", t.getNotLitEventId()); Assert.assertEquals("held", "00.00.00.00.00.00.00.00", t.getHeldEventId()); Assert.assertEquals("lit", "00.00.00.00.00.00.00.00", t.getNotHeldEventId()); } @Test public void testReceiveLitPcerMessage() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); t.setLitEventId("1.2.3.4.5.6.7.1"); t.setNotLitEventId("1.2.3.4.5.6.7.2"); t.setHeldEventId("1.2.3.4.5.6.7.3"); t.setNotHeldEventId("1.2.3.4.5.6.7.4"); t.setOutputForAppearance("Clear", "1.2.3.4.5.6.7.10"); t.setOutputForAppearance("Approach", "1.2.3.4.5.6.7.11"); t.setOutputForAppearance("Permissive", "1.2.3.4.5.6.7.12"); t.setOutputForAppearance("Stop", "1.2.3.4.5.6.7.13"); Assert.assertEquals("Init sent for 8 events", 32, messages.size()); resetMessages(); // reset test message queue // confirm that setting again doesn't resend t.setLitEventId("1.2.3.4.5.6.7.1"); t.setNotLitEventId("1.2.3.4.5.6.7.2"); t.setHeldEventId("1.2.3.4.5.6.7.3"); t.setNotHeldEventId("1.2.3.4.5.6.7.4"); t.setOutputForAppearance("Clear", "1.2.3.4.5.6.7.10"); t.setOutputForAppearance("Approach", "1.2.3.4.5.6.7.11"); t.setOutputForAppearance("Permissive", "1.2.3.4.5.6.7.12"); t.setOutputForAppearance("Stop", "1.2.3.4.5.6.7.13"); Assert.assertEquals("Init sent 0 events 2nd time", 0, messages.size()); // but a different event does t.setOutputForAppearance("Stop", "11.2.3.4.5.6.7.13"); Assert.assertEquals("Init for single new event", 4, messages.size()); resetMessages(); // reset test message queue // and zero doesn't t.setOutputForAppearance("Stop", "0.0.0.0.0.0.0.0"); Assert.assertEquals("Init sent nothing", 0, messages.size()); resetMessages(); // reset test message queue Assert.assertTrue("lit defaults true", t.getLit()); org.openlcb.Message msg; msg = new org.openlcb.ProducerConsumerEventReportMessage(new NodeID(), new OlcbAddress("1.2.3.4.5.6.7.2", null).toEventID()); t.handleMessage(msg); Assert.assertFalse("lit false", t.getLit()); msg = new org.openlcb.ProducerConsumerEventReportMessage(new NodeID(), new OlcbAddress("1.2.3.4.5.6.7.1", null).toEventID()); t.handleMessage(msg); Assert.assertTrue("lit true", t.getLit()); Assert.assertEquals("none sent", 0, messages.size()); } @Test public void testReceiveIdProducerLitMessage() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); t.setLitEventId("1.2.3.4.5.6.7.1"); t.setNotLitEventId("1.2.3.4.5.6.7.2"); t.setHeldEventId("1.2.3.4.5.6.7.3"); t.setNotHeldEventId("1.2.3.4.5.6.7.4"); t.setOutputForAppearance("Clear", "1.2.3.4.5.6.7.10"); t.setOutputForAppearance("Approach", "1.2.3.4.5.6.7.11"); t.setOutputForAppearance("Permissive", "1.2.3.4.5.6.7.12"); t.setOutputForAppearance("Stop", "1.2.3.4.5.6.7.13"); Assert.assertEquals("Init sent for 8 events", 32, messages.size()); resetMessages(); // reset test message queue Assert.assertTrue("lit defaults true", t.getLit()); org.openlcb.Message msg; msg = new org.openlcb.IdentifyProducersMessage(new NodeID(), new OlcbAddress("1.2.3.4.5.6.7.2", null).toEventID()); t.handleMessage(msg); Assert.assertTrue("lit still true", t.getLit()); Assert.assertEquals("reply sent", 1, messages.size()); } @Test public void testReceiveLitProducerIdMessage() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); t.setLitEventId("1.2.3.4.5.6.7.1"); t.setNotLitEventId("1.2.3.4.5.6.7.2"); t.setHeldEventId("1.2.3.4.5.6.7.3"); t.setNotHeldEventId("1.2.3.4.5.6.7.4"); t.setOutputForAppearance("Clear", "1.2.3.4.5.6.7.10"); t.setOutputForAppearance("Approach", "1.2.3.4.5.6.7.11"); t.setOutputForAppearance("Permissive", "1.2.3.4.5.6.7.12"); t.setOutputForAppearance("Stop", "1.2.3.4.5.6.7.13"); Assert.assertEquals("Init sent for 8 events", 32, messages.size()); resetMessages(); // reset test message queue Assert.assertTrue("lit defaults true", t.getLit()); org.openlcb.Message msg; msg = new org.openlcb.ProducerIdentifiedMessage(new NodeID(), new OlcbAddress(t.getNotLitEventId(), null).toEventID(), org.openlcb.EventState.Invalid); t.handleMessage(msg); Assert.assertTrue("lit true", t.getLit()); // default msg = new org.openlcb.ProducerIdentifiedMessage(new NodeID(), new OlcbAddress(t.getNotLitEventId(), null).toEventID(), org.openlcb.EventState.Unknown); t.handleMessage(msg); Assert.assertTrue("lit true", t.getLit()); msg = new org.openlcb.ProducerIdentifiedMessage(new NodeID(), new OlcbAddress("FF.2.3.4.5.6.7.2", null).toEventID(), org.openlcb.EventState.Valid); // wrong event t.handleMessage(msg); Assert.assertTrue("lit true", t.getLit()); msg = new org.openlcb.ProducerIdentifiedMessage(new NodeID(), new OlcbAddress(t.getNotLitEventId(), null).toEventID(), org.openlcb.EventState.Valid); t.handleMessage(msg); Assert.assertFalse("lit false", t.getLit()); msg = new org.openlcb.ProducerIdentifiedMessage(new NodeID(), new OlcbAddress(t.getLitEventId(), null).toEventID(), org.openlcb.EventState.Invalid); t.handleMessage(msg); Assert.assertFalse("lit false", t.getLit()); msg = new org.openlcb.ProducerIdentifiedMessage(new NodeID(), new OlcbAddress(t.getLitEventId(), null).toEventID(), org.openlcb.EventState.Unknown); t.handleMessage(msg); Assert.assertFalse("lit false", t.getLit()); msg = new org.openlcb.ProducerIdentifiedMessage(new NodeID(), new OlcbAddress("FF.2.3.4.5.6.7.1", null).toEventID(), org.openlcb.EventState.Valid); // wrong event t.handleMessage(msg); Assert.assertFalse("lit false", t.getLit()); msg = new org.openlcb.ProducerIdentifiedMessage(new NodeID(), new OlcbAddress(t.getLitEventId(), null).toEventID(), org.openlcb.EventState.Valid); t.handleMessage(msg); Assert.assertTrue("lit true", t.getLit()); Assert.assertEquals("none sent", 0, messages.size()); } enum States2 { A, B } @Test public void testStateMachine2Setup() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); OlcbSignalMast.StateMachine machine = t.new StateMachine<>(connection, nodeID, States2.B); Assert.assertEquals("starting state", States2.B, machine.getState()); machine.setEventForState(States2.A, "01.00.00.00.00.00.01.00"); machine.setEventForState(States2.B, "01.00.00.00.00.00.02.00"); Assert.assertEquals("Init sent for 2 events", 8, messages.size()); resetMessages(); // reset test message queue Assert.assertEquals("A event", new EventID(new byte[]{1, 0, 0, 0, 0, 0, 1, 0}), machine.getEventIDForState(States2.A)); Assert.assertEquals("B event", new EventID(new byte[]{1, 0, 0, 0, 0, 0, 2, 0}), machine.getEventIDForState(States2.B)); machine.setState(States2.A); Assert.assertEquals("still starting state", States2.B, machine.getState()); Assert.assertEquals("one sent", 1, messages.size()); machine.handleProducerConsumerEventReport( new ProducerConsumerEventReportMessage(nodeID, new EventID(new byte[]{2, 0, 0, 0, 0, 0, 1, 0})), null); // other eventID Assert.assertEquals("still starting state", States2.B, machine.getState()); machine.handleProducerConsumerEventReport( new ProducerConsumerEventReportMessage(nodeID, new EventID(new byte[]{1, 0, 0, 0, 0, 0, 1, 0})), null); // A eventID Assert.assertEquals("new state", States2.A, machine.getState()); } @Test public void testStateMachine2IdEvents() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); OlcbSignalMast.StateMachine machine = t.new StateMachine<>(connection, nodeID, States2.B); machine.setEventForState(States2.A, "01.00.00.00.00.00.01.00"); machine.setEventForState(States2.B, "01.00.00.00.00.00.02.00"); Assert.assertEquals("Init sent for 2 events", 8, messages.size()); resetMessages(); // reset test message queue machine.handleIdentifyEventsAddressed( new IdentifyEventsAddressedMessage(new NodeID(), new NodeID()), null); Assert.assertEquals("no reply if wrong address", 0, messages.size()); machine.handleIdentifyEventsAddressed( new IdentifyEventsAddressedMessage(new NodeID(), nodeID), null); Assert.assertEquals("four sent", 4, messages.size()); // check by string comparison as a short cut Assert.assertEquals("msg 0", "01.00.00.00.00.00 Consumer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(0).toString()); Assert.assertEquals("msg 1", "01.00.00.00.00.00 Producer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(1).toString()); Assert.assertEquals("msg 2", "01.00.00.00.00.00 Consumer Identified Unknown for EventID:01.00.00.00.00.00.01.00", messages.get(2).toString()); Assert.assertEquals("msg 3", "01.00.00.00.00.00 Producer Identified Unknown for EventID:01.00.00.00.00.00.01.00", messages.get(3).toString()); resetMessages(); // reset test message queue machine.handleIdentifyEventsGlobal( new IdentifyEventsGlobalMessage(new NodeID()), null); Assert.assertEquals("four sent", 4, messages.size()); // check by string comparison as a short cut Assert.assertEquals("msg 0", "01.00.00.00.00.00 Consumer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(0).toString()); Assert.assertEquals("msg 1", "01.00.00.00.00.00 Producer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(1).toString()); Assert.assertEquals("msg 2", "01.00.00.00.00.00 Consumer Identified Unknown for EventID:01.00.00.00.00.00.01.00", messages.get(2).toString()); Assert.assertEquals("msg 3", "01.00.00.00.00.00 Producer Identified Unknown for EventID:01.00.00.00.00.00.01.00", messages.get(3).toString()); resetMessages(); // reset test message queue machine.handleIdentifyProducers( new IdentifyProducersMessage(new NodeID(), new EventID(new byte[]{11, 0, 0, 0, 0, 0, 2, 0})), null); Assert.assertEquals("no reply", 0, messages.size()); machine.handleIdentifyProducers( new IdentifyProducersMessage(new NodeID(), new EventID(new byte[]{1, 0, 0, 0, 0, 0, 2, 0})), null); Assert.assertEquals("one sent", 1, messages.size()); // check by string comparison as a short cut Assert.assertEquals("reply", "01.00.00.00.00.00 Producer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(0).toString()); resetMessages(); // reset test message queue machine.handleIdentifyConsumers( new IdentifyConsumersMessage(new NodeID(), new EventID(new byte[]{11, 0, 0, 0, 0, 0, 2, 0})), null); Assert.assertEquals("no reply", 0, messages.size()); machine.handleIdentifyConsumers( new IdentifyConsumersMessage(new NodeID(), new EventID(new byte[]{1, 0, 0, 0, 0, 0, 2, 0})), null); Assert.assertEquals("one sent", 1, messages.size()); // check by string comparison as a short cut Assert.assertEquals("reply", "01.00.00.00.00.00 Consumer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(0).toString()); } @Test public void testStateMachineStringSetup() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); OlcbSignalMast.StateMachine machine = t.new StateMachine<>(connection, nodeID, "B"); Assert.assertEquals("starting state", "B", machine.getState()); machine.setEventForState("A", "01.00.00.00.00.00.01.00"); machine.setEventForState("B", "01.00.00.00.00.00.02.00"); Assert.assertEquals("A event", new EventID(new byte[]{1, 0, 0, 0, 0, 0, 1, 0}), machine.getEventIDForState("A")); Assert.assertEquals("B event", new EventID(new byte[]{1, 0, 0, 0, 0, 0, 2, 0}), machine.getEventIDForState("B")); Assert.assertEquals("Init sent for 2 events", 8, messages.size()); resetMessages(); // reset test message queue machine.setState("A"); Assert.assertEquals("still starting state", "B", machine.getState()); Assert.assertEquals("one sent", 1, messages.size()); machine.handleProducerConsumerEventReport( new ProducerConsumerEventReportMessage(nodeID, new EventID(new byte[]{2, 0, 0, 0, 0, 0, 1, 0})), null); // other eventID Assert.assertEquals("still starting state", "B", machine.getState()); machine.handleProducerConsumerEventReport( new ProducerConsumerEventReportMessage(nodeID, new EventID(new byte[]{1, 0, 0, 0, 0, 0, 1, 0})), null); // A eventID Assert.assertEquals("new state", "A", machine.getState()); } @Test public void testStateMachineStringIdEvents() { OlcbSignalMast t = new OlcbSignalMast("MF$olm:AAR-1946:PL-1-high-abs($1)"); OlcbSignalMast.StateMachine machine = t.new StateMachine<>(connection, nodeID, "B"); machine.setEventForState("A", "01.00.00.00.00.00.01.00"); machine.setEventForState("B", "01.00.00.00.00.00.02.00"); Assert.assertEquals("Init sent for 2 events", 8, messages.size()); resetMessages(); // reset test message queue machine.handleIdentifyEventsAddressed( new IdentifyEventsAddressedMessage(new NodeID(), new NodeID()), null); Assert.assertEquals("no reply if wrong address", 0, messages.size()); machine.handleIdentifyEventsAddressed( new IdentifyEventsAddressedMessage(new NodeID(), nodeID), null); Assert.assertEquals("four sent", 4, messages.size()); // check by string comparison as a short cut Assert.assertEquals("msg 0", "01.00.00.00.00.00 Consumer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(0).toString()); Assert.assertEquals("msg 1", "01.00.00.00.00.00 Producer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(1).toString()); Assert.assertEquals("msg 2", "01.00.00.00.00.00 Consumer Identified Unknown for EventID:01.00.00.00.00.00.01.00", messages.get(2).toString()); Assert.assertEquals("msg 3", "01.00.00.00.00.00 Producer Identified Unknown for EventID:01.00.00.00.00.00.01.00", messages.get(3).toString()); resetMessages(); machine.handleIdentifyProducers( new IdentifyProducersMessage(new NodeID(), new EventID(new byte[]{11, 0, 0, 0, 0, 0, 2, 0})), null); Assert.assertEquals("no reply", 0, messages.size()); machine.handleIdentifyProducers( new IdentifyProducersMessage(new NodeID(), new EventID(new byte[]{1, 0, 0, 0, 0, 0, 2, 0})), null); Assert.assertEquals("one sent", 1, messages.size()); // check by string comparison as a short cut Assert.assertEquals("reply", "01.00.00.00.00.00 Producer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(0).toString()); resetMessages(); machine.handleIdentifyConsumers( new IdentifyConsumersMessage(new NodeID(), new EventID(new byte[]{11, 0, 0, 0, 0, 0, 2, 0})), null); Assert.assertEquals("no reply", 0, messages.size()); machine.handleIdentifyConsumers( new IdentifyConsumersMessage(new NodeID(), new EventID(new byte[]{1, 0, 0, 0, 0, 0, 2, 0})), null); Assert.assertEquals("one sent", 1, messages.size()); // check by string comparison as a short cut Assert.assertEquals("reply", "01.00.00.00.00.00 Consumer Identified Unknown for EventID:01.00.00.00.00.00.02.00", messages.get(0).toString()); } // from here down is testing infrastructure private static OlcbSystemConnectionMemoScaffold memo; static Connection connection; static NodeID nodeID = new NodeID(new byte[]{1, 0, 0, 0, 0, 0}); static java.util.ArrayList messages; private static void resetMessages(){ messages = new java.util.ArrayList<>(); } @BeforeEach public void setUp() { resetMessages(); } @BeforeAll @SuppressWarnings("deprecation") // OlcbInterface(NodeID, Connection) public static void preClassInit() { JUnitUtil.setUp(); JUnitUtil.initInternalTurnoutManager(); nodeID = new NodeID(new byte[]{1, 0, 0, 0, 0, 0}); resetMessages(); connection = new AbstractConnection() { @Override public void put(Message msg, Connection sender) { messages.add(msg); } }; memo = new OlcbSystemConnectionMemoScaffold(); // this self-registers as 'M' memo.setProtocol(jmri.jmrix.can.ConfigurationManager.OPENLCB); memo.setInterface(new OlcbInterface(nodeID, connection) { @Override public Connection getOutputConnection() { return connection; } }); JUnitUtil.waitFor(()-> (!messages.isEmpty()),"Initialization Complete message"); } @AfterEach public void tearDown() { } @AfterAll public static void postClassTearDown() { if(memo != null && memo.getInterface() !=null ) { memo.getInterface().dispose(); memo.get(OlcbEventNameStore.class).deregisterShutdownTask(); memo.dispose(); InstanceManager.getDefault(IdTagManager.class).dispose(); } memo = null; connection = null; nodeID = null; JUnitUtil.tearDown(); } }