package jmri.server.json.signalhead; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.NullNode; import jmri.JmriException; import jmri.SignalHead; import jmri.server.json.JSON; import jmri.server.json.JsonException; import jmri.server.json.JsonHttpServiceTestBase; 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 JsonSignalHeadHttpServiceTest extends JsonHttpServiceTestBase { @Test public void testDoGet() throws JmriException, JsonException { //create a signalhead for testing String sysName = "IH1"; String userName = "SH1"; SignalHead s = new jmri.implementation.VirtualSignalHead(sysName, userName); jmri.InstanceManager.getDefault(jmri.SignalHeadManager.class).register(s); assertNotNull(s); JsonNode result; //retrieve by systemname result = service.doGet(JsonSignalHead.SIGNAL_HEAD, sysName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); validate(result); assertEquals(JsonSignalHead.SIGNAL_HEAD, result.path(JSON.TYPE).asText()); assertEquals(sysName, result.path(JSON.DATA).path(JSON.NAME).asText()); //retrieve by username, should get systemname back result = service.doGet(JsonSignalHead.SIGNAL_HEAD, userName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); validate(result); assertEquals(sysName, result.path(JSON.DATA).path(JSON.NAME).asText()); //verify initial aspect/state is Dark assertEquals(SignalHead.DARK, result.path(JSON.DATA).path(JSON.STATE).asInt()); //change to Green, then verify change s.setAppearance(SignalHead.GREEN); result = service.doGet(JsonSignalHead.SIGNAL_HEAD, userName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); assertEquals(SignalHead.GREEN, result.path(JSON.DATA).path(JSON.STATE).asInt()); //set Held, then verify change s.setHeld(true); result = service.doGet(JsonSignalHead.SIGNAL_HEAD, userName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); assertTrue(result.path(JSON.DATA).path(JSON.TOKEN_HELD).asBoolean()); //set to Not Held, then verify change s.setHeld(false); result = service.doGet(JsonSignalHead.SIGNAL_HEAD, userName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42)); assertFalse(result.path(JSON.DATA).path(JSON.TOKEN_HELD).asBoolean()); } @Test public void testDoPost() throws JmriException, JsonException { //create a signalhead for testing String sysName = "IH1"; String userName = "SH1"; SignalHead s = new jmri.implementation.VirtualSignalHead(sysName, userName); jmri.InstanceManager.getDefault(jmri.SignalHeadManager.class).register(s); assertNotNull(s); JsonNode result; JsonNode message; //set signalhead to Green and verify change message = mapper.createObjectNode().put(JSON.NAME, userName).put(JSON.STATE, SignalHead.GREEN); result = service.doPost(JsonSignalHead.SIGNAL_HEAD, userName, message, new JsonRequest(locale, JSON.V5, JSON.GET, 42)); validate(result); assertEquals(SignalHead.GREEN, s.getState()); assertEquals(SignalHead.GREEN, result.path(JSON.DATA).path(JSON.STATE).asInt()); // try to set to FLASHLUNAR, which should not be allowed for this signalHead, // so check for error, and verify state does not change JsonException ex = assertThrows( JsonException.class, () -> { JsonNode messageEx = mapper.createObjectNode().put(JSON.NAME, userName).put(JSON.STATE, SignalHead.FLASHLUNAR); service.doPost(JsonSignalHead.SIGNAL_HEAD, userName, messageEx, new JsonRequest(locale, JSON.V5, JSON.GET, 42)); }); assertEquals(400, ex.getCode()); assertEquals(SignalHead.GREEN, s.getState()); assertEquals(false, s.getHeld()); // set signalmast to Held, then verify message = mapper.createObjectNode().put(JSON.NAME, userName).put(JSON.STATE, SignalHead.HELD); result = service.doPost(JsonSignalHead.SIGNAL_HEAD, userName, message, new JsonRequest(locale, JSON.V5, JSON.GET, 42)); assertNotNull(result); assertEquals(true, s.getHeld()); assertEquals(true, s.getHeld()); // set signalmast to something other than Held, then verify Held is released message = mapper.createObjectNode().put(JSON.NAME, userName).put(JSON.STATE, SignalHead.RED); result = service.doPost(JsonSignalHead.SIGNAL_HEAD, userName, message, new JsonRequest(locale, JSON.V5, JSON.GET, 42)); assertNotNull(result); assertEquals(false, s.getHeld()); } @Test public void testDoGetList() throws JsonException { JsonNode result; result = service.doGetList(JsonSignalHead.SIGNAL_HEAD, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 0)); validate(result); assertEquals(0, result.size()); jmri.InstanceManager.getDefault(jmri.SignalHeadManager.class).register(new jmri.implementation.VirtualSignalHead("IH1","Head 1")); jmri.InstanceManager.getDefault(jmri.SignalHeadManager.class).register(new jmri.implementation.VirtualSignalHead("IH2","Head 2")); result = service.doGetList(JsonSignalHead.SIGNAL_HEAD, NullNode.getInstance(), 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 JsonSignalHeadHttpService(mapper); JUnitUtil.initInternalSignalHeadManager(); JUnitUtil.initDebugThrottleManager(); } @AfterEach @Override public void tearDown() throws Exception { super.tearDown(); } }