package jmri.server.json.signalmast; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.NullNode; import jmri.InstanceManager; import jmri.JmriException; import jmri.SignalHeadManager; import jmri.SignalMast; import jmri.SignalMastManager; import jmri.implementation.VirtualSignalHead; import jmri.server.json.JSON; import jmri.server.json.JsonException; import jmri.server.json.JsonNamedBeanHttpServiceTestBase; import jmri.server.json.JsonRequest; import jmri.util.JUnitUtil; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** * * @author Paul Bender * @author Randall Wood * @author Steve Todd */ public class JsonSignalMastHttpServiceTest extends JsonNamedBeanHttpServiceTestBase{ @Test @Override public void testDoGet() throws JmriException, JsonException { // create a signalmast for testing String sysName = "IF$shsm:basic:one-searchlight:IH2"; String userName = "SM2"; InstanceManager.getDefault(SignalHeadManager.class).register(new VirtualSignalHead("IH2")); SignalMast s = InstanceManager.getDefault(SignalMastManager.class).provideSignalMast(sysName); s.setUserName(userName); JsonNode result; // retrieve by systemname result = service.doGet(JsonSignalMast.SIGNAL_MAST, sysName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); validate(result); assertEquals(JsonSignalMast.SIGNAL_MAST, result.path(JSON.TYPE).asText()); assertEquals(sysName, result.path(JSON.DATA).path(JSON.NAME).asText()); // verify initial aspect/state is "Unknown" assertEquals(JSON.ASPECT_UNKNOWN, result.path(JSON.DATA).path(JSON.STATE).asText()); // retrieve by username result = service.doGet(JsonSignalMast.SIGNAL_MAST, userName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); validate(result); assertEquals(JsonSignalMast.SIGNAL_MAST, result.path(JSON.TYPE).asText()); assertEquals(sysName, result.path(JSON.DATA).path(JSON.NAME).asText()); // change to Clear, then verify change s.setAspect("Clear"); result = service.doGet(JsonSignalMast.SIGNAL_MAST, sysName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); assertEquals("Clear", result.path(JSON.DATA).path(JSON.STATE).asText()); assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText()); // change to Held, then verify change s.setHeld(true); result = service.doGet(JsonSignalMast.SIGNAL_MAST, sysName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); assertEquals(JSON.ASPECT_HELD, result.path(JSON.DATA).path(JSON.STATE).asText()); assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText()); // change to Dark, then verify change s.setHeld(false); s.setLit(false); result = service.doGet(JsonSignalMast.SIGNAL_MAST, sysName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); assertEquals(JSON.ASPECT_DARK, result.path(JSON.DATA).path(JSON.STATE).asText()); assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText()); } @Test public void testDoPost() throws JmriException, JsonException { // create a signalmast for testing String sysName = "IF$shsm:basic:one-searchlight:IH2"; String userName = "SM2"; InstanceManager.getDefault(SignalHeadManager.class).register(new VirtualSignalHead("IH2")); SignalMast s = InstanceManager.getDefault(SignalMastManager.class).provideSignalMast(sysName); assertNotNull(s); s.setUserName(userName); JsonNode result; JsonNode message; // set signalmast to Clear and verify change message = mapper.createObjectNode().put(JSON.NAME, sysName).put(JSON.STATE, "Clear"); result = service.doPost(JsonSignalMast.SIGNAL_MAST, sysName, message, new JsonRequest(locale, JSON.V5, JSON.GET, 42)); validate(result); assertEquals("Clear", s.getAspect()); assertEquals("Clear", result.path(JSON.DATA).path(JSON.STATE).asText()); assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText()); // try to set to UNKNOWN, which should not be allowed, so state should not change JsonException ex = assertThrows( JsonException.class, () -> { JsonNode messageEx = mapper.createObjectNode().put(JSON.NAME, sysName).put(JSON.STATE, JSON.ASPECT_UNKNOWN); JsonNode resultEx = service.doPost(JsonSignalMast.SIGNAL_MAST, sysName, messageEx, new JsonRequest(locale, JSON.V5, JSON.GET, 42)); assertNotNull(resultEx); }); assertEquals( 400, ex.getCode(), "Error code is HTTP 400"); assertEquals( "Attempting to set object type signalMast to unknown state Unknown.", ex.getMessage(), "Error message"); // set to HELD and verify change message = mapper.createObjectNode().put(JSON.NAME, sysName).put(JSON.STATE, JSON.ASPECT_HELD); result = service.doPost(JsonSignalMast.SIGNAL_MAST, sysName, message, new JsonRequest(locale, JSON.V5, JSON.GET, 42)); validate(result); assertTrue( s.getHeld(), "Signalmast is held"); assertEquals("Clear", s.getAspect()); assertEquals(JSON.ASPECT_HELD, result.path(JSON.DATA).path(JSON.STATE).asText()); assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText()); // set to STOP and verify change message = mapper.createObjectNode().put(JSON.NAME, sysName).put(JSON.STATE, "Stop"); result = service.doPost(JsonSignalMast.SIGNAL_MAST, sysName, message, new JsonRequest(locale, JSON.V5, JSON.GET, 42)); validate(result); assertFalse( s.getHeld(), "Signalmast is not held"); assertEquals("Stop", s.getAspect()); assertEquals("Stop", result.path(JSON.DATA).path(JSON.STATE).asText()); assertEquals("Stop", result.path(JSON.DATA).path(JSON.ASPECT).asText()); } @Test public void testDoGetList() throws JsonException { SignalHeadManager headManager = InstanceManager.getDefault(SignalHeadManager.class); SignalMastManager mastManager = InstanceManager.getDefault(SignalMastManager.class); JsonNode result; result = service.doGetList(JsonSignalMast.SIGNAL_MAST, mapper.createObjectNode(), new JsonRequest(locale, JSON.V5, JSON.GET, 0)); validate(result); assertEquals(0, result.size()); headManager.register(new VirtualSignalHead("IH1")); mastManager.provideSignalMast("IF$shsm:basic:one-searchlight:IH1"); headManager.register(new VirtualSignalHead("IH2")); mastManager.provideSignalMast("IF$shsm:basic:one-searchlight:IH2"); result = service.doGetList(JsonSignalMast.SIGNAL_MAST, mapper.createObjectNode(), new JsonRequest(locale, JSON.V5, JSON.GET, 0)); validate(result); assertEquals(2, result.size()); } @BeforeEach @Override public void setUp() throws Exception { super.setUp(); service = new JsonSignalMastHttpService(mapper); JUnitUtil.initInternalSignalHeadManager(); JUnitUtil.initDefaultSignalMastManager(); JUnitUtil.initSignalMastLogicManager(); } @AfterEach @Override public void tearDown() throws Exception { super.tearDown(); } }