You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/03/01 13:32:45 UTC

[incubator-plc4x] branch refactoring/ads_use_byte_array created (now a2b6531)

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

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


      at a2b6531  refactored so we use byte[] insted of ByteBuf

This branch includes the following new commits:

     new a2b6531  refactored so we use byte[] insted of ByteBuf

The 1 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.


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

[incubator-plc4x] 01/01: refactored so we use byte[] insted of ByteBuf

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

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

commit a2b6531da4dad44d7763aacf818cd2bd6ccb594f
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Mar 1 14:32:40 2018 +0100

    refactored so we use byte[] insted of ByteBuf
---
 .../java/ads/api/commands/UnknownCommand.java      | 17 +++++-----
 .../api/commands/types/AdsNotificationSample.java  |  6 ++--
 .../ads/api/commands/types/AdsStampHeader.java     |  8 ++---
 .../apache/plc4x/java/ads/api/generic/ADSData.java |  3 +-
 .../plc4x/java/ads/api/generic/AMSHeader.java      |  8 ++---
 .../plc4x/java/ads/api/generic/AMSTCPHeader.java   | 10 +++---
 .../plc4x/java/ads/api/generic/AMSTCPPacket.java   |  8 ++---
 .../plc4x/java/ads/api/util/ByteReadable.java      | 21 ++++++++----
 .../plc4x/java/ads/api/util/ByteReadableUtils.java | 37 ----------------------
 .../apache/plc4x/java/ads/netty/ADSProtocol.java   | 16 ++++++----
 .../ads/api/commands/CommandFactoryMethodTest.java | 11 +++++--
 .../ads/api/generic/GenericFactoryMethodTest.java  | 30 +++++++++++-------
 12 files changed, 77 insertions(+), 98 deletions(-)

diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/UnknownCommand.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/UnknownCommand.java
index 4eba85d..ebbc57e 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/UnknownCommand.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/UnknownCommand.java
@@ -18,13 +18,14 @@
  */
 package org.apache.plc4x.java.ads.api.commands;
 
-import io.netty.buffer.ByteBuf;
 import org.apache.plc4x.java.ads.api.generic.ADSData;
 import org.apache.plc4x.java.ads.api.generic.AMSHeader;
 import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader;
 import org.apache.plc4x.java.ads.api.generic.AMSTCPPacket;
 import org.apache.plc4x.java.ads.api.generic.types.*;
 
+import java.util.Arrays;
+
 import static java.util.Objects.requireNonNull;
 
 /**
@@ -33,14 +34,14 @@ import static java.util.Objects.requireNonNull;
 @ADSCommandType(Command.UNKNOWN)
 public class UnknownCommand extends AMSTCPPacket {
 
-    private final ByteBuf remainingBytes;
+    private final byte[] remainingBytes;
 
-    private UnknownCommand(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, ByteBuf remainingBytes) {
+    private UnknownCommand(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, byte[] remainingBytes) {
         super(amstcpHeader, amsHeader);
         this.remainingBytes = requireNonNull(remainingBytes);
     }
 
-    private UnknownCommand(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, State stateId, Invoke invokeId, ByteBuf remainingBytes) {
+    private UnknownCommand(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, State stateId, Invoke invokeId, byte[] remainingBytes) {
         super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, stateId, invokeId);
         this.remainingBytes = requireNonNull(remainingBytes);
     }
@@ -50,11 +51,11 @@ public class UnknownCommand extends AMSTCPPacket {
         return () -> remainingBytes;
     }
 
-    public static AMSTCPPacket of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, ByteBuf remainingBytes) {
+    public static AMSTCPPacket of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, byte[] remainingBytes) {
         return new UnknownCommand(amstcpHeader, amsHeader, remainingBytes);
     }
 
-    public static UnknownCommand of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, State stateId, Invoke invokeId, ByteBuf remainingBytes) {
+    public static UnknownCommand of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, State stateId, Invoke invokeId, byte[] remainingBytes) {
         return new UnknownCommand(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, stateId, invokeId, remainingBytes);
     }
 
@@ -69,13 +70,13 @@ public class UnknownCommand extends AMSTCPPacket {
 
         UnknownCommand that = (UnknownCommand) o;
 
-        return remainingBytes.equals(that.remainingBytes);
+        return Arrays.equals(remainingBytes, that.remainingBytes);
     }
 
     @Override
     public int hashCode() {
         int result = super.hashCode();
-        result = 31 * result + remainingBytes.hashCode();
+        result = 31 * result + Arrays.hashCode(remainingBytes);
         return result;
     }
 
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java
index 325b6e3..fd17925 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java
@@ -18,12 +18,10 @@
  */
 package org.apache.plc4x.java.ads.api.commands.types;
 
