You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2018/10/31 21:06:35 UTC

[incubator-plc4x] branch add-simple-mock-driver created (now 3d10fbc)

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

jfeinauer pushed a change to branch add-simple-mock-driver
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git.


      at 3d10fbc  Add Simple Mock Driver.

This branch includes the following new commits:

     new 3d10fbc  Add Simple Mock Driver.

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.



[incubator-plc4x] 01/01: Add Simple Mock Driver.

Posted by jf...@apache.org.
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 3d10fbc6a1edf517f7e468e3b588754bfdc2a4ad
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Wed Oct 31 22:05:40 2018 +0100

    Add Simple Mock Driver.
---
 .../org/apache/plc4x/java/mock/MockConnection.java | 85 ++++++++++++++++++----
 .../org/apache/plc4x/java/mock/MockDevice.java     | 34 +++++++++
 .../org/apache/plc4x/java/mock/MockDriverTest.java | 73 +++++++++++++++++++
 .../java/org/apache/plc4x/java/mock/MockField.java | 36 +++++++++
 .../apache/plc4x/java/mock/MockFieldHandler.java   | 33 +++++++++
 .../org/apache/plc4x/java/mock/MockReader.java     | 51 +++++++++++++
 .../base/connection/DefaultPlcFieldHandler.java    |  4 +
 .../java/base/connection/PlcFieldHandler.java      |  3 +
 .../java/mock/connection/PlcMockConnection.java    | 26 +++++++
 .../plc4x/java/mock/connection/PlcMockDriver.java  | 50 +++++++++++++
 10 files changed, 382 insertions(+), 13 deletions(-)

diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java
index d44fc5d..aaa077d 100644
--- a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java
+++ b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java
@@ -18,35 +18,94 @@ under the License.
 */
 package org.apache.plc4x.java.mock;
 
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandler;
-import io.netty.channel.ChannelInitializer;
+import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
-import org.apache.plc4x.java.base.connection.TestChannelFactory;
+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.metadata.PlcConnectionMetadata;
+import org.apache.plc4x.java.base.messages.DefaultPlcReadRequest;
 
