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

sruehl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/master by this push:
     new 5911a94  added decoding tests for Plc4XADSProtocol
5911a94 is described below

commit 5911a9487f083046acd348a65b89a050c4a01d57
Author: Sebastian Rühl <sru...@apache.org>
AuthorDate: Sat Feb 17 00:21:06 2018 +0100

    added decoding tests for Plc4XADSProtocol
---
 .../java/ads/api/commands/ADSAbstractRequest.java  | 10 +--
 .../java/ads/api/commands/ADSAbstractResponse.java |  6 +-
 .../apache/plc4x/java/ads/ADSPlcDriverTest.java    | 14 ++++
 .../plc4x/java/ads/netty/Plc4XADSProtocolTest.java | 86 ++++++++++++++++++----
 4 files changed, 93 insertions(+), 23 deletions(-)

diff --git 
a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAbstractRequest.java
 
b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAbstractRequest.java
index fe51679..a9572c4 100644
--- 
a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAbstractRequest.java
+++ 
b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAbstractRequest.java
@@ -26,20 +26,20 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort;
 import org.apache.plc4x.java.ads.api.generic.types.Invoke;
 import org.apache.plc4x.java.ads.api.generic.types.State;
 
-abstract class ADSAbstractRequest extends AMSTCPPacket {
-    ADSAbstractRequest(AMSTCPHeader amstcpHeader, AMSHeader amsHeader) {
+public abstract class ADSAbstractRequest extends AMSTCPPacket {
+    protected ADSAbstractRequest(AMSTCPHeader amstcpHeader, AMSHeader 
amsHeader) {
         super(amstcpHeader, amsHeader);
     }
 
-    ADSAbstractRequest(AMSHeader amsHeader) {
+    protected ADSAbstractRequest(AMSHeader amsHeader) {
         super(amsHeader);
     }
 
-    ADSAbstractRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, 
AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId) {
+    protected ADSAbstractRequest(AMSNetId targetAmsNetId, AMSPort 
targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId) 
{
         super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, 
State.DEFAULT, invokeId);
     }
 
-    ADSAbstractRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, 
AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, State stateId, Invoke invokeId) 
{
+    protected ADSAbstractRequest(AMSNetId targetAmsNetId, AMSPort 
targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, State stateId, 
Invoke invokeId) {
         super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, 
stateId, invokeId);
     }
 }
diff --git 
a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAbstractResponse.java
 
b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAbstractResponse.java
index f55e173..dd24b39 100644
--- 
a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAbstractResponse.java
+++ 
b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAbstractResponse.java
@@ -26,8 +26,8 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort;
 import org.apache.plc4x.java.ads.api.generic.types.Invoke;
 import org.apache.plc4x.java.ads.api.generic.types.State;
 
-abstract class ADSAbstractResponse extends AMSTCPPacket {
-    ADSAbstractResponse(AMSTCPHeader amstcpHeader, AMSHeader amsHeader) {
+public abstract class ADSAbstractResponse extends AMSTCPPacket {
+     protected ADSAbstractResponse(AMSTCPHeader amstcpHeader, AMSHeader 
amsHeader) {
         super(amstcpHeader, amsHeader);
     }
 
@@ -35,7 +35,7 @@ abstract class ADSAbstractResponse extends AMSTCPPacket {
         super(amsHeader);
     }
 
-    ADSAbstractResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, 
AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId) {
+    protected ADSAbstractResponse(AMSNetId targetAmsNetId, AMSPort 
targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId) 
{
         super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, 
State.DEFAULT_RESPONSE, invokeId);
     }
 
diff --git 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSPlcDriverTest.java
 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSPlcDriverTest.java
index 01eeb70..4fd1f9e 100644
--- 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSPlcDriverTest.java
+++ 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSPlcDriverTest.java
@@ -19,9 +19,11 @@ under the License.
 package org.apache.plc4x.java.ads;
 
 
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.ads.connection.ADSPlcConnection;
 import org.apache.plc4x.java.ads.util.TcpHexDumper;
+import 
org.apache.plc4x.java.api.authentication.PlcUsernamePasswordAuthentication;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.junit.Rule;
@@ -44,6 +46,18 @@ public class ADSPlcDriverTest {
         adsConnection.close();
     }
 
+    @Test(expected = PlcConnectionException.class)
+    public void getConnectionNoAuthSupported() throws Exception {
+        new PlcDriverManager().getConnection("ads://localhost:" + 
tcpHexDumper.getPort() + "/0.0.0.0.0.0:13",
+            new PlcUsernamePasswordAuthentication("admin", "admin"));
+    }
+
+    @Test(expected = PlcConnectionException.class)
+    public void getConnectionUnknownHost() throws Exception {
+        new PlcDriverManager().getConnection("ads://:" + 
RandomStringUtils.randomAscii(12) + "/0.0.0.0.0.0:13",
+            new PlcUsernamePasswordAuthentication("admin", "admin"));
+    }
+
     /**
      * In this test case the 'ads' driver should report an invalid url format.
      *
diff --git 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocolTest.java
 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocolTest.java
index b044801..0fa59f8 100644
--- 
a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocolTest.java
+++ 
b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocolTest.java
@@ -18,26 +18,39 @@
  */
 package org.apache.plc4x.java.ads.netty;
 
+import org.apache.commons.io.HexDump;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.ads.api.commands.ADSReadResponse;
+import org.apache.plc4x.java.ads.api.commands.ADSWriteResponse;
+import org.apache.plc4x.java.ads.api.commands.types.Data;
+import org.apache.plc4x.java.ads.api.commands.types.Result;
+import org.apache.plc4x.java.ads.api.generic.AMSHeader;
 import org.apache.plc4x.java.ads.api.generic.AMSTCPPacket;
 import org.apache.plc4x.java.ads.api.generic.types.AMSNetId;
 import org.apache.plc4x.java.ads.api.generic.types.AMSPort;
+import org.apache.plc4x.java.ads.api.generic.types.Invoke;
 import org.apache.plc4x.java.ads.model.ADSAddress;
 import org.apache.plc4x.java.api.messages.*;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.ByteArrayOutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.instanceOf;
 import static org.junit.Assert.assertThat;
 
 @RunWith(Parameterized.class)
@@ -52,20 +65,35 @@ public class Plc4XADSProtocolTest {
     @Parameterized.Parameter(1)
     public CompletableFuture completableFuture;
 
-    @Parameterized.Parameters(name = "{0} {index}")
+    @Parameterized.Parameter(2)
+    public AMSTCPPacket amstcpPacket;
+
+    @Parameterized.Parameters(name = "{2} {index}")
     public static Collection<Object[]> data() {
+        AMSNetId targetAmsNetId = AMSNetId.of("1.2.3.4.5.6");
+        AMSPort targetAmsPort = AMSPort.of(7);
+        AMSNetId sourceAmsNetId = AMSNetId.of("8.9.10.11.12.13");
+        AMSPort sourceAmsPort = AMSPort.of(14);
+        Invoke invokeId = Invoke.of(2);
+        Data data = Data.of(SerializationUtils.serialize("Hello World!"));
         return Stream.of(
-            new PlcRequestContainer<>(
-                PlcWriteRequest
-                    .builder()
-                    .addItem(ADSAddress.of(1, 2), "HelloWorld!")
-                    .build(), new CompletableFuture<>()),
-            new PlcRequestContainer<>(
-                PlcReadRequest
-                    .builder()
-                    .addItem(String.class, ADSAddress.of(1, 2))
-                    .build(), new CompletableFuture<>())
-        ).map(plcRequestContainer -> new Object[]{plcRequestContainer, 
plcRequestContainer.getResponseFuture()}).collect(Collectors.toList());
+            ImmutablePair.of(
+                new PlcRequestContainer<>(
+                    PlcWriteRequest
+                        .builder()
+                        .addItem(ADSAddress.of(1, 2), "HelloWorld!")
+                        .build(), new CompletableFuture<>()),
+                ADSWriteResponse.of(targetAmsNetId, targetAmsPort, 
sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0))
+            ),
+            ImmutablePair.of(
+                new PlcRequestContainer<>(
+                    PlcReadRequest
+                        .builder()
+                        .addItem(String.class, ADSAddress.of(1, 2))
+                        .build(), new CompletableFuture<>()),
+                ADSReadResponse.of(targetAmsNetId, targetAmsPort, 
sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), data)
+            )
+        ).map(pair -> new Object[]{pair.left, pair.left.getResponseFuture(), 
pair.right}).collect(Collectors.toList());
     }
 
     @Before
@@ -82,15 +110,43 @@ public class Plc4XADSProtocolTest {
         ArrayList<Object> out = new ArrayList<>();
         SUT.encode(null, plcRequestContainer, out);
         assertThat(out, hasSize(1));
+        try (ByteArrayOutputStream byteArrayOutputStream = new 
ByteArrayOutputStream()) {
+            byte[] bytes = ((AMSTCPPacket) out.get(0)).getByteBuf().array();
+            HexDump.dump(bytes, 0, byteArrayOutputStream, 0);
+            byteArrayOutputStream.flush();
+            LOGGER.info("{}\nHexDump:\n{}", amstcpPacket, 
byteArrayOutputStream);
+        }
     }
 
-    @Ignore("This doesn't work as the correlation requires a response to a 
request not another response")
     @Test
     public void decode() throws Exception {
         ArrayList<Object> in = new ArrayList<>();
         SUT.encode(null, plcRequestContainer, in);
+        assertThat(in, hasSize(1));
+        syncInvoiceId();
         ArrayList<Object> out = new ArrayList<>();
-        SUT.decode(null, ((AMSTCPPacket) in.get(0)), out);
+        try (ByteArrayOutputStream byteArrayOutputStream = new 
ByteArrayOutputStream()) {
+            byte[] bytes = amstcpPacket.getByteBuf().array();
+            HexDump.dump(bytes, 0, byteArrayOutputStream, 0);
+            byteArrayOutputStream.flush();
+            LOGGER.info("{}\nHexDump:\n{}", amstcpPacket, 
byteArrayOutputStream);
+        }
+        SUT.decode(null, amstcpPacket, out);
         assertThat(out, hasSize(1));
+        assertThat(out.get(0), instanceOf(PlcRequestContainer.class));
+    }
+
+    private void syncInvoiceId() throws Exception {
+        Field correlationBuilderField = 
SUT.getClass().getDeclaredField("correlationBuilder");
+        correlationBuilderField.setAccessible(true);
+        AtomicLong correlationBuilder = (AtomicLong) 
correlationBuilderField.get(SUT);
+
+        AMSHeader amsHeader = amstcpPacket.getAmsHeader();
+        Field invokeIdField = 
amsHeader.getClass().getDeclaredField("invokeId");
+        Field modifiersField = Field.class.getDeclaredField("modifiers");
+        modifiersField.setAccessible(true);
+        modifiersField.setInt(invokeIdField, invokeIdField.getModifiers() & 
~Modifier.FINAL);
+        invokeIdField.setAccessible(true);
+        invokeIdField.set(amsHeader, Invoke.of(correlationBuilder.get()));
     }
 }
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
sru...@apache.org.

Reply via email to