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.