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:46 UTC

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

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.