You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/10/27 18:01:03 UTC

[plc4x] branch feature/plc4go updated (ac2dd33 -> d2519e5)

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a change to branch feature/plc4go
in repository https://gitbox.apache.org/repos/asf/plc4x.git.


    from ac2dd33  - Fixed some small typos
     new d46b69d  - Made the Java IO code also accept String types as parser-arguments
     new d2519e5  - Implemented a first Modbus Integration-Test - Extended the testsuite-runner to support tests with parser-arguments

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../main/resources/templates/java/io-template.ftlh | 12 ++-
 .../apache/plc4x/java/modbus/ModbusDriverIT.java}  |  8 +-
 .../plc4x/test/driver/DriverTestsuiteRunner.java   | 29 +++++--
 .../apache/plc4x/test/driver/model/TestStep.java   | 10 ++-
 .../resources/protocols/modbus/DriverTestsuite.xml | 97 ++++++++++++++++++++++
 5 files changed, 140 insertions(+), 16 deletions(-)
 copy plc4j/drivers/{ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDriverIT.java => modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusDriverIT.java} (81%)
 create mode 100644 protocols/modbus/src/test/resources/protocols/modbus/DriverTestsuite.xml


[plc4x] 01/02: - Made the Java IO code also accept String types as parser-arguments

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch feature/plc4go
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit d46b69d758ccca600c8785a24266e39df7ea82e7
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Oct 27 18:57:30 2020 +0100

    - Made the Java IO code also accept String types as parser-arguments
---
 .../src/main/resources/templates/java/io-template.ftlh       | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
index a29c531..7183173 100644
--- a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
@@ -95,10 +95,16 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
             throw new PlcRuntimeException("Wrong number of arguments, expected ${type.parserArguments?size}, but got " + args.length);
         }
         <#list type.parserArguments as parserArgument>
-        if(!(args[${parserArgument?index}] instanceof ${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)})) {
-            throw new PlcRuntimeException("Argument ${parserArgument?index} expected to be of type ${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} but was " + args[${parserArgument?index}].getClass().getName());
+        ${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} ${parserArgument.name};
+        if(args[${parserArgument?index}] instanceof ${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)}) {
+            ${parserArgument.name} = (${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)}) args[${parserArgument?index}];
+            <#if helper.isSimpleTypeReference(parserArgument.type)>
+        } else if (args[${parserArgument?index}] instanceof String) {
+            ${parserArgument.name} = ${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)}.valueOf((String) args[${parserArgument?index}]);
+            </#if>
+        } else {
+            throw new PlcRuntimeException("Argument ${parserArgument?index} expected to be of type ${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} or a string which is parseable but was " + args[${parserArgument?index}].getClass().getName());
         }
-        ${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} ${parserArgument.name} = (${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)}) args[${parserArgument?index}];
         </#list>
         </#if>
         return ${type.name}IO.staticParse(io<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>);


[plc4x] 02/02: - Implemented a first Modbus Integration-Test - Extended the testsuite-runner to support tests with parser-arguments

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch feature/plc4go
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit d2519e5d2a557fb27bf3784ac5684e87465ae4a1
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Oct 27 19:00:50 2020 +0100

    - Implemented a first Modbus Integration-Test
    - Extended the testsuite-runner to support tests with parser-arguments
---
 .../apache/plc4x/java/modbus/ModbusDriverIT.java}  | 28 ++-----
 .../plc4x/test/driver/DriverTestsuiteRunner.java   | 29 +++++--
 .../apache/plc4x/test/driver/model/TestStep.java   | 10 ++-
 .../resources/protocols/modbus/DriverTestsuite.xml | 97 ++++++++++++++++++++++
 4 files changed, 132 insertions(+), 32 deletions(-)

diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/model/TestStep.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusDriverIT.java
similarity index 59%
copy from plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/model/TestStep.java
copy to plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusDriverIT.java
index 0a44522..ec2052c 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/model/TestStep.java
+++ b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusDriverIT.java
@@ -16,32 +16,14 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.test.driver.model;
+package org.apache.plc4x.java.modbus;
 
-import org.dom4j.Element;
+import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
 
