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

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


The following commit(s) were added to refs/heads/refactoring/java_generify by 
this push:
     new 51075d9  added Tests for Plc4XS7Protocol
51075d9 is described below

commit 51075d92d7a5462296d4be29fb1b5367336ec85e
Author: Sebastian Rühl <sru...@apache.org>
AuthorDate: Thu Jan 4 12:45:49 2018 +0100

    added Tests for Plc4XS7Protocol
---
 .../apache/plc4x/java/api/messages/PlcMessage.java |   4 +-
 .../plc4x/java/api/messages/PlcReadRequest.java    |   2 +-
 .../apache/plc4x/java/api/messages/PlcRequest.java |   2 +-
 .../plc4x/java/api/messages/PlcWriteRequest.java   |   2 +-
 plc4j/pom.xml                                      |   7 +
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       |   2 -
 .../plc4x/java/s7/netty/Plc4XS7ProtocolTest.java   | 207 ++++++++++++++++++++-
 .../apache/plc4x/java/s7/netty/S7ProtocolTest.java |   4 +-
 8 files changed, 215 insertions(+), 15 deletions(-)

diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java
index aed337d..d720136 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java
@@ -20,7 +20,9 @@ package org.apache.plc4x.java.api.messages;
 
 /**
  * Base type for all forms of messages passed between plc and plc4x system.
+ * @param <T>         type that is being handled.
  */
