This is an automated email from the ASF dual-hosted git repository. jfeinauer pushed a commit to branch add-simple-mock-driver in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
commit 6468632528d47955551f6ca7b160b53a1f3f9ba6 Author: Julian Feinauer <j.feina...@pragmaticminds.de> AuthorDate: Thu Nov 1 21:06:31 2018 +0100 First draft. --- .../org/apache/plc4x/java/mock/MockReader.java | 51 ---------------------- .../org/apache/plc4x/java/mock/MockDevice.java | 3 ++ .../java/org/apache/plc4x/java/mock/MockField.java | 0 .../apache/plc4x/java/mock/MockFieldHandler.java | 0 .../apache/plc4x/java/mock/PlcMockConnection.java | 30 ++++++++++--- .../org/apache/plc4x/java/mock/PlcMockDriver.java | 22 ++++++++-- .../apache/plc4x/java/mock/PlcMockDriverTest.java} | 27 ++++++++---- 7 files changed, 62 insertions(+), 71 deletions(-) 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/MockDevice.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java similarity index 92% rename from plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java rename to plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockDevice.java index def0589..b0e1075 100644 --- a/plc4j/protocols/driver-bases/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 @@ -31,4 +31,7 @@ public interface MockDevice { Pair<PlcResponseCode, BaseDefaultFieldItem> read(String fieldQuery); + // TODO Implement this + // void write(String fieldQuery, BaseDefaultFieldItem value); + } diff --git a/plc4j/protocols/driver-bases/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 similarity index 100% copy from plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockField.java copy to plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockField.java diff --git a/plc4j/protocols/driver-bases/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 similarity index 100% rename from plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockFieldHandler.java rename to plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/MockFieldHandler.java diff --git a/plc4j/protocols/driver-bases/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 similarity index 70% rename from plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java rename to plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java index 9e834ec..277f69f 100644 --- a/plc4j/protocols/driver-bases/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 @@ -18,25 +18,34 @@ under the License. */ package org.apache.plc4x.java.mock; +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.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; -public class PlcMockConnection implements PlcConnection { +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; +import java.util.stream.Collectors; +public class PlcMockConnection implements PlcConnection, PlcReader { + + private final String name; private final PlcAuthentication authentication; private boolean isConnected = false; private MockDevice device; - PlcMockConnection(PlcAuthentication authentication) { + PlcMockConnection(String name, PlcAuthentication authentication) { + this.name = name; this.authentication = authentication; } @@ -87,7 +96,14 @@ public class PlcMockConnection implements PlcConnection { @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) { + 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)); } @Override diff --git a/plc4j/protocols/driver-bases/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 similarity index 63% rename from plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/PlcMockDriver.java rename to plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockDriver.java index c693b84..3a38a86 100644 --- a/plc4j/protocols/driver-bases/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 @@ -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.WeakHashMap; + +/** + * 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 string). + * This allows for efficient Mocking. + */ public class PlcMockDriver implements PlcDriver { + private Map<String, PlcConnection> connectionMap = new WeakHashMap<>(); + @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(name, authentication)); } } diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockField.java b/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.java similarity index 60% rename from plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockField.java rename to plc4j/protocols/test/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.java index e570b2b..b2cae5e 100644 --- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/mock/MockField.java +++ b/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.java @@ -19,18 +19,27 @@ package org.apache.plc4x.java.mock; -import org.apache.plc4x.java.api.model.PlcField; +import org.apache.plc4x.java.api.PlcConnection; +import org.apache.plc4x.java.api.exceptions.PlcConnectionException; +import org.junit.Test; -public class MockField implements PlcField { +import static org.junit.Assert.*; - private final String fieldQuery; - public MockField(String fieldQuery) { - this.fieldQuery = fieldQuery; - } +public class PlcMockDriverTest { + + private final PlcMockDriver driver = new PlcMockDriver(); + + @Test + public void fetchTwoConnections_areEqual() throws PlcConnectionException { + PlcConnection conn1 = driver.connect("mock:123"); + PlcConnection conn2 = driver.connect("mock:123"); - public String getFieldQuery() { - return fieldQuery; + assertEquals(conn1, conn2); } -} + @Test + public void exampleUsage() { + + } +} \ No newline at end of file