-public class TestStep {
+public class ModbusDriverIT extends DriverTestsuiteRunner {
 
-    private final StepType type;
-    private final String name;
-    private final Element payload;
-
-    public TestStep(StepType type, String name, Element payload) {
-        this.type = type;
-        this.name = name;
-        this.payload = payload;
-    }
-
-    public StepType getType() {
-        return type;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public Element getPayload() {
-        return payload;
+    public ModbusDriverIT() {
+        super("/protocols/modbus/DriverTestsuite.xml");
     }
 
 }
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/DriverTestsuiteRunner.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/DriverTestsuiteRunner.java
index 9f922fd..c47bf77 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/DriverTestsuiteRunner.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/DriverTestsuiteRunner.java
@@ -222,7 +222,7 @@ public class DriverTestsuiteRunner {
                     // Prepare a ByteBuf that contains the data which would have been sent to the PLC.
                     final byte[] data = getOutboundBytes(embeddedChannel);
                     // Validate the data actually matches the expected message.
-                    validateMessage(payload, data, bigEndian);
+                    validateMessage(payload, testStep.getParserArguments(), data, bigEndian);
                     break;
                 }
                 case INCOMING_PLC_BYTES: {
@@ -291,15 +291,28 @@ public class DriverTestsuiteRunner {
         LOGGER.info("    Done");
     }
 
-    private TestStep parseTestStep(Element curElement) {
+    private TestStep parseTestStep(Element curElement) throws DriverTestsuiteException {
         final String elementName = curElement.getName();
         final StepType stepType = StepType.valueOf(elementName.toUpperCase().replace("-", "_"));
         final String stepName = curElement.attributeValue(new QName("name"));
-        Element definition = null;
-        if(curElement.hasMixedContent()) {
-            definition = curElement.elementIterator().next();
+        Element parserArgumentsNode = null;
+        Element definitionNode = null;
+        for (Element element : curElement.elements()) {
+            if(element.getName().equals("parser-arguments")) {
+                parserArgumentsNode = element;
+            } else if (definitionNode == null) {
+                definitionNode = element;
+            } else {
+                throw new DriverTestsuiteException("Error processing the xml. Only one content node allowed.");
+            }
+        }
+        final List<String> parserArguments = new ArrayList<>();
+        if(parserArgumentsNode != null) {
+            for (Element parserArgumentNode : parserArgumentsNode.elements()) {
+                parserArguments.add(parserArgumentNode.getTextTrim());
+            }
         }
-        return new TestStep(stepType, stepName, definition);
+        return new TestStep(stepType, stepName, parserArguments, definitionNode);
     }
 
     private Plc4xEmbeddedChannel getEmbeddedChannel(PlcConnection plcConnection) {
@@ -384,13 +397,13 @@ public class DriverTestsuiteRunner {
         // TODO: Implement this ...
     }
 
-    private void validateMessage(Element referenceXml, byte[] data, boolean bigEndian) throws DriverTestsuiteException {
+    private void validateMessage(Element referenceXml, List<String> parserArguments, byte[] data, boolean bigEndian) throws DriverTestsuiteException {
         final ObjectMapper mapper = new XmlMapper().enableDefaultTyping();
         final ReadBuffer readBuffer = new ReadBuffer(data, !bigEndian);
         try {
             final String className = referenceXml.attributeValue(new QName("className"));
             final MessageIO<?,?> messageIO = getMessageIOType(className).newInstance();
-            final Object parsedOutput = messageIO.parse(readBuffer);
+            final Object parsedOutput = messageIO.parse(readBuffer, parserArguments.toArray(new String[0]));
             final String xmlString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(parsedOutput);
             final String referenceXmlString = referenceXml.asXML();
             final Diff diff = DiffBuilder.compare(referenceXmlString).withTest(xmlString).ignoreComments().ignoreWhitespace().build();
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/model/TestStep.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/model/TestStep.java
index 0a44522..cd8d297 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/model/TestStep.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/model/TestStep.java
@@ -20,15 +20,19 @@ package org.apache.plc4x.test.driver.model;
 
 import org.dom4j.Element;
 
+import java.util.List;
+
 public class TestStep {
 
     private final StepType type;
     private final String name;
+    private final List<String> parserArguments;
     private final Element payload;
 
-    public TestStep(StepType type, String name, Element payload) {
+    public TestStep(StepType type, String name, List<String> parserArguments, Element payload) {
         this.type = type;
         this.name = name;
+        this.parserArguments = parserArguments;
         this.payload = payload;
     }
 
@@ -40,6 +44,10 @@ public class TestStep {
         return name;
     }
 
+    public List<String> getParserArguments() {
+        return parserArguments;
+    }
+
     public Element getPayload() {
         return payload;
     }
diff --git a/protocols/modbus/src/test/resources/protocols/modbus/DriverTestsuite.xml b/protocols/modbus/src/test/resources/protocols/modbus/DriverTestsuite.xml
new file mode 100644
index 0000000..429997d
--- /dev/null
+++ b/protocols/modbus/src/test/resources/protocols/modbus/DriverTestsuite.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<test:driver-testsuite xmlns:test="https://plc4x.apache.org/schemas/driver-testsuite.xsd"
+                       bigEndian="true">
+
+  <name>Modbus</name>
+
+  <driver-name>modbus</driver-name>
+
+  <testcase>
+    <name>Single element read request</name>
+    <steps>
+      <api-request name="Receive Read Request from application">
+        <TestReadRequest className="org.apache.plc4x.test.driver.model.api.TestReadRequest">
+          <fields>
+            <field className="org.apache.plc4x.test.driver.model.api.TestField">
+              <name>hurz</name>
+              <address>holding-register:1:REAL[2]</address>
+            </field>
+          </fields>
+        </TestReadRequest>
+      </api-request>
+      <outgoing-plc-message name="Send Modbus Input-Register Read Request">
+        <parser-arguments>
+          <response>false</response>
+        </parser-arguments>
+        <ModbusTcpADU className="org.apache.plc4x.java.modbus.readwrite.ModbusTcpADU">
+          <transactionIdentifier>10</transactionIdentifier>
+          <unitIdentifier>1</unitIdentifier>
+          <pdu className="org.apache.plc4x.java.modbus.readwrite.ModbusPDUReadHoldingRegistersRequest">
+            <startingAddress>0</startingAddress>
+            <quantity>4</quantity>
+          </pdu>
+        </ModbusTcpADU>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Receive Modbus Input-Register Read Response">
+        <parser-arguments>
+          <response>true</response>
+        </parser-arguments>
+        <ModbusTcpADU className="org.apache.plc4x.java.modbus.readwrite.ModbusTcpADU">
+          <transactionIdentifier>10</transactionIdentifier>
+          <unitIdentifier>1</unitIdentifier>
+          <pdu className="org.apache.plc4x.java.modbus.readwrite.ModbusPDUReadHoldingRegistersResponse">
+            <value>QEkP20BJD9s=</value>
+          </pdu>
+        </ModbusTcpADU>
+      </incoming-plc-message>
+      <api-response name="Report Read Response to application">
+        <DefaultPlcReadResponse className="org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse">
+          <request className="org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest">
+            <hurz className="org.apache.plc4x.java.modbus.field.ModbusFieldHoldingRegister">
+              <address>0</address>
+              <dataType>IEC61131_REAL</dataType>
+              <lengthBytes>8</lengthBytes>
+              <lengthWords>4</lengthWords>
+              <dataTypeSize>4</dataTypeSize>
+            </hurz>
+          </request>
+          <hurz>
+            <code>OK</code>
+            <value className="org.apache.plc4x.java.api.value.PlcList">
+              <object>java.util.Collections..UnmodifiableRandomAccessList</object>
+              <object>org.apache.plc4x.java.api.value.PlcREAL</object>
+              <object>
+                <object>java.lang.Float</object>
+                <object>3.1415927</object>
+              </object>
+              <object>org.apache.plc4x.java.api.value.PlcREAL</object>
+              <object>
+                <object>java.lang.Float</object>
+                <object>3.1415927</object>
+              </object>
+            </value>
+          </hurz>
+        </DefaultPlcReadResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+</test:driver-testsuite>