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 c4de71da42c09d339f4abc294b36f68610337321 Author: Julian Feinauer <j.feina...@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; + } +}