-import io.netty.buffer.ByteBuf;
 import org.apache.plc4x.java.ads.api.util.ByteReadable;
 import org.apache.plc4x.java.ads.api.util.LengthSupplier;
 
 import static java.util.Objects.requireNonNull;
-import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff;
 
 public class AdsNotificationSample implements ByteReadable {
 
@@ -65,8 +63,8 @@ public class AdsNotificationSample implements ByteReadable {
     }
 
     @Override
-    public ByteBuf getByteBuf() {
-        return buildByteBuff(notificationHandle, getSampleSize(), data);
+    public byte[] getBytes() {
+        return getAggregatesBytes(notificationHandle, getSampleSize(), data);
     }
 
     public NotificationHandle getNotificationHandle() {
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java
index 2c9b56b..24ffa7c 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java
@@ -18,13 +18,11 @@
  */
 package org.apache.plc4x.java.ads.api.commands.types;
 
-import io.netty.buffer.ByteBuf;
 import org.apache.plc4x.java.ads.api.util.ByteReadable;
 
 import java.util.List;
 
 import static java.util.Objects.requireNonNull;
-import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff;
 
 public class AdsStampHeader implements ByteReadable {
 
@@ -62,8 +60,8 @@ public class AdsStampHeader implements ByteReadable {
     }
 
     @Override
-    public ByteBuf getByteBuf() {
-        return buildByteBuff(timeStamp, samples, () -> buildByteBuff(adsNotificationSamples.toArray(new ByteReadable[adsNotificationSamples.size()])));
+    public byte[] getBytes() {
+        return getAggregatesBytes(timeStamp, samples, () -> getAggregatesBytes(adsNotificationSamples.toArray(new ByteReadable[adsNotificationSamples.size()])));
     }
 
     public TimeStamp getTimeStamp() {
@@ -91,7 +89,7 @@ public class AdsStampHeader implements ByteReadable {
             return false;
         if (!samples.equals(that.samples))
             return false;
-        
+
         return adsNotificationSamples.equals(that.adsNotificationSamples);
     }
 
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/ADSData.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/ADSData.java
index e97b1dc..0fd1dd0 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/ADSData.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/ADSData.java
@@ -18,7 +18,6 @@
  */
 package org.apache.plc4x.java.ads.api.generic;
 
-import io.netty.buffer.Unpooled;
 import org.apache.plc4x.java.ads.api.util.ByteReadable;
 
 /**
@@ -27,6 +26,6 @@ import org.apache.plc4x.java.ads.api.util.ByteReadable;
 @FunctionalInterface
 public interface ADSData extends ByteReadable {
 
-    ADSData EMPTY = () -> Unpooled.EMPTY_BUFFER;
+    ADSData EMPTY = () -> new byte[0];
 
 }
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java
index 72bb6f0..2b25a26 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java
@@ -18,13 +18,11 @@
  */
 package org.apache.plc4x.java.ads.api.generic;
 
-import io.netty.buffer.ByteBuf;
 import org.apache.plc4x.java.ads.api.generic.types.*;
 import org.apache.plc4x.java.ads.api.util.ByteReadable;
 import org.apache.plc4x.java.ads.api.util.LengthSupplier;
 
 import static java.util.Objects.requireNonNull;
-import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff;
 
 /**
  * AMS Header	32 bytes	The AMS/TCP-Header contains the addresses of the transmitter and receiver. In addition the AMS error code , the ADS command Id and some other information.
@@ -107,8 +105,8 @@ public class AMSHeader implements ByteReadable {
     }
 
     @Override
-    public ByteBuf getByteBuf() {
-        return buildByteBuff(
+    public byte[] getBytes() {
+        return getAggregatesBytes(
             targetAmsNetId,
             targetAmsPort,
             sourceAmsNetId,
@@ -181,7 +179,7 @@ public class AMSHeader implements ByteReadable {
             return false;
         if (!invokeId.equals(amsHeader.invokeId))
             return false;
-        
+
         return getDataLength().equals(((AMSHeader) o).getDataLength());
     }
 
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java
index d7d7e0a..b97cdd7 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java
@@ -18,14 +18,12 @@
  */
 package org.apache.plc4x.java.ads.api.generic;
 
-import io.netty.buffer.ByteBuf;
 import org.apache.plc4x.java.ads.api.generic.types.TcpLength;
 import org.apache.plc4x.java.ads.api.util.ByteReadable;
 import org.apache.plc4x.java.ads.api.util.ByteValue;
 import org.apache.plc4x.java.ads.api.util.LengthSupplier;
 
 import static java.util.Objects.requireNonNull;
-import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff;
 
 /**
  * AMS/TCP Header	6 bytes	contains the tcpLength of the data packet.
@@ -68,8 +66,8 @@ public class AMSTCPHeader implements ByteReadable {
     }
 
     @Override
-    public ByteBuf getByteBuf() {
-        return buildByteBuff(reserved, getTcpLength());
+    public byte[] getBytes() {
+        return getAggregatesBytes(reserved, getTcpLength());
     }
 
     /**
@@ -91,9 +89,9 @@ public class AMSTCPHeader implements ByteReadable {
     @Override
     public long getCalculatedLength() {
         if (lengthSuppliers == null) {
-            return tcpLength.getAsLong();
+            return (int) tcpLength.getAsLong();
         } else {
-            long aggregateLength = 0;
+            int aggregateLength = 0;
             for (LengthSupplier supplier : lengthSuppliers) {
                 aggregateLength += supplier.getCalculatedLength();
             }
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPacket.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPacket.java
index cb1bafd..8109be7 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPacket.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPacket.java
@@ -18,13 +18,11 @@
  */
 package org.apache.plc4x.java.ads.api.generic;
 
-import io.netty.buffer.ByteBuf;
 import org.apache.plc4x.java.ads.api.commands.ADSCommandType;
 import org.apache.plc4x.java.ads.api.generic.types.*;
 import org.apache.plc4x.java.ads.api.util.ByteReadable;
 
 import static java.util.Objects.requireNonNull;
-import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff;
 
 public abstract class AMSTCPPacket implements ByteReadable {
     private final AMSTCPHeader amsTcpHeader;
@@ -71,12 +69,12 @@ public abstract class AMSTCPPacket implements ByteReadable {
     protected abstract ADSData getAdsData();
 
     @Override
-    public ByteBuf getByteBuf() {
-        return buildByteBuff(amsTcpHeader, amsHeader, getAdsData());
+    public byte[] getBytes() {
+        return getAggregatesBytes(amsTcpHeader, amsHeader, getAdsData());
     }
 
     protected ADSData buildADSData(ByteReadable... byteReadables) {
-        return () -> buildByteBuff(byteReadables);
+        return () -> getAggregatesBytes(byteReadables);
     }
 
     @Override
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java
index a1170a0..684e65c 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java
@@ -19,22 +19,31 @@
 package org.apache.plc4x.java.ads.api.util;
 
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import org.apache.commons.io.HexDump;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Objects;
 
 @FunctionalInterface
 public interface ByteReadable extends LengthSupplier {
 
-    default byte[] getBytes() {
-        ByteBuf byteBuf = getByteBuf();
-        byte[] result = new byte[byteBuf.writerIndex()];
-        byteBuf.readBytes(result);
-        return result;
+    byte[] getBytes();
+
+    default byte[] getAggregatesBytes(ByteReadable... byteReadables) {
+        Objects.requireNonNull(byteReadables);
+        int bytes = Arrays.stream(byteReadables).map(ByteReadable::getCalculatedLength).mapToInt(Long::intValue).sum();
+        ByteBuffer byteBuffer = ByteBuffer.allocate(bytes);
+        Arrays.stream(byteReadables).map(ByteReadable::getBytes).forEach(byteBuffer::put);
+        return byteBuffer.array();
     }
 
-    ByteBuf getByteBuf();
+    default ByteBuf getByteBuf() {
+        return Unpooled.wrappedBuffer(getBytes());
+    }
 
     @Override
     default long getCalculatedLength() {
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadableUtils.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadableUtils.java
deleted file mode 100644
index 02cbd78..0000000
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadableUtils.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- 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.
- */
-package org.apache.plc4x.java.ads.api.util;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-
-public class ByteReadableUtils {
-
-    private ByteReadableUtils() {
-        // Singleton
-    }
-
-    public static ByteBuf buildByteBuff(ByteReadable... byteReadables) {
-        ByteBuf buffer = Unpooled.buffer();
-        for (ByteReadable byteReadable : byteReadables) {
-            buffer.writeBytes(byteReadable.getByteBuf());
-        }
-        return buffer;
-    }
-}
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/ADSProtocol.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/ADSProtocol.java
index 70796b6..178e00a 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/ADSProtocol.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/ADSProtocol.java
@@ -136,9 +136,9 @@ public class ADSProtocol extends MessageToMessageCodec<ByteBuf, AMSTCPPacket> {
     }
 
     private AMSTCPPacket handleInvalidCommand(ByteBuf commandBuffer, AMSTCPHeader amstcpHeader, AMSHeader amsHeader) {
-        AMSTCPPacket amstcpPacket;
-        amstcpPacket = UnknownCommand.of(amstcpHeader, amsHeader, commandBuffer);
-        return amstcpPacket;
+        byte[] bytes = new byte[commandBuffer.readableBytes()];
+        commandBuffer.readBytes(bytes);
+        return UnknownCommand.of(amstcpHeader, amsHeader, bytes);
     }
 
     private AMSTCPPacket handleADSReadDeviceInfoCommand(State stateId, ByteBuf commandBuffer, AMSTCPHeader amstcpHeader, AMSHeader amsHeader) {
@@ -280,7 +280,9 @@ public class ADSProtocol extends MessageToMessageCodec<ByteBuf, AMSTCPPacket> {
             adsDeviceNotificationBuffer.release();
             amstcpPacket = ADSDeviceNotificationRequest.of(amstcpHeader, amsHeader, length, stamps, adsStampHeaders);
         } else {
-            amstcpPacket = UnknownCommand.of(amstcpHeader, amsHeader, commandBuffer);
+            byte[] bytes = new byte[commandBuffer.readableBytes()];
+            commandBuffer.readBytes(bytes);
+            amstcpPacket = UnknownCommand.of(amstcpHeader, amsHeader, bytes);
         }
         return amstcpPacket;
     }
@@ -346,8 +348,8 @@ public class ADSProtocol extends MessageToMessageCodec<ByteBuf, AMSTCPPacket> {
     }
 
     private AMSTCPPacket handleUnknownCommand(ByteBuf commandBuffer, AMSTCPHeader amstcpHeader, AMSHeader amsHeader) {
-        AMSTCPPacket amstcpPacket;
-        amstcpPacket = UnknownCommand.of(amstcpHeader, amsHeader, commandBuffer);
-        return amstcpPacket;
+        byte[] bytes = new byte[commandBuffer.readableBytes()];
+        commandBuffer.readBytes(bytes);
+        return UnknownCommand.of(amstcpHeader, amsHeader, bytes);
     }
 }
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/CommandFactoryMethodTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/CommandFactoryMethodTest.java
index 5bec44c..5ec87ac 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/CommandFactoryMethodTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/CommandFactoryMethodTest.java
@@ -19,6 +19,7 @@
 package org.apache.plc4x.java.ads.api.commands;
 
 import org.apache.plc4x.java.ads.api.generic.types.Command;
+import org.apache.plc4x.java.ads.api.util.ByteReadable;
 import org.apache.plc4x.java.ads.api.util.LengthSupplier;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,8 +36,7 @@ import java.util.stream.Stream;
 
 import static org.hamcrest.Matchers.*;
 import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.*;
 
 @RunWith(Parameterized.class)
 public class CommandFactoryMethodTest {
@@ -93,6 +93,13 @@ public class CommandFactoryMethodTest {
                         return 1L;
                     } else if (aClass == List.class) {
                         return Collections.emptyList();
+                    } else if (aClass == byte[].class) {
+                        return new byte[0];
+                    } else if (ByteReadable.class.isAssignableFrom(aClass)) {
+                        Class<? extends ByteReadable> aSpecialClass = (Class<? extends ByteReadable>) aClass;
+                        ByteReadable mock = mock(aSpecialClass, RETURNS_DEEP_STUBS);
+                        when(mock.getBytes()).thenReturn(new byte[0]);
+                        return mock;
                     } else {
                         return mock(aClass, RETURNS_DEEP_STUBS);
                     }
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/GenericFactoryMethodTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/GenericFactoryMethodTest.java
index ca8f415..d265092 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/GenericFactoryMethodTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/GenericFactoryMethodTest.java
@@ -19,6 +19,7 @@
 package org.apache.plc4x.java.ads.api.generic;
 
 import org.apache.plc4x.java.ads.api.generic.types.Command;
+import org.apache.plc4x.java.ads.api.util.ByteReadable;
 import org.apache.plc4x.java.ads.api.util.LengthSupplier;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,8 +35,7 @@ import java.util.stream.Stream;
 
 import static org.hamcrest.Matchers.*;
 import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.*;
 
 @RunWith(Parameterized.class)
 public class GenericFactoryMethodTest {
@@ -67,16 +67,24 @@ public class GenericFactoryMethodTest {
                 continue;
             }
             Object invoke = method.invoke(null, Arrays.stream(method.getParameterTypes()).map(aClass -> {
-                if (aClass == Command.class) {
-                    return Command.INVALID;
-                } else if (aClass == LengthSupplier[].class) {
-                    return new LengthSupplier[]{() -> 0};
-                } else if (aClass == long.class) {
-                    return 1L;
-                } else {
-                    return mock(aClass, RETURNS_DEEP_STUBS);
+                    if (aClass == Command.class) {
+                        return Command.INVALID;
+                    } else if (aClass == LengthSupplier[].class) {
+                        return new LengthSupplier[]{() -> 0};
+                    } else if (aClass == long.class) {
+                        return 1L;
+                    } else if (ByteReadable.class.isAssignableFrom(aClass)) {
+                        Class<? extends ByteReadable> aSpecialClass = (Class<? extends ByteReadable>) aClass;
+                        ByteReadable mock = mock(aSpecialClass, RETURNS_DEEP_STUBS);
+                        when(mock.getBytes()).thenReturn(new byte[0]);
+                        return mock;
+                    } else if (aClass == byte[].class) {
+                        return new byte[0];
+                    } else {
+                        return mock(aClass, RETURNS_DEEP_STUBS);
+                    }
                 }
-            }).toArray());
+            ).toArray());
             assertThat(invoke, notNullValue());
             assertThat(invoke, instanceOf(clazz));
             assertThat(invoke.toString(), not(isEmptyString()));

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