616 lines
32 KiB
Java
616 lines
32 KiB
Java
package jmri.jmrit.logixng.actions;
|
|
|
|
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 static org.junit.jupiter.api.Assertions.fail;
|
|
|
|
import static jmri.configurexml.StoreAndCompare.checkFile;
|
|
|
|
import java.io.*;
|
|
import java.net.*;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.ArrayList;
|
|
|
|
import javax.net.ssl.HttpsURLConnection;
|
|
|
|
import jmri.*;
|
|
import jmri.configurexml.LoadAndStorePreferences;
|
|
import jmri.configurexml.ShutdownPreferences;
|
|
import jmri.jmrit.logixng.*;
|
|
import jmri.jmrit.logixng.expressions.ExpressionTurnout;
|
|
import jmri.jmrit.logixng.expressions.ExpressionLight;
|
|
import jmri.jmrit.logixng.implementation.DefaultConditionalNGScaffold;
|
|
import jmri.jmrit.logixng.util.LineEnding;
|
|
import jmri.jmrit.logixng.util.parser.ParserException;
|
|
import jmri.util.*;
|
|
|
|
import org.junit.jupiter.api.*;
|
|
|
|
/**
|
|
* Test WebRequest
|
|
*
|
|
* @author Daniel Bergqvist 2023
|
|
*/
|
|
public class WebRequestTest extends AbstractDigitalActionTestBase {
|
|
|
|
private static final String JMRI_ORG_URL = "https://www.jmri.org/";
|
|
|
|
private static final String WEB_REQUEST_URL =
|
|
"https://www.jmri.org/help/en/html/tools/logixng/reference/WebRequestExample/LogixNG_WebRequest_Test.php";
|
|
|
|
private LogixNG _logixNG;
|
|
private ConditionalNG _conditionalNG;
|
|
private GlobalVariable _responseCodeVariable;
|
|
private GlobalVariable _replyVariable;
|
|
private GlobalVariable _cookiesVariable;
|
|
|
|
|
|
private static boolean tryAccessJmriOrg() {
|
|
try {
|
|
URL url = new URI(JMRI_ORG_URL).toURL();
|
|
HttpURLConnection con = (HttpsURLConnection) url.openConnection();
|
|
con.setRequestMethod("GET");
|
|
con.setRequestProperty("User-Agent", WebRequest.DEFAULT_USER_AGENT);
|
|
|
|
// If the HTTPS request has response code HTTP 200 OK, assume we can
|
|
// access the test script on the JMRI web server.
|
|
return con.getResponseCode() == 200;
|
|
} catch (UnknownHostException | java.net.SocketException e) {
|
|
// We couldn't access the web site
|
|
log.warn("Unable to connect to {} {}",JMRI_ORG_URL,e.getMessage());
|
|
} catch (IOException | URISyntaxException e) {
|
|
fail("Exception thrown", e);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public ConditionalNG getConditionalNG() {
|
|
return _conditionalNG;
|
|
}
|
|
|
|
@Override
|
|
public LogixNG getLogixNG() {
|
|
return _logixNG;
|
|
}
|
|
|
|
@Override
|
|
public MaleSocket getConnectableChild() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public String getExpectedPrintedTree() {
|
|
return String.format(
|
|
"Web request for %s ::: Use default%n" +
|
|
" ! Execute%n" +
|
|
" Many ::: Use default%n" +
|
|
" ! A1%n" +
|
|
" Log local variables ::: Use default%n" +
|
|
" ! A2%n" +
|
|
" Socket not connected%n",
|
|
WEB_REQUEST_URL);
|
|
}
|
|
|
|
@Override
|
|
public String getExpectedPrintedTreeFromRoot() {
|
|
return String.format(
|
|
"LogixNG: A logixNG%n" +
|
|
" ConditionalNG: Throw turnouts%n" +
|
|
" ! A%n" +
|
|
" For each value, set variable \"bean\" and execute action A. Values from Turnouts ::: Use default%n" +
|
|
" ::: Local variable \"bean\", init to None \"null\"%n" +
|
|
" ::: Local variable \"turnout\", init to None \"null\"%n" +
|
|
" ! A%n" +
|
|
" Listen on the bean in the local variable \"bean\" of type Turnout ::: Use default%n" +
|
|
" ! Execute%n" +
|
|
" If Then Else. Always execute ::: Use default%n" +
|
|
" ? If%n" +
|
|
" Turnout by local variable \"turnout\" is Thrown ::: Use default%n" +
|
|
" ! Then%n" +
|
|
" Web request for %s ::: Use default%n" +
|
|
" ! Execute%n" +
|
|
" Many ::: Use default%n" +
|
|
" ! A1%n" +
|
|
" Log local variables ::: Use default%n" +
|
|
" ! A2%n" +
|
|
" Socket not connected%n" +
|
|
" ! Else%n" +
|
|
" Socket not connected%n" +
|
|
" ConditionalNG: Test cookies%n" +
|
|
" ! A%n" +
|
|
" For each value, set variable \"bean\" and execute action A. Values from Sensors ::: Use default%n" +
|
|
" ::: Local variable \"bean\", init to None \"null\"%n" +
|
|
" ::: Local variable \"sensor\", init to None \"null\"%n" +
|
|
" ! A%n" +
|
|
" Listen on the bean in the local variable \"bean\" of type Sensor ::: Use default%n" +
|
|
" ! Execute%n" +
|
|
" Web request for %s ::: Use default%n" +
|
|
" ! Execute%n" +
|
|
" Many ::: Use default%n" +
|
|
" ! A1%n" +
|
|
" Log local variables ::: Use default%n" +
|
|
" ! A2%n" +
|
|
" Socket not connected%n" +
|
|
" ConditionalNG: Test post request%n" +
|
|
" ! A%n" +
|
|
" If Then Else. Execute on change ::: Use default%n" +
|
|
" ? If%n" +
|
|
" Light TestPostRequestLight is On ::: Use default%n" +
|
|
" ! Then%n" +
|
|
" Web request for %s ::: Use default%n" +
|
|
" ! Execute%n" +
|
|
" Many ::: Use default%n" +
|
|
" ! A1%n" +
|
|
" Log local variables ::: Use default%n" +
|
|
" ! A2%n" +
|
|
" Socket not connected%n" +
|
|
" ! Else%n" +
|
|
" Socket not connected%n",
|
|
WEB_REQUEST_URL,
|
|
WEB_REQUEST_URL,
|
|
WEB_REQUEST_URL,
|
|
WEB_REQUEST_URL);
|
|
}
|
|
|
|
@Override
|
|
public NamedBean createNewBean(String systemName) {
|
|
return new WebRequest(systemName, null);
|
|
}
|
|
|
|
@Override
|
|
public boolean addNewSocket() {
|
|
return false;
|
|
}
|
|
|
|
@Test
|
|
public void testThrowTurnouts() throws JmriException {
|
|
Assumptions.assumeTrue( WebRequestTest.tryAccessJmriOrg(), "We can access " + JMRI_ORG_URL);
|
|
|
|
_responseCodeVariable.setValue(null);
|
|
_replyVariable.setValue(null);
|
|
Turnout miamiWest = InstanceManager.getDefault(TurnoutManager.class).getByUserName("MiamiWest");
|
|
assertNotNull(miamiWest);
|
|
miamiWest.setState(Turnout.THROWN);
|
|
assertEquals(200, (int)_responseCodeVariable.getValue());
|
|
assertEquals("Turnout MiamiWest is thrown", _replyVariable.getValue());
|
|
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: turnout, Value: MiamiWest");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: bean, Value: TorontoFirst");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: responseCode, value: 200");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: reply, value: Turnout MiamiWest is thrown");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: cookies, value: null");
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables done");
|
|
|
|
_responseCodeVariable.setValue(null);
|
|
_replyVariable.setValue(null);
|
|
Turnout chicago32 = InstanceManager.getDefault(TurnoutManager.class).getByUserName("Chicago32");
|
|
assertNotNull(chicago32);
|
|
chicago32.setState(Turnout.THROWN);
|
|
assertEquals(200, (int)_responseCodeVariable.getValue());
|
|
assertEquals("Turnout Chicago32 is thrown", _replyVariable.getValue());
|
|
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: turnout, Value: Chicago32");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: bean, Value: TorontoFirst");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: responseCode, value: 200");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: reply, value: Turnout Chicago32 is thrown");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: cookies, value: null");
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables done");
|
|
|
|
_responseCodeVariable.setValue(null);
|
|
_replyVariable.setValue(null);
|
|
|
|
Turnout torontoFirst = InstanceManager.getDefault(TurnoutManager.class).getByUserName("TorontoFirst");
|
|
assertNotNull(torontoFirst);
|
|
torontoFirst.setState(Turnout.THROWN);
|
|
assertEquals(200, (int)_responseCodeVariable.getValue());
|
|
assertEquals("Turnout TorontoFirst is thrown", _replyVariable.getValue());
|
|
|
|
// Suppress instead of assert these messages since they will not be there if the JMRI web server is down
|
|
JUnitAppender.suppressWarnMessageStartsWith("Log local variables:");
|
|
JUnitAppender.suppressWarnMessageStartsWith("Name: turnout, Value: TorontoFirst");
|
|
JUnitAppender.suppressWarnMessageStartsWith("Name: bean, Value: TorontoFirst");
|
|
JUnitAppender.suppressWarnMessageStartsWith("Global variables:");
|
|
JUnitAppender.suppressWarnMessageStartsWith("Global Name: responseCode, value: 200");
|
|
JUnitAppender.suppressWarnMessageStartsWith("Global Name: reply, value: Turnout TorontoFirst is thrown");
|
|
JUnitAppender.suppressWarnMessageStartsWith("Global Name: cookies, value: null");
|
|
JUnitAppender.suppressWarnMessageStartsWith("Log local variables done");
|
|
}
|
|
|
|
private void setupThrowTurnoutsConditionalNG() throws SocketAlreadyConnectedException, ParserException {
|
|
InstanceManager.getDefault(TurnoutManager.class).newTurnout("IT1", "Chicago32");
|
|
InstanceManager.getDefault(TurnoutManager.class).newTurnout("IT2", "MiamiWest");
|
|
InstanceManager.getDefault(TurnoutManager.class).newTurnout("IT3", "TorontoFirst");
|
|
|
|
_conditionalNG = new DefaultConditionalNGScaffold("IQC1", "Throw turnouts"); // NOI18N;
|
|
InstanceManager.getDefault(ConditionalNG_Manager.class).register(_conditionalNG);
|
|
_logixNG.addConditionalNG(_conditionalNG);
|
|
_conditionalNG.setRunDelayed(false);
|
|
_conditionalNG.setEnabled(true);
|
|
|
|
ForEach forEach = new ForEach("IQDA101", null);
|
|
forEach.setLocalVariableName("bean");
|
|
forEach.setUseCommonSource(true);
|
|
forEach.setCommonManager(CommonManager.Turnouts);
|
|
MaleSocket maleSocket =
|
|
InstanceManager.getDefault(DigitalActionManager.class).registerAction(forEach);
|
|
maleSocket.addLocalVariable("bean", SymbolTable.InitialValueType.None, null);
|
|
maleSocket.addLocalVariable("turnout", SymbolTable.InitialValueType.None, null);
|
|
_conditionalNG.getChild(0).connect(maleSocket);
|
|
|
|
ActionListenOnBeansLocalVariable listenOnBeans = new ActionListenOnBeansLocalVariable("IQDA102", null);
|
|
listenOnBeans.setNamedBeanType(NamedBeanType.Turnout);
|
|
listenOnBeans.setLocalVariableBeanToListenOn("bean");
|
|
listenOnBeans.setLocalVariableNamedBean("turnout");
|
|
maleSocket =
|
|
InstanceManager.getDefault(DigitalActionManager.class).registerAction(listenOnBeans);
|
|
forEach.getChild(0).connect(maleSocket);
|
|
|
|
IfThenElse ifThenElse = new IfThenElse("IQDA103", null);
|
|
ifThenElse.setExecuteType(IfThenElse.ExecuteType.AlwaysExecute);
|
|
maleSocket =
|
|
InstanceManager.getDefault(DigitalActionManager.class).registerAction(ifThenElse);
|
|
listenOnBeans.getChild(0).connect(maleSocket);
|
|
|
|
ExpressionTurnout expressionTurnout = new ExpressionTurnout("IQDE104", null);
|
|
expressionTurnout.getSelectNamedBean().setAddressing(NamedBeanAddressing.LocalVariable);
|
|
expressionTurnout.getSelectNamedBean().setLocalVariable("turnout");
|
|
expressionTurnout.set_Is_IsNot(Is_IsNot_Enum.Is);
|
|
expressionTurnout.setStateAddressing(NamedBeanAddressing.Direct);
|
|
expressionTurnout.setBeanState(ExpressionTurnout.TurnoutState.Thrown);
|
|
maleSocket =
|
|
InstanceManager.getDefault(DigitalExpressionManager.class).registerExpression(expressionTurnout);
|
|
ifThenElse.getChild(0).connect(maleSocket);
|
|
|
|
WebRequest webRequest = new WebRequest("IQDA105", null);
|
|
webRequest.getSelectUrl().setValue(WEB_REQUEST_URL);
|
|
webRequest.getSelectRequestMethod().setEnum(WebRequest.RequestMethodType.Get);
|
|
webRequest.getParameters().add(new WebRequest.Parameter("action", SymbolTable.InitialValueType.String, "throw"));
|
|
webRequest.getParameters().add(new WebRequest.Parameter("turnout", SymbolTable.InitialValueType.LocalVariable, "turnout"));
|
|
webRequest.setLocalVariableForResponseCode("responseCode");
|
|
webRequest.setLocalVariableForReplyContent("reply");
|
|
webRequest.getSelectReplyType().setEnum(WebRequest.ReplyType.String);
|
|
// webRequest.getSelectLineEnding().setEnum(LineEnding.MacLinuxLf);
|
|
webRequest.getSelectLineEnding().setEnum(LineEnding.Space);
|
|
maleSocket = InstanceManager.getDefault(DigitalActionManager.class).registerAction(webRequest);
|
|
ifThenElse.getChild(1).connect(maleSocket);
|
|
// These are used by super class for its testing
|
|
_base = webRequest;
|
|
_baseMaleSocket = maleSocket;
|
|
|
|
DigitalMany many = new DigitalMany("IQDA106", null);
|
|
maleSocket =
|
|
InstanceManager.getDefault(DigitalActionManager.class).registerAction(many);
|
|
webRequest.getChild(0).connect(maleSocket);
|
|
|
|
LogLocalVariables logLocal = new LogLocalVariables("IQDA107", null);
|
|
maleSocket = InstanceManager.getDefault(DigitalActionManager.class).registerAction(logLocal);
|
|
many.getChild(0).connect(maleSocket);
|
|
}
|
|
|
|
@Test
|
|
public void testCookies() throws JmriException {
|
|
Assumptions.assumeTrue( WebRequestTest.tryAccessJmriOrg(), "We can access " + JMRI_ORG_URL);
|
|
|
|
_responseCodeVariable.setValue(null);
|
|
_replyVariable.setValue(null);
|
|
_cookiesVariable.setValue(null);
|
|
Sensor green = InstanceManager.getDefault(SensorManager.class).getByUserName("Green");
|
|
assertNotNull(green);
|
|
green.setState(Sensor.ACTIVE);
|
|
assertEquals(200, (int)_responseCodeVariable.getValue());
|
|
assertEquals("Cookie Green is set. Cookies from client: ", _replyVariable.getValue());
|
|
String cookies = _cookiesVariable.getValue().toString();
|
|
cookies = cookies.replaceAll("expires=\\w\\w\\w, \\d\\d.\\w\\w\\w.\\d\\d\\d\\d \\d\\d:\\d\\d:\\d\\d", "expires=???, ??-???-???? ??:??:??");
|
|
assertEquals("{Green=Green=GreenGreen%21; expires=???, ??-???-???? ??:??:?? GMT; Max-Age=1296000}", cookies);
|
|
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: sensor, Value: Green");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: bean, Value: ISCLOCKRUNNING");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: responseCode, value: 200");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: reply, value: Cookie Green is set. Cookies from client:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: cookies, value: {Green=Green=GreenGreen%21; expires=");
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables done");
|
|
|
|
_responseCodeVariable.setValue(null);
|
|
_replyVariable.setValue(null);
|
|
Sensor yellow = InstanceManager.getDefault(SensorManager.class).getByUserName("Yellow");
|
|
assertNotNull(yellow);
|
|
yellow.setState(Sensor.ACTIVE);
|
|
assertEquals(200, (int)_responseCodeVariable.getValue());
|
|
assertEquals("Cookie Yellow is set. Cookies from client: Green=GreenGreen!", _replyVariable.getValue());
|
|
cookies = _cookiesVariable.getValue().toString();
|
|
cookies = cookies.replaceAll("expires=\\w\\w\\w, \\d\\d.\\w\\w\\w.\\d\\d\\d\\d \\d\\d:\\d\\d:\\d\\d", "expires=???, ??-???-???? ??:??:??");
|
|
assertEquals("{Yellow=Yellow=YellowYellow%21; expires=???, ??-???-???? ??:??:?? GMT; Max-Age=1296000, Green=Green=GreenGreen%21; expires=???, ??-???-???? ??:??:?? GMT; Max-Age=1296000}", cookies);
|
|
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: sensor, Value: Yellow");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: bean, Value: ISCLOCKRUNNING");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: responseCode, value: 200");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: reply, value: Cookie Yellow is set. Cookies from client:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: cookies, value: {Yellow=Yellow=YellowYellow%21; expires=");
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables done");
|
|
|
|
_responseCodeVariable.setValue(null);
|
|
_replyVariable.setValue(null);
|
|
Sensor blue = InstanceManager.getDefault(SensorManager.class).getByUserName("Blue");
|
|
assertNotNull(blue);
|
|
blue.setState(Sensor.ACTIVE);
|
|
assertEquals(200, (int)_responseCodeVariable.getValue());
|
|
assertEquals("Cookie Blue is set. Cookies from client: Yellow=YellowYellow!, Green=GreenGreen!", _replyVariable.getValue());
|
|
cookies = _cookiesVariable.getValue().toString();
|
|
cookies = cookies.replaceAll("expires=\\w\\w\\w, \\d\\d.\\w\\w\\w.\\d\\d\\d\\d \\d\\d:\\d\\d:\\d\\d", "expires=???, ??-???-???? ??:??:??");
|
|
assertEquals("{Yellow=Yellow=YellowYellow%21; expires=???, ??-???-???? ??:??:?? GMT; Max-Age=1296000, Blue=Blue=BlueBlue%21; expires=???, ??-???-???? ??:??:?? GMT; Max-Age=1296000, Green=Green=GreenGreen%21; expires=???, ??-???-???? ??:??:?? GMT; Max-Age=1296000}", cookies);
|
|
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: sensor, Value: Blue");
|
|
JUnitAppender.assertWarnMessageStartsWith("Name: bean, Value: ISCLOCKRUNNING");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: responseCode, value: 200");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: reply, value: Cookie Blue is set. Cookies from client:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: cookies, value: {Yellow=Yellow=YellowYellow%21; expires=");
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables done");
|
|
|
|
}
|
|
|
|
private void setupCookiesConditionalNG() throws SocketAlreadyConnectedException, ParserException {
|
|
|
|
_cookiesVariable = InstanceManager.getDefault(GlobalVariableManager.class).createGlobalVariable("cookies");
|
|
|
|
InstanceManager.getDefault(SensorManager.class).newSensor("IS1", "Blue");
|
|
InstanceManager.getDefault(SensorManager.class).newSensor("IS2", "Green");
|
|
InstanceManager.getDefault(SensorManager.class).newSensor("IS3", "Yellow");
|
|
|
|
_conditionalNG = new DefaultConditionalNGScaffold("IQC2", "Test cookies"); // NOI18N;
|
|
InstanceManager.getDefault(ConditionalNG_Manager.class).register(_conditionalNG);
|
|
_logixNG.addConditionalNG(_conditionalNG);
|
|
_conditionalNG.setRunDelayed(false);
|
|
_conditionalNG.setEnabled(true);
|
|
|
|
ForEach forEach = new ForEach("IQDA201", null);
|
|
forEach.setLocalVariableName("bean");
|
|
forEach.setUseCommonSource(true);
|
|
forEach.setCommonManager(CommonManager.Sensors);
|
|
MaleSocket maleSocket =
|
|
InstanceManager.getDefault(DigitalActionManager.class).registerAction(forEach);
|
|
maleSocket.addLocalVariable("bean", SymbolTable.InitialValueType.None, null);
|
|
maleSocket.addLocalVariable("sensor", SymbolTable.InitialValueType.None, null);
|
|
_conditionalNG.getChild(0).connect(maleSocket);
|
|
|
|
ActionListenOnBeansLocalVariable listenOnBeans = new ActionListenOnBeansLocalVariable("IQDA202", null);
|
|
listenOnBeans.setNamedBeanType(NamedBeanType.Sensor);
|
|
listenOnBeans.setLocalVariableBeanToListenOn("bean");
|
|
listenOnBeans.setLocalVariableNamedBean("sensor");
|
|
maleSocket =
|
|
InstanceManager.getDefault(DigitalActionManager.class).registerAction(listenOnBeans);
|
|
forEach.getChild(0).connect(maleSocket);
|
|
|
|
WebRequest webRequest = new WebRequest("IQDA203", null);
|
|
webRequest.getSelectUrl().setValue(WEB_REQUEST_URL);
|
|
webRequest.getSelectRequestMethod().setEnum(WebRequest.RequestMethodType.Get);
|
|
webRequest.getParameters().add(new WebRequest.Parameter("action", SymbolTable.InitialValueType.String, "cookies"));
|
|
webRequest.getParameters().add(new WebRequest.Parameter("cookie", SymbolTable.InitialValueType.LocalVariable, "sensor"));
|
|
webRequest.setLocalVariableForResponseCode("responseCode");
|
|
webRequest.setLocalVariableForReplyContent("reply");
|
|
webRequest.setLocalVariableForCookies("cookies");
|
|
webRequest.getSelectReplyType().setEnum(WebRequest.ReplyType.String);
|
|
// webRequest.getSelectLineEnding().setEnum(LineEnding.MacLinuxLf);
|
|
webRequest.getSelectLineEnding().setEnum(LineEnding.Space);
|
|
maleSocket = InstanceManager.getDefault(DigitalActionManager.class).registerAction(webRequest);
|
|
listenOnBeans.getChild(0).connect(maleSocket);
|
|
// These are used by super class for its testing
|
|
_base = webRequest;
|
|
_baseMaleSocket = maleSocket;
|
|
|
|
DigitalMany many = new DigitalMany("IQDA204", null);
|
|
maleSocket =
|
|
InstanceManager.getDefault(DigitalActionManager.class).registerAction(many);
|
|
webRequest.getChild(0).connect(maleSocket);
|
|
|
|
LogLocalVariables logLocal = new LogLocalVariables("IQDA205", null);
|
|
maleSocket = InstanceManager.getDefault(DigitalActionManager.class).registerAction(logLocal);
|
|
many.getChild(0).connect(maleSocket);
|
|
}
|
|
|
|
@Test
|
|
public void testPostRequest() throws JmriException {
|
|
Assumptions.assumeTrue( WebRequestTest.tryAccessJmriOrg(), "We can access " + JMRI_ORG_URL);
|
|
_responseCodeVariable.setValue(null);
|
|
_replyVariable.setValue(null);
|
|
|
|
Light l = InstanceManager.getDefault(LightManager.class).getByUserName("TestPostRequestLight");
|
|
assertNotNull(l);
|
|
l.setState(Light.ON);
|
|
assertEquals(200, (int)_responseCodeVariable.getValue());
|
|
assertEquals("Logged in. First name: Green, last name: Tomato", _replyVariable.getValue());
|
|
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global variables:");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: responseCode, value: 200");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: reply, value: Logged in. First name: Green, last name: Tomato");
|
|
JUnitAppender.assertWarnMessageStartsWith("Global Name: cookies, value: null");
|
|
JUnitAppender.assertWarnMessageStartsWith("Log local variables done");
|
|
|
|
}
|
|
|
|
private void setupPostRequestConditionalNG() throws SocketAlreadyConnectedException, ParserException {
|
|
|
|
Light testPostRequestLight = InstanceManager.getDefault(LightManager.class).newLight("IL1", "TestPostRequestLight");
|
|
|
|
_conditionalNG = new DefaultConditionalNGScaffold("IQC3", "Test post request"); // NOI18N;
|
|
InstanceManager.getDefault(ConditionalNG_Manager.class).register(_conditionalNG);
|
|
_logixNG.addConditionalNG(_conditionalNG);
|
|
_conditionalNG.setRunDelayed(false);
|
|
_conditionalNG.setEnabled(true);
|
|
|
|
IfThenElse ifThenElse = new IfThenElse("IQDA301", null);
|
|
MaleSocket maleSocket =
|
|
InstanceManager.getDefault(DigitalActionManager.class).registerAction(ifThenElse);
|
|
_conditionalNG.getChild(0).connect(maleSocket);
|
|
|
|
ExpressionLight expressionLight = new ExpressionLight("IQDE301", null);
|
|
expressionLight.getSelectNamedBean().setNamedBean(testPostRequestLight);
|
|
expressionLight.set_Is_IsNot(Is_IsNot_Enum.Is);
|
|
expressionLight.setStateAddressing(NamedBeanAddressing.Direct);
|
|
expressionLight.setBeanState(ExpressionLight.LightState.On);
|
|
maleSocket =
|
|
InstanceManager.getDefault(DigitalExpressionManager.class).registerExpression(expressionLight);
|
|
ifThenElse.getChild(0).connect(maleSocket);
|
|
|
|
WebRequest webRequest = new WebRequest("IQDA302", null);
|
|
webRequest.getSelectUrl().setValue(WEB_REQUEST_URL);
|
|
webRequest.getSelectRequestMethod().setEnum(WebRequest.RequestMethodType.Post);
|
|
webRequest.getParameters().add(new WebRequest.Parameter("action", SymbolTable.InitialValueType.String, "login"));
|
|
webRequest.getParameters().add(new WebRequest.Parameter("fname", SymbolTable.InitialValueType.String, "Green"));
|
|
webRequest.getParameters().add(new WebRequest.Parameter("lname", SymbolTable.InitialValueType.String, "Tomato"));
|
|
webRequest.setLocalVariableForResponseCode("responseCode");
|
|
webRequest.setLocalVariableForReplyContent("reply");
|
|
webRequest.getSelectReplyType().setEnum(WebRequest.ReplyType.String);
|
|
// webRequest.getSelectLineEnding().setEnum(LineEnding.MacLinuxLf);
|
|
webRequest.getSelectLineEnding().setEnum(LineEnding.Space);
|
|
maleSocket = InstanceManager.getDefault(DigitalActionManager.class).registerAction(webRequest);
|
|
ifThenElse.getChild(1).connect(maleSocket);
|
|
// These are used by super class for its testing
|
|
_base = webRequest;
|
|
_baseMaleSocket = maleSocket;
|
|
|
|
DigitalMany many = new DigitalMany("IQDA303", null);
|
|
maleSocket =
|
|
InstanceManager.getDefault(DigitalActionManager.class).registerAction(many);
|
|
webRequest.getChild(0).connect(maleSocket);
|
|
|
|
LogLocalVariables logLocal = new LogLocalVariables(InstanceManager.getDefault(DigitalActionManager.class).getAutoSystemName(), null);
|
|
maleSocket = InstanceManager.getDefault(DigitalActionManager.class).registerAction(logLocal);
|
|
many.getChild(0).connect(maleSocket);
|
|
}
|
|
|
|
@Test
|
|
public void testStoreFile() throws Exception {
|
|
// Ensure the fast clock is started at a specified time so it doesn't vary.
|
|
// Otherwise the WebRequest.xml will be changed on every run.
|
|
Timebase clock = InstanceManager.getDefault(jmri.Timebase.class);
|
|
clock.setStartSetTime(false, new java.util.Date(0));
|
|
|
|
// This test only updates the xml file in the LogixNG documentation
|
|
storeXmlFile();
|
|
}
|
|
|
|
|
|
private void storeXmlFile() throws Exception {
|
|
|
|
jmri.ConfigureManager cm = InstanceManager.getNullableDefault(jmri.ConfigureManager.class);
|
|
assertNotNull( cm, "Unable to get default configure manager");
|
|
|
|
FileUtil.createDirectory(FileUtil.getUserFilesPath() + "temp");
|
|
File firstFile = new File(FileUtil.getUserFilesPath() + "temp/" + "WebRequest_temp.xml");
|
|
File secondFile = new File(FileUtil.getUserFilesPath() + "temp/" + "WebRequest.xml");
|
|
log.info("Temporary first file: {}", firstFile.getAbsoluteFile());
|
|
log.info("Temporary second file: {}", secondFile.getAbsoluteFile());
|
|
// System.out.format("Temporary first file: %s%n", firstFile.getAbsoluteFile());
|
|
// System.out.format("Temporary second file: %s%n", secondFile.getAbsoluteFile());
|
|
|
|
assertTrue(cm.storeUser(firstFile), "Failed to store panel");
|
|
|
|
// Add the header comment to the xml file
|
|
addHeader(firstFile, secondFile);
|
|
|
|
boolean dataHasChanged = true;
|
|
|
|
File fileInDocumentationFolder =
|
|
new File(FileUtil.getProgramPath() + "help/en/html/tools/logixng/reference/WebRequestExample/" + "WebRequest.xml");
|
|
|
|
try {
|
|
// Ignore Timebase changes
|
|
InstanceManager.getDefault(ShutdownPreferences.class).setIgnoreTimebase(true);
|
|
// Note: The comparision is made with the first xml file that doesn't have the header comment.
|
|
dataHasChanged = checkFile(fileInDocumentationFolder, firstFile);
|
|
} catch (FileNotFoundException e) {
|
|
// Ignore this. If this happens, just copy the new file to the documentation folder
|
|
System.out.format("File not found!!! %s%n", e.getMessage());
|
|
}
|
|
|
|
if (dataHasChanged) {
|
|
java.nio.file.Files.copy(secondFile.toPath(), fileInDocumentationFolder.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
|
|
// System.out.format("File copied from %s to %s%n", secondFile, fileInDocumentationFolder);
|
|
}
|
|
|
|
// System.out.format("File compare %s with %s resulted in: %b%n", fileInDocumentationFolder, secondFile, dataHasChanged);
|
|
}
|
|
|
|
|
|
private void addHeader(File inFile, File outFile) throws IOException {
|
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inFile), StandardCharsets.UTF_8));
|
|
PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8)))) {
|
|
|
|
String line = reader.readLine();
|
|
writer.println(line);
|
|
|
|
writer.println("<!--");
|
|
writer.println("*****************************************************************************");
|
|
writer.println();
|
|
writer.println("DO NOT EDIT THIS FILE!!!");
|
|
writer.println();
|
|
writer.println("This file is created by jmri.jmrit.logixng.actions.WebRequestTest");
|
|
writer.println();
|
|
writer.println("******************************************************************************");
|
|
writer.println("-->");
|
|
|
|
while ((line = reader.readLine()) != null) {
|
|
writer.println(line);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@BeforeEach
|
|
public void setUp() throws SocketAlreadyConnectedException, ParserException, IOException {
|
|
JUnitUtil.setUp();
|
|
JUnitUtil.resetInstanceManager();
|
|
JUnitUtil.resetProfileManager();
|
|
JUnitUtil.initConfigureManager();
|
|
JUnitUtil.initInternalSensorManager();
|
|
JUnitUtil.initInternalLightManager();
|
|
JUnitUtil.initLogixNGManager();
|
|
jmri.jmrit.logixng.NamedBeanType.reset();
|
|
|
|
// Exclude dynamic content in the tables and panels file
|
|
var loadAndStorePreferences = InstanceManager.getDefault(LoadAndStorePreferences.class);
|
|
loadAndStorePreferences.setExcludeMemoryIMCURRENTTIME(true);
|
|
loadAndStorePreferences.setExcludeJmriVersion(true);
|
|
loadAndStorePreferences.setExcludeFileHistory(true);
|
|
|
|
_category = LogixNG_Category.ITEM;
|
|
_isExternal = true;
|
|
|
|
_logixNG = InstanceManager.getDefault(LogixNG_Manager.class).createLogixNG("A logixNG");
|
|
|
|
_responseCodeVariable = InstanceManager.getDefault(GlobalVariableManager.class).createGlobalVariable("responseCode");
|
|
_replyVariable = InstanceManager.getDefault(GlobalVariableManager.class).createGlobalVariable("reply");
|
|
|
|
setupThrowTurnoutsConditionalNG();
|
|
setupCookiesConditionalNG();
|
|
setupPostRequestConditionalNG();
|
|
|
|
assertTrue( _logixNG.setParentForAllChildren(new ArrayList<>()));
|
|
_logixNG.activate();
|
|
_logixNG.setEnabled(true);
|
|
}
|
|
|
|
@AfterEach
|
|
public void tearDown() {
|
|
JUnitUtil.deregisterBlockManagerShutdownTask();
|
|
jmri.jmrit.logixng.util.LogixNG_Thread.stopAllLogixNGThreads();
|
|
JUnitUtil.tearDown();
|
|
}
|
|
|
|
|
|
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(WebRequestTest.class);
|
|
}
|