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>'].