-public interface PlcMessage {
+@SuppressWarnings("unused")
+public interface PlcMessage<T> {
 
 }
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
index fddbd4d..dbf8d59 100644
--- 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
+++ 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
@@ -24,7 +24,7 @@ import org.apache.plc4x.java.api.model.Address;
 import java.util.LinkedList;
 import java.util.List;
 
-public class PlcReadRequest<T> implements PlcRequest {
+public class PlcReadRequest<T> implements PlcRequest<T> {
 
     private final List<ReadRequestItem<T>> readRequestItems;
 
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java
index f2367f9..40a4b75 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java
@@ -21,6 +21,6 @@ package org.apache.plc4x.java.api.messages;
 /**
  * Base type for all messages sent from the plc4x system to a connected plc.
  */
-public interface PlcRequest extends PlcMessage {
+public interface PlcRequest<T> extends PlcMessage<T> {
 
 }
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
index 3ff0999..c5cfd93 100644
--- 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
+++ 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
@@ -24,7 +24,7 @@ import org.apache.plc4x.java.api.model.Address;
 import java.util.LinkedList;
 import java.util.List;
 
-public class PlcWriteRequest<T> implements PlcRequest {
+public class PlcWriteRequest<T> implements PlcRequest<T> {
 
     private final List<WriteRequestItem<T>> requestItems;
 
diff --git a/plc4j/pom.xml b/plc4j/pom.xml
index fb73861..9f607cf 100644
--- a/plc4j/pom.xml
+++ b/plc4j/pom.xml
@@ -50,6 +50,13 @@
     </dependency>
 
     <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-params</artifactId>
+      <version>${junit-jupiter.version}</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
       <groupId>org.assertj</groupId>
       <artifactId>assertj-core</artifactId>
       <version>3.8.0</version>
diff --git 
a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
 
b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
index ad46f53..c9b44c2 100644
--- 
a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
+++ 
b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
@@ -50,8 +50,6 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, 
PlcRequestContainer> {
 
-    private static final Logger logger = 
LoggerFactory.getLogger(S7PlcConnection.class);
-
     private static final AtomicInteger tpduGenerator = new AtomicInteger(1);
 
     private Map<Short, PlcRequestContainer> requests;
diff --git 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java
 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java
index e4db05a..a67e482 100644
--- 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java
+++ 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java
@@ -18,22 +18,215 @@ under the License.
 */
 package org.apache.plc4x.java.s7.netty;
 
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcRequest;
+import org.apache.plc4x.java.api.messages.PlcRequestContainer;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.netty.NettyTestBase;
+import org.apache.plc4x.java.s7.model.S7Address;
+import org.apache.plc4x.java.s7.model.S7BitAddress;
+import org.apache.plc4x.java.s7.model.S7DataBlockAddress;
+import org.apache.plc4x.java.s7.netty.model.messages.S7ResponseMessage;
+import org.apache.plc4x.java.s7.netty.model.params.VarParameter;
+import org.apache.plc4x.java.s7.netty.model.payloads.VarPayload;
+import org.apache.plc4x.java.s7.netty.model.payloads.items.VarPayloadItem;
+import org.apache.plc4x.java.s7.netty.model.types.DataTransportErrorCode;
+import org.apache.plc4x.java.s7.netty.model.types.DataTransportSize;
+import org.apache.plc4x.java.s7.netty.model.types.MessageType;
+import org.apache.plc4x.java.s7.netty.model.types.ParameterType;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+
+import static java.util.Collections.singletonList;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.*;
+
+@SuppressWarnings("unchecked")
 public class Plc4XS7ProtocolTest extends NettyTestBase {
 
-    @Test
-    @Tag("fast")
-    public void encode() {
+    private Plc4XS7Protocol SUT;
+
+    @BeforeEach
+    void setUp() {
+        SUT = new Plc4XS7Protocol();
+    }
 
+    @ParameterizedTest
+    @MethodSource("typeAndAddressProvider")
+    @Tag("slow")
+    public void encode(Class<?> type, S7Address address) throws Exception {
+        // TODO: finish me
+        // Read Request Tests
+        {
+            LinkedList<Object> out = new LinkedList<>();
+            SUT.encode(null, createMockedContainer(new PlcReadRequest<>(type, 
address)), out);
+            // TODO: finish the asserts
+            assertThat(out).hasSize(1);
+        }
+        // Write Request Tests
+        {
+            LinkedList<Object> out = new LinkedList<>();
+            SUT.encode(null, createMockedContainer(new PlcWriteRequest(type, 
address, fakeValueFor(type))), out);
+            // TODO: finish the asserts
+            assertThat(out).hasSize(1);
+        }
     }
 
-    @Test
-    @Tag("fast")
-    public void decode() {
+    @ParameterizedTest
+    @MethodSource("typeAndAddressProvider")
+    @Tag("slow")
+    public void decode(Class<?> type, S7Address address) throws Exception {
+        // TODO: finish me
+        if (type == String.class) {
+            // String seems not yet decodable
+            return;
+        }
+        // Read Test
+        {
+            short fakeTpduReference = (short) 1;
+            {
+                // We need to put in a fake tpdu reference
+                Field requests = 
Plc4XS7Protocol.class.getDeclaredField("requests");
+                requests.setAccessible(true);
+                Map<Short, PlcRequestContainer> requestContainerMap = 
(Map<Short, PlcRequestContainer>) requests.get(SUT);
+                requestContainerMap.put(fakeTpduReference, 
createMockedContainer(new PlcReadRequest<>(type, address)));
+            }
+            S7ResponseMessage msg = new S7ResponseMessage(
+                MessageType.ACK,
+                fakeTpduReference,
+                singletonList(mock(VarParameter.class)),
+                singletonList(new VarPayload(ParameterType.READ_VAR, 
singletonList(varPayloadItemFor(type)))),
+                (byte) 0x00,
+                (byte) 0x00);
+            LinkedList<Object> out = new LinkedList<>();
+            SUT.decode(null, msg, out);
+            // TODO: finish the asserts
+            assertThat(out).hasSize(0);
+        }
+        // Write Test
+        {
+            short fakeTpduReference = (short) 2;
+            {
+                // We need to put in a fake tpdu reference
+                Field requests = 
Plc4XS7Protocol.class.getDeclaredField("requests");
+                requests.setAccessible(true);
+                Map<Short, PlcRequestContainer> requestContainerMap = 
(Map<Short, PlcRequestContainer>) requests.get(SUT);
+                requestContainerMap.put(fakeTpduReference, 
createMockedContainer(new PlcWriteRequest(type, address, fakeValueFor(type))));
+            }
+            S7ResponseMessage msg = new S7ResponseMessage(
+                MessageType.ACK,
+                fakeTpduReference,
+                singletonList(mock(VarParameter.class)),
+                singletonList(new VarPayload(ParameterType.WRITE_VAR, 
singletonList(varPayloadItemFor(type)))),
+                (byte) 0x00,
+                (byte) 0x00);
+            LinkedList<Object> out = new LinkedList<>();
+            SUT.decode(null, msg, out);
+            // TODO: finish the asserts
+            assertThat(out).hasSize(0);
+        }
+    }
+
+    private static Stream<Arguments> typeAndAddressProvider() {
+        List<Arguments> arguments = new LinkedList<>();
+        Arrays.asList(
+            Boolean.class,
+            Byte.class,
+            Short.class,
+            // TODO: enable once Calender in implemented
+            //Calendar.class,
+            Float.class,
+            Integer.class,
+            String.class)
+            .forEach(
+                aClass -> Arrays.asList(
+                    mock(S7Address.class),
+                    mock(S7BitAddress.class),
+                    mock(S7DataBlockAddress.class))
+                    .forEach(s7Address -> arguments.add(Arguments.of(aClass, 
s7Address)))
+            );
+        return arguments.stream();
+    }
+
+    private <T> T fakeValueFor(Class<T> type) {
+        if (type == Boolean.class) {
+            return (T) Boolean.TRUE;
+        } else if (type == Byte.class) {
+            return (T) Byte.valueOf((byte) 0x0000_0000);
+        } else if (type == Short.class) {
+            return (T) Short.valueOf((short) 123);
+        } else if (type == Calendar.class) {
+            return (T) Calendar.getInstance();
+        } else if (type == Float.class) {
+            return (T) Float.valueOf(123f);
+        } else if (type == Integer.class) {
+            return (T) Integer.valueOf(123);
+        } else if (type == String.class) {
+            return (T) "string";
+        } else {
+            throw new IllegalArgumentException("Type t not supported " + type);
+        }
+    }
+
+    private VarPayloadItem varPayloadItemFor(Class type) {
+        // TODO: fix example
+        final DataTransportSize size;
+        final byte[] data;
+        if (type == Boolean.class) {
+            size = DataTransportSize.BIT;
+            data = new byte[]{(byte) 0b0};
+        } else if (type == Byte.class) {
+            size = DataTransportSize.BYTE_WORD_DWORD;
+            data = new byte[]{(byte) 0b0000_0000};
+        } else if (type == Short.class) {
+            size = DataTransportSize.BYTE_WORD_DWORD;
+            data = new byte[]{(byte) 0b0000_0000, (byte) 0b0000_0000};
+        } else if (type == Calendar.class) {
+            size = DataTransportSize.BYTE_WORD_DWORD;
+            // TODO: what size is calender?
+            data = new byte[]{(byte) 0b0000_0000};
+        } else if (type == Float.class) {
+            size = DataTransportSize.BYTE_WORD_DWORD;
+            data = new byte[]{(byte) 0b0000_0000, (byte) 0b0000_0000, (byte) 
0b0000_0000, (byte) 0b0000_0000};
+        } else if (type == Integer.class) {
+            size = DataTransportSize.INTEGER;
+            data = new byte[]{(byte) 0b0000_0000, (byte) 0b0000_0000, (byte) 
0b0000_0000, (byte) 0b0000_0000};
+        } else if (type == String.class) {
+            size = DataTransportSize.BYTE_WORD_DWORD;
+            // TODO: what size is string?
+            data = new byte[]{(byte) 0b0000_0000};
+        } else {
+            throw new IllegalArgumentException("Type t not supported " + type);
+        }
+        return new VarPayloadItem(DataTransportErrorCode.OK, size, data);
+    }
+
+    private <T extends PlcRequest<?>> PlcRequestContainer 
createMockedContainer(T initialRequest) {
+        return createMockedContainer(initialRequest, null);
+    }
 
+    private <T extends PlcRequest<?>> PlcRequestContainer 
createMockedContainer(T initialRequest, Consumer<T> requestEnricher) {
+        Objects.requireNonNull(initialRequest);
+        PlcRequestContainer mock = mock(PlcRequestContainer.class, 
RETURNS_DEEP_STUBS);
+        if (requestEnricher != null) {
+            requestEnricher.accept(initialRequest);
+        }
+        when(mock.getRequest()).thenReturn(initialRequest);
+        if (initialRequest.getClass() == PlcReadRequest.class) {
+            return mock;
+        } else if (initialRequest.getClass() == PlcWriteRequest.class) {
+            return mock;
+        } else {
+            throw new IllegalArgumentException("Unsupported Type: " + 
initialRequest.getClass());
+        }
     }
 
 }
diff --git 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/S7ProtocolTest.java
 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/S7ProtocolTest.java
index b65b6e1..affd823 100644
--- 
a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/S7ProtocolTest.java
+++ 
b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/S7ProtocolTest.java
@@ -27,13 +27,13 @@ public class S7ProtocolTest extends NettyTestBase {
     @Test
     @Tag("fast")
     public void encode() {
-
+        //TODO: implement me
     }
 
     @Test
     @Tag("fast")
     public void decode() {
-
+        //TODO: implement me
     }
 
 }

-- 
To stop receiving notification emails like this one, please contact
['"commits@plc4x.apache.org" <commits@plc4x.apache.org>'].

Reply via email to