-import java.util.concurrent.CompletableFuture;
-
-public class MockConnection extends AbstractPlcConnection {
+public class MockConnection implements PlcConnection {
 
     private final PlcAuthentication authentication;
 
+    private boolean isConnected = false;
+    private MockDevice device;
+
     MockConnection(PlcAuthentication authentication) {
-        super(new TestChannelFactory());
         this.authentication = authentication;
     }
 
+    public MockDevice getDevice() {
+        return device;
+    }
+
+    public void setDevice(MockDevice device) {
+        this.device = device;
+    }
+
+    @Override
+    public void connect() {
+        // do nothing
+    }
+
     @Override
-    protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) {
-        return new ChannelInitializer() {
+    public boolean isConnected() {
+        // is connected if a device is set
+        return device != null;
+    }
+
+    @Override
+    public void close() {
+        // unset device
+        this.device = null;
+    }
+
+    @Override
+    public PlcConnectionMetadata getMetadata() {
+        return new PlcConnectionMetadata() {
+            @Override
+            public boolean canRead() {
+                return true;
+            }
+
             @Override
-            protected void initChannel(Channel channel) {
+            public boolean canWrite() {
+                return false;
+            }
+
+            @Override
+            public boolean canSubscribe() {
+                return false;
             }
         };
     }
 
+    @Override
+    public PlcReadRequest.Builder readRequestBuilder() {
+        return new DefaultPlcReadRequest.Builder(new MockReader(device), new MockFieldHandler());
+    }
+
+    @Override
+    public PlcWriteRequest.Builder writeRequestBuilder() {
+        throw new PlcUnsupportedOperationException("Write not supported by Mock Driver");
+    }
+
+    @Override
+    public PlcSubscriptionRequest.Builder subscriptionRequestBuilder() {
+        throw new PlcUnsupportedOperationException("Subscription not supported by Mock Driver");
+    }
+
+    @Override
+    public PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder() {
+        throw new PlcUnsupportedOperationException("Subscription not supported by Mock Driver");
+    }
+
     public PlcAuthentication getAuthentication() {
         return authentication;
     }
-
 }
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockDevice.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockDevice.java
new file mode 100644
index 0000000..ed32c3f
--- /dev/null
+++ b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockDevice.java
@@ -0,0 +1,34 @@
+/*
+ * 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.model.PlcField;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
+
+/**
+ * Mock Object to do assertions on.
+ */
+public interface MockDevice {
+
+    Pair<PlcResponseCode, BaseDefaultFieldItem> read(PlcField field);
+
+}
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockDriverTest.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockDriverTest.java
new file mode 100644
index 0000000..05bddcf
--- /dev/null
+++ b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockDriverTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.PlcDriverManager;
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class MockDriverTest {
+
+    private final PlcDriverManager driverManager = new PlcDriverManager();
+
+    @Test
+    public void useMockDriver_noDevice_isNotConnected() throws Exception {
+        PlcConnection connection = driverManager.getConnection("mock:dummy");
+
+        assertFalse(connection.isConnected());
+    }
+
+    @Test
+    public void useMockDriver_deviceSet_isConnected() throws Exception {
+        MockConnection connection = (MockConnection) driverManager.getConnection("mock:dummy");
+        MockDevice mock = Mockito.mock(MockDevice.class);
+        connection.setDevice(mock);
+
+        assertTrue(connection.isConnected());
+    }
+
+    @Test
+    public void mockDriver_assertSimpleRequest() throws PlcConnectionException {
+        MockConnection connection = (MockConnection) driverManager.getConnection("mock:dummy");
+        MockDevice mock = Mockito.mock(MockDevice.class);
+        when(mock.read(any())).thenReturn(Pair.of(PlcResponseCode.OK, new DefaultLongFieldItem(1L)));
+        connection.setDevice(mock);
+
+        connection.readRequestBuilder()
+            .addItem("item1", "myPlcField")
+            .build()
+            .execute();
+
+        // Verify the call
+        verify(mock, times(1)).read(any());
+    }
+}
\ No newline at end of file
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockField.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockField.java
new file mode 100644
index 0000000..2762407
--- /dev/null
+++ b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockField.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+public class MockField implements PlcField {
+
+    private final String fieldQuery;
+
+    public MockField(String fieldQuery) {
+
+        this.fieldQuery = fieldQuery;
+    }
+
+    public String getFieldQuery() {
+        return fieldQuery;
+    }
+}
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockFieldHandler.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockFieldHandler.java
new file mode 100644
index 0000000..a8893e2
--- /dev/null
+++ b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockFieldHandler.java
@@ -0,0 +1,33 @@
+/*
+ * 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;
+
+public class MockFieldHandler extends DefaultPlcFieldHandler {
+
+    @Override
+    public PlcField createField(String fieldQuery) throws PlcInvalidFieldException {
+        return new MockField(fieldQuery);
+    }
+
+}
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockReader.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockReader.java
new file mode 100644
index 0000000..79e887f
--- /dev/null
+++ b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockReader.java
@@ -0,0 +1,51 @@
+/*
+ * 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(readRequest.getField(name))));
+        return CompletableFuture.completedFuture(new DefaultPlcReadResponse((DefaultPlcReadRequest)readRequest, response));
+    }
+
+}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/DefaultPlcFieldHandler.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/DefaultPlcFieldHandler.java
index e74be1a..6b90bab 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/DefaultPlcFieldHandler.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/DefaultPlcFieldHandler.java
@@ -23,6 +23,10 @@ import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
+/**
+ * Base Implementation of {@link PlcFieldHandler} which throws a {@link PlcRuntimeException} for all
+ * encodeXXX methods.
+ */
 public abstract class DefaultPlcFieldHandler implements PlcFieldHandler {
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java
index cddf0c7..146e685 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java
@@ -22,6 +22,9 @@ import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
+/**
+ * Field Handler which handles the parsing of string to {@link PlcField} and the encoding of retrieved plc values.
+ */
 public interface PlcFieldHandler {
 
     PlcField createField(String fieldQuery) throws PlcInvalidFieldException;
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/mock/connection/PlcMockConnection.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/mock/connection/PlcMockConnection.java
new file mode 100644
index 0000000..dbae61f
--- /dev/null
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/mock/connection/PlcMockConnection.java
@@ -0,0 +1,26 @@
+/*
+ * 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.connection;
+
+/**
+ * Connection which is used for mocking.
+ */
+public class PlcMockConnection {
+}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/mock/connection/PlcMockDriver.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/mock/connection/PlcMockDriver.java
new file mode 100644
index 0000000..5effc7e
--- /dev/null
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/mock/connection/PlcMockDriver.java
@@ -0,0 +1,50 @@
+/*
+ * 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.connection;
+
+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.spi.PlcDriver;
+
+/**
+ * Driver which can be used for mocking.
+ */
+public class PlcMockDriver implements PlcDriver {
+    @Override
+    public String getProtocolCode() {
+        return "mock";
+    }
+
+    @Override
+    public String getProtocolName() {
+        return null;
+    }
+
+    @Override
+    public PlcConnection connect(String url) {
+        return null;
+    }
+
+    @Override
+    public PlcConnection connect(String url, PlcAuthentication authentication) {
+        return null;
+    }
+}