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/11/24 17:26:55 UTC

[incubator-plc4x] branch develop updated: [plc4j] cleanup mock code and moved it completely to driver-bases-test

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 11e4e8f  [plc4j] cleanup mock code and moved it completely to driver-bases-test
11e4e8f is described below

commit 11e4e8f0e85e8fea33a8c166422d001b67b3df13
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Sat Nov 24 18:18:54 2018 +0100

    [plc4j] cleanup mock code and moved it completely to driver-bases-test
---
 .../org/apache/plc4x/java/mock/MockDevice.java     |  18 +-
 .../java/org/apache/plc4x/java/mock/MockField.java |  13 ++
 .../apache/plc4x/java/mock/MockFieldHandler.java   |  70 ++++++++
 .../org/apache/plc4x/java/mock/MockFieldItem.java  |   0
 .../org/apache/plc4x/java/mock/MockReader.java     |  51 ------
 .../apache/plc4x/java/mock/PlcMockConnection.java  | 111 ++++++++++--
 .../org/apache/plc4x/java/mock/PlcMockDriver.java  |  22 ++-
 .../apache/plc4x/java/mock/PlcMockDriverTest.java  |   0
 plc4j/protocols/pom.xml                            |   4 +-
 plc4j/protocols/test/pom.xml                       |  51 ------
 .../org/apache/plc4x/java/mock/MockDevice.java     |  50 ------
 .../java/org/apache/plc4x/java/mock/MockField.java |  49 ------
 .../apache/plc4x/java/mock/MockFieldHandler.java   | 103 ------------
 .../apache/plc4x/java/mock/PlcMockConnection.java  | 186 ---------------------
 .../org/apache/plc4x/java/mock/PlcMockDriver.java  |  63 -------
 .../services/org.apache.plc4x.java.spi.PlcDriver   |  19 ---
 plc4j/utils/opm/pom.xml                            |   5 +-
 17 files changed, 216 insertions(+), 599 deletions(-)

diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java
index def0589..999a4ac 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java
+++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java
@@ -20,10 +20,15 @@
 package org.apache.plc4x.java.mock;
 
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
+import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
+import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
+import java.util.Collection;
+import java.util.function.Consumer;
+
 /**
  * Mock Object to do assertions on.
  */
@@ -31,4 +36,15 @@ public interface MockDevice {
 
     Pair<PlcResponseCode, BaseDefaultFieldItem> read(String fieldQuery);
 
+    PlcResponseCode write(String fieldQuery, Object value);
+
+    Pair<PlcResponseCode, PlcSubscriptionHandle> subscribe(String fieldQuery);
+
+    void unsubscribe();
+
+    // TODO: this might not be right here as you are not really register at the device, rather on the connection
+    PlcConsumerRegistration register(Consumer<PlcSubscriptionEvent> consumer, Collection<PlcSubscriptionHandle> handles);
+
+    // TODO: this might not be right here as you are not really register at the device, rather on the connection
+    void unregister(PlcConsumerRegistration registration);
 }
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockField.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockField.java
index e570b2b..b7dccc9 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockField.java
+++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockField.java
@@ -21,16 +21,29 @@ package org.apache.plc4x.java.mock;
 
 import org.apache.plc4x.java.api.model.PlcField;
 
+import java.util.List;
+
 public class MockField implements PlcField {
 
     private final String fieldQuery;
 
+    private final List<Object> values;
+
     public MockField(String fieldQuery) {
         this.fieldQuery = fieldQuery;
+        values = null;
+    }
+
+    public MockField(String fieldQuery, List<Object> values) {
+        this.fieldQuery = fieldQuery;
+        this.values = values;
     }
 
     public String getFieldQuery() {
         return fieldQuery;
     }
 
+    public List<Object> getValues() {
+        return values;
+    }
 }
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockFieldHandler.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockFieldHandler.java
index a8893e2..055769f 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockFieldHandler.java
+++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockFieldHandler.java
@@ -22,6 +22,7 @@ package org.apache.plc4x.java.mock;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.DefaultPlcFieldHandler;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 public class MockFieldHandler extends DefaultPlcFieldHandler {
 
@@ -30,4 +31,73 @@ public class MockFieldHandler extends DefaultPlcFieldHandler {
         return new MockField(fieldQuery);
     }
 
+    @Override
+    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeByte(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeShort(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeLong(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeBigDecimal(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeString(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeTime(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeDate(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
+    public BaseDefaultFieldItem encodeByteArray(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
 }
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockFieldItem.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockFieldItem.java
similarity index 100%
rename from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockFieldItem.java
rename to plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockFieldItem.java
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockReader.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockReader.java
deleted file mode 100644
index 10febee..0000000
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockReader.java
+++ /dev/null
@@ -1,51 +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.mock;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.base.messages.DefaultPlcReadRequest;
-import org.apache.plc4x.java.base.messages.DefaultPlcReadResponse;
-import org.apache.plc4x.java.base.messages.PlcReader;
-import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
-
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-public class MockReader implements PlcReader {
-
-    private final MockDevice device;
-
-    public MockReader(MockDevice device) {
-        this.device = device;
-    }
-
-    @Override
-    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
-        Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> response = readRequest.getFieldNames().stream()
-            .collect(Collectors.toMap(Function.identity(), name -> device.read(((MockField) readRequest.getField(name)).getFieldQuery())));
-        return CompletableFuture.completedFuture(new DefaultPlcReadResponse((DefaultPlcReadRequest)readRequest, response));
-    }
-
-}
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java
index 9e834ec..9dc802f 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java
+++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java
@@ -18,22 +18,33 @@ under the License.
 */
 package org.apache.plc4x.java.mock;
 
+import org.apache.commons.lang3.Validate;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
-import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
-import org.apache.plc4x.java.base.messages.DefaultPlcReadRequest;
+import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
+import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.base.messages.*;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-public class PlcMockConnection implements PlcConnection {
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+public class PlcMockConnection implements PlcConnection, PlcReader, PlcWriter, PlcSubscriber {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(PlcMockConnection.class);
 
     private final PlcAuthentication authentication;
 
-    private boolean isConnected = false;
     private MockDevice device;
 
     PlcMockConnection(PlcAuthentication authentication) {
@@ -45,6 +56,7 @@ public class PlcMockConnection implements PlcConnection {
     }
 
     public void setDevice(MockDevice device) {
+        LOGGER.info("Set Mock Devie on Mock Connection {} with device {}", this, device);
         this.device = device;
     }
 
@@ -55,14 +67,12 @@ public class PlcMockConnection implements PlcConnection {
 
     @Override
     public boolean isConnected() {
-        // is connected if a device is set
         return device != null;
     }
 
     @Override
     public void close() {
-        // unset device
-        this.device = null;
+        LOGGER.info("Closing MockConnection with device {}", device);
     }
 
     @Override
@@ -75,34 +85,99 @@ public class PlcMockConnection implements PlcConnection {
 
             @Override
             public boolean canWrite() {
-                return false;
+                return true;
             }
 
             @Override
             public boolean canSubscribe() {
-                return false;
+                return true;
             }
         };
     }
 
     @Override
     public PlcReadRequest.Builder readRequestBuilder() {
-        return new DefaultPlcReadRequest.Builder(new MockReader(device), new MockFieldHandler());
+        return new DefaultPlcReadRequest.Builder(this, new MockFieldHandler());
+    }
+
+    @Override
+    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
+        return CompletableFuture.supplyAsync(() -> {
+            Validate.notNull(device, "No device is set in the mock connection!");
+            LOGGER.debug("Sending read request to MockDevice");
+            Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> response = readRequest.getFieldNames().stream()
+                .collect(Collectors.toMap(
+                    Function.identity(),
+                    name -> device.read(((MockField) readRequest.getField(name)).getFieldQuery())
+                    )
+                );
+            return new DefaultPlcReadResponse((DefaultPlcReadRequest) readRequest, response);
+        });
+    }
+
+    @Override
+    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
+        return CompletableFuture.supplyAsync(() -> {
+            Validate.notNull(device, "No device is set in the mock connection!");
+            LOGGER.debug("Sending write request to MockDevice");
+            Map<String, PlcResponseCode> response = writeRequest.getFieldNames().stream()
+                .collect(Collectors.toMap(
+                    Function.identity(),
+                    name -> device.write(((MockField) writeRequest.getField(name)).getFieldQuery(), ((MockField) writeRequest.getField(name)).getValues())
+                    )
+                );
+            return new DefaultPlcWriteResponse((DefaultPlcWriteRequest) writeRequest, response);
+        });
+    }
+
+    @Override
+    public CompletableFuture<PlcSubscriptionResponse> subscribe(PlcSubscriptionRequest subscriptionRequest) {
+        return CompletableFuture.supplyAsync(() -> {
+            Validate.notNull(device, "No device is set in the mock connection!");
+            LOGGER.debug("Sending subsribe request to MockDevice");
+            Map<String, Pair<PlcResponseCode, PlcSubscriptionHandle>> response = subscriptionRequest.getFieldNames().stream()
+                .collect(Collectors.toMap(
+                    Function.identity(),
+                    name -> device.subscribe(((MockField) subscriptionRequest.getField(name)).getFieldQuery())
+                    )
+                );
+            return new DefaultPlcSubscriptionResponse((DefaultPlcSubscriptionRequest) subscriptionRequest, response);
+        });
+    }
+
+    @Override
+    public CompletableFuture<PlcUnsubscriptionResponse> unsubscribe(PlcUnsubscriptionRequest unsubscriptionRequest) {
+        return CompletableFuture.supplyAsync(() -> {
+            Validate.notNull(device, "No device is set in the mock connection!");
+            LOGGER.debug("Sending subsribe request to MockDevice");
+            device.unsubscribe();
+            return new DefaultPlcUnsubscriptionResponse((DefaultPlcUnsubscriptionRequest) unsubscriptionRequest);
+        });
+    }
+
+    @Override
+    public PlcConsumerRegistration register(Consumer<PlcSubscriptionEvent> consumer, Collection<PlcSubscriptionHandle> handles) {
+        return device.register(consumer, handles);
+    }
+
+    @Override
+    public void unregister(PlcConsumerRegistration registration) {
+        device.unregister(registration);
     }
 
     @Override
     public PlcWriteRequest.Builder writeRequestBuilder() {
-        throw new PlcUnsupportedOperationException("Write not supported by Mock Driver");
+        return new DefaultPlcWriteRequest.Builder(this, new MockFieldHandler());
     }
 
     @Override
     public PlcSubscriptionRequest.Builder subscriptionRequestBuilder() {
-        throw new PlcUnsupportedOperationException("Subscription not supported by Mock Driver");
+        return new DefaultPlcSubscriptionRequest.Builder(this, new MockFieldHandler());
     }
 
     @Override
     public PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder() {
-        throw new PlcUnsupportedOperationException("Subscription not supported by Mock Driver");
+        return new DefaultPlcUnsubscriptionRequest.Builder(this);
     }
 
     public PlcAuthentication getAuthentication() {
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockDriver.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockDriver.java
index c693b84..3476794 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockDriver.java
+++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockDriver.java
@@ -23,8 +23,18 @@ import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Mocking Driver that keeps a Map of references to Connections so that you can fetch a reference to a connection
+ * which will be acquired by someone else (via the connection string).
+ * This allows for efficient Mocking.
+ */
 public class PlcMockDriver implements PlcDriver {
 
+    private Map<String, PlcConnection> connectionMap = new ConcurrentHashMap<>();
+
     @Override
     public String getProtocolCode() {
         return "mock";
@@ -36,13 +46,17 @@ public class PlcMockDriver implements PlcDriver {
     }
 
     @Override
-    public PlcConnection connect(String url) {
-        return new PlcMockConnection(null);
+    public PlcConnection connect(String url) throws PlcConnectionException {
+        return connect(url, null);
     }
 
     @Override
-    public PlcConnection connect(String url, PlcAuthentication authentication) {
-        return new PlcMockConnection(authentication);
+    public PlcConnection connect(String url, PlcAuthentication authentication) throws PlcConnectionException {
+        String deviceName = url.substring(5);
+        if (deviceName.isEmpty()) {
+            throw new PlcConnectionException("Invalid URL: no device name given.");
+        }
+        return connectionMap.computeIfAbsent(deviceName, name -> new PlcMockConnection(authentication));
     }
 
 }
diff --git a/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.java b/plc4j/protocols/driver-bases/test/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.java
similarity index 100%
rename from plc4j/protocols/test/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.java
rename to plc4j/protocols/driver-bases/test/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.java
diff --git a/plc4j/protocols/pom.xml b/plc4j/protocols/pom.xml
index f4cbe1d..2d18946 100644
--- a/plc4j/protocols/pom.xml
+++ b/plc4j/protocols/pom.xml
@@ -17,7 +17,8 @@
   limitations under the License.
 
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
   <modelVersion>4.0.0</modelVersion>
 
@@ -43,7 +44,6 @@
     <module>iso-tp</module>
     <module>modbus</module>
     <module>s7</module>
-    <module>test</module>
 
     <module>benchmarks</module>
   </modules>
diff --git a/plc4j/protocols/test/pom.xml b/plc4j/protocols/test/pom.xml
deleted file mode 100644
index d415346..0000000
--- a/plc4j/protocols/test/pom.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-  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.
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.plc4x</groupId>
-    <artifactId>plc4j-protocols</artifactId>
-    <version>0.3.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>plc4j-protocol-test</artifactId>
-  <name>PLC4J: Protocol: TEST</name>
-  <description>Test implementation of a PLC4X driver.</description>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-api</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-  </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java
deleted file mode 100644
index 999a4ac..0000000
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java
+++ /dev/null
@@ -1,50 +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.mock;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
-import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
-import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
-import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
-
-import java.util.Collection;
-import java.util.function.Consumer;
-
-/**
- * Mock Object to do assertions on.
- */
-public interface MockDevice {
-
-    Pair<PlcResponseCode, BaseDefaultFieldItem> read(String fieldQuery);
-
-    PlcResponseCode write(String fieldQuery, Object value);
-
-    Pair<PlcResponseCode, PlcSubscriptionHandle> subscribe(String fieldQuery);
-
-    void unsubscribe();
-
-    // TODO: this might not be right here as you are not really register at the device, rather on the connection
-    PlcConsumerRegistration register(Consumer<PlcSubscriptionEvent> consumer, Collection<PlcSubscriptionHandle> handles);
-
-    // TODO: this might not be right here as you are not really register at the device, rather on the connection
-    void unregister(PlcConsumerRegistration registration);
-}
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockField.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockField.java
deleted file mode 100644
index b7dccc9..0000000
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockField.java
+++ /dev/null
@@ -1,49 +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.mock;
-
-import org.apache.plc4x.java.api.model.PlcField;
-
-import java.util.List;
-
-public class MockField implements PlcField {
-
-    private final String fieldQuery;
-
-    private final List<Object> values;
-
-    public MockField(String fieldQuery) {
-        this.fieldQuery = fieldQuery;
-        values = null;
-    }
-
-    public MockField(String fieldQuery, List<Object> values) {
-        this.fieldQuery = fieldQuery;
-        this.values = values;
-    }
-
-    public String getFieldQuery() {
-        return fieldQuery;
-    }
-
-    public List<Object> getValues() {
-        return values;
-    }
-}
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockFieldHandler.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockFieldHandler.java
deleted file mode 100644
index 055769f..0000000
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockFieldHandler.java
+++ /dev/null
@@ -1,103 +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.mock;
-
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.base.connection.DefaultPlcFieldHandler;
-import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
-
-public class MockFieldHandler extends DefaultPlcFieldHandler {
-
-    @Override
-    public PlcField createField(String fieldQuery) throws PlcInvalidFieldException {
-        return new MockField(fieldQuery);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeByte(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeShort(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeLong(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeBigDecimal(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeString(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeTime(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeDate(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-
-    @Override
-    public BaseDefaultFieldItem encodeByteArray(PlcField field, Object[] values) {
-        return new MockFieldItem(values);
-    }
-}
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java
deleted file mode 100644
index 9dc802f..0000000
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java
+++ /dev/null
@@ -1,186 +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.mock;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.api.messages.*;
-import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
-import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
-import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
-import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-public class PlcMockConnection implements PlcConnection, PlcReader, PlcWriter, PlcSubscriber {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(PlcMockConnection.class);
-
-    private final PlcAuthentication authentication;
-
-    private MockDevice device;
-
-    PlcMockConnection(PlcAuthentication authentication) {
-        this.authentication = authentication;
-    }
-
-    public MockDevice getDevice() {
-        return device;
-    }
-
-    public void setDevice(MockDevice device) {
-        LOGGER.info("Set Mock Devie on Mock Connection {} with device {}", this, device);
-        this.device = device;
-    }
-
-    @Override
-    public void connect() {
-        // do nothing
-    }
-
-    @Override
-    public boolean isConnected() {
-        return device != null;
-    }
-
-    @Override
-    public void close() {
-        LOGGER.info("Closing MockConnection with device {}", device);
-    }
-
-    @Override
-    public PlcConnectionMetadata getMetadata() {
-        return new PlcConnectionMetadata() {
-            @Override
-            public boolean canRead() {
-                return true;
-            }
-
-            @Override
-            public boolean canWrite() {
-                return true;
-            }
-
-            @Override
-            public boolean canSubscribe() {
-                return true;
-            }
-        };
-    }
-
-    @Override
-    public PlcReadRequest.Builder readRequestBuilder() {
-        return new DefaultPlcReadRequest.Builder(this, new MockFieldHandler());
-    }
-
-    @Override
-    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
-        return CompletableFuture.supplyAsync(() -> {
-            Validate.notNull(device, "No device is set in the mock connection!");
-            LOGGER.debug("Sending read request to MockDevice");
-            Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> response = readRequest.getFieldNames().stream()
-                .collect(Collectors.toMap(
-                    Function.identity(),
-                    name -> device.read(((MockField) readRequest.getField(name)).getFieldQuery())
-                    )
-                );
-            return new DefaultPlcReadResponse((DefaultPlcReadRequest) readRequest, response);
-        });
-    }
-
-    @Override
-    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
-        return CompletableFuture.supplyAsync(() -> {
-            Validate.notNull(device, "No device is set in the mock connection!");
-            LOGGER.debug("Sending write request to MockDevice");
-            Map<String, PlcResponseCode> response = writeRequest.getFieldNames().stream()
-                .collect(Collectors.toMap(
-                    Function.identity(),
-                    name -> device.write(((MockField) writeRequest.getField(name)).getFieldQuery(), ((MockField) writeRequest.getField(name)).getValues())
-                    )
-                );
-            return new DefaultPlcWriteResponse((DefaultPlcWriteRequest) writeRequest, response);
-        });
-    }
-
-    @Override
-    public CompletableFuture<PlcSubscriptionResponse> subscribe(PlcSubscriptionRequest subscriptionRequest) {
-        return CompletableFuture.supplyAsync(() -> {
-            Validate.notNull(device, "No device is set in the mock connection!");
-            LOGGER.debug("Sending subsribe request to MockDevice");
-            Map<String, Pair<PlcResponseCode, PlcSubscriptionHandle>> response = subscriptionRequest.getFieldNames().stream()
-                .collect(Collectors.toMap(
-                    Function.identity(),
-                    name -> device.subscribe(((MockField) subscriptionRequest.getField(name)).getFieldQuery())
-                    )
-                );
-            return new DefaultPlcSubscriptionResponse((DefaultPlcSubscriptionRequest) subscriptionRequest, response);
-        });
-    }
-
-    @Override
-    public CompletableFuture<PlcUnsubscriptionResponse> unsubscribe(PlcUnsubscriptionRequest unsubscriptionRequest) {
-        return CompletableFuture.supplyAsync(() -> {
-            Validate.notNull(device, "No device is set in the mock connection!");
-            LOGGER.debug("Sending subsribe request to MockDevice");
-            device.unsubscribe();
-            return new DefaultPlcUnsubscriptionResponse((DefaultPlcUnsubscriptionRequest) unsubscriptionRequest);
-        });
-    }
-
-    @Override
-    public PlcConsumerRegistration register(Consumer<PlcSubscriptionEvent> consumer, Collection<PlcSubscriptionHandle> handles) {
-        return device.register(consumer, handles);
-    }
-
-    @Override
-    public void unregister(PlcConsumerRegistration registration) {
-        device.unregister(registration);
-    }
-
-    @Override
-    public PlcWriteRequest.Builder writeRequestBuilder() {
-        return new DefaultPlcWriteRequest.Builder(this, new MockFieldHandler());
-    }
-
-    @Override
-    public PlcSubscriptionRequest.Builder subscriptionRequestBuilder() {
-        return new DefaultPlcSubscriptionRequest.Builder(this, new MockFieldHandler());
-    }
-
-    @Override
-    public PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder() {
-        return new DefaultPlcUnsubscriptionRequest.Builder(this);
-    }
-
-    public PlcAuthentication getAuthentication() {
-        return authentication;
-    }
-}
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockDriver.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockDriver.java
deleted file mode 100644
index 3ff5dd4..0000000
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockDriver.java
+++ /dev/null
@@ -1,63 +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.mock;
-
-import org.apache.plc4x.java.spi.PlcDriver;
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-
-import java.util.Map;
-import java.util.WeakHashMap;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Mocking Driver that keeps a Map of references to Connections so that you can fetch a reference to a connection
- * which will be acquired by someone else (via the connection string).
- * This allows for efficient Mocking.
- */
-public class PlcMockDriver implements PlcDriver {
-
-    private Map<String, PlcConnection> connectionMap = new ConcurrentHashMap<>();
-
-    @Override
-    public String getProtocolCode() {
-        return "mock";
-    }
-
-    @Override
-    public String getProtocolName() {
-        return "Mock Protocol Implementation";
-    }
-
-    @Override
-    public PlcConnection connect(String url) throws PlcConnectionException {
-        return connect(url, null);
-    }
-
-    @Override
-    public PlcConnection connect(String url, PlcAuthentication authentication) throws PlcConnectionException {
-        String deviceName = url.substring(5);
-        if (deviceName.isEmpty()) {
-            throw new PlcConnectionException("Invalid URL: no device name given.");
-        }
-        return connectionMap.computeIfAbsent(deviceName, name -> new PlcMockConnection(authentication));
-    }
-
-}
diff --git a/plc4j/protocols/test/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver b/plc4j/protocols/test/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
deleted file mode 100644
index ebff4aa..0000000
--- a/plc4j/protocols/test/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
+++ /dev/null
@@ -1,19 +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.
-#
-org.apache.plc4x.java.mock.PlcMockDriver
diff --git a/plc4j/utils/opm/pom.xml b/plc4j/utils/opm/pom.xml
index a0fbda1..4efbf62 100644
--- a/plc4j/utils/opm/pom.xml
+++ b/plc4j/utils/opm/pom.xml
@@ -17,7 +17,8 @@
   specific language governing permissions and limitations
   under the License.
   -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
   <modelVersion>4.0.0</modelVersion>
 
@@ -75,7 +76,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-test</artifactId>
+      <artifactId>plc4j-protocol-driver-base-test</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>