This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
commit 9e05e644adfc88d22e13ba04374229e94e9cff3e Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Thu Jul 26 13:37:59 2018 +0200 modbus protocol test: increased readability by extracting duplicate code --- .../java/modbus/netty/Plc4XModbusProtocolTest.java | 135 ++++++++------------- 1 file changed, 49 insertions(+), 86 deletions(-) diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java index 01b8d75..0a40696 100644 --- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java +++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java @@ -29,6 +29,7 @@ import org.apache.plc4x.java.api.messages.*; import org.apache.plc4x.java.api.messages.items.ReadResponseItem; import org.apache.plc4x.java.api.messages.items.ResponseItem; import org.apache.plc4x.java.api.messages.items.WriteResponseItem; +import org.apache.plc4x.java.api.model.Address; import org.apache.plc4x.java.api.types.ResponseCode; import org.apache.plc4x.java.modbus.model.*; import org.junit.Before; @@ -96,98 +97,60 @@ public class Plc4XModbusProtocolTest { public static Collection<Object[]> data() { return streamOfBigEndianDataTypePairs() .map(pair -> Stream.of( - ImmutablePair.of( - new PlcRequestContainer<>( - PlcReadRequest - .builder() - .addItem(pair.getLeft().getClass(), CoilModbusAddress.of("coil:1")) - .build(), new CompletableFuture<>()), - // Coils are a bit different so the only know 1 or 0. So we know streamOfBigEndianDataTypePairs are - // all positive so we return one byte with the first bit set - new ModbusTcpPayload((short) 0, (short) 0, new ReadCoilsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x1}))) - ), - ImmutablePair.of( - new PlcRequestContainer<>( - PlcWriteRequest - .builder() - .addItem(CoilModbusAddress.of("coil:1"), pair.getLeft()) - .build(), new CompletableFuture<>()), - // Coils are a bit different so the only know 1 or 0. So we know streamOfBigEndianDataTypePairs are - // all positive so we return one byte with the first bit set - new ModbusTcpPayload((short) 0, (short) 0, new WriteSingleCoilResponse(1, 1)) - ), + producePair(pair.getLeft().getClass(), CoilModbusAddress.of("coil:1"), new ReadCoilsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x1}))), + producePair(CoilModbusAddress.of("coil:1"), new WriteSingleCoilResponse(1, 1), pair.getLeft()), /* Read request no supported on maskwrite so how to handle? - ImmutablePair.of( - new PlcRequestContainer<>( - PlcReadRequest - .builder() - .addItem(pair.left.getClass(), MaskWriteRegisterModbusAddress.of("maskwrite:1/1/2")) - .build(), new CompletableFuture<>()), - new ModbusTcpPayload((short) 0, (short) 0, new MaskWriteRegisterResponse(1, 1, 2)) - ), */ - ImmutablePair.of( - new PlcRequestContainer<>( - PlcWriteRequest - .builder() - .addItem(MaskWriteRegisterModbusAddress.of("maskwrite:1/1/2"), pair.getLeft()) - .build(), new CompletableFuture<>()), - new ModbusTcpPayload((short) 0, (short) 0, new MaskWriteRegisterResponse(1, 1, 2)) - ), - ImmutablePair.of( - new PlcRequestContainer<>( - PlcReadRequest - .builder() - .addItem(pair.getLeft().getClass(), ReadDiscreteInputsModbusAddress.of("readdiscreteinputs:1")) - .build(), new CompletableFuture<>()), - // Coils are a bit different so the only know 1 or 0. So we know streamOfBigEndianDataTypePairs are - // all positive so we return one byte with the first bit set - new ModbusTcpPayload((short) 0, (short) 0, new ReadDiscreteInputsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x01}))) - ), - ImmutablePair.of( - new PlcRequestContainer<>( - PlcReadRequest - .builder() - .addItem(pair.getLeft().getClass(), ReadHoldingRegistersModbusAddress.of("readholdingregisters:1")) - .build(), new CompletableFuture<>()), - new ModbusTcpPayload((short) 0, (short) 0, new ReadHoldingRegistersResponse(Unpooled.wrappedBuffer(cutRegister(pair.getRight())))) - ), - ImmutablePair.of( - new PlcRequestContainer<>( - PlcReadRequest - .builder() - .addItem(pair.getLeft().getClass(), ReadInputRegistersModbusAddress.of("readinputregisters:1")) - .build(), new CompletableFuture<>()), - new ModbusTcpPayload((short) 0, (short) 0, new ReadInputRegistersResponse(Unpooled.wrappedBuffer(cutRegister(pair.getRight())))) - ), - ImmutablePair.of( - new PlcRequestContainer<>( - PlcWriteRequest - .builder() - .addItem((Class) pair.getLeft().getClass(), CoilModbusAddress.of("coil:1"), pair.getLeft(), pair.getLeft(), pair.getLeft()) - .build(), new CompletableFuture<>()), - new ModbusTcpPayload((short) 0, (short) 0, new WriteMultipleCoilsResponse(1, 3)) - ), - ImmutablePair.of( - new PlcRequestContainer<>( - PlcWriteRequest - .builder() - .addItem((Class) pair.getLeft().getClass(), RegisterModbusAddress.of("register:1"), pair.getLeft(), pair.getLeft(), pair.getLeft()) - .build(), new CompletableFuture<>()), - new ModbusTcpPayload((short) 0, (short) 0, new WriteMultipleRegistersResponse(1, 3)) - ), - ImmutablePair.of( - new PlcRequestContainer<>( - PlcWriteRequest - .builder() - .addItem(RegisterModbusAddress.of("register:1"), pair.getLeft()) - .build(), new CompletableFuture<>()), - new ModbusTcpPayload((short) 0, (short) 0, new WriteSingleRegisterResponse(1, cutRegister(pair.getRight())[0])) - ) + producePair(pair.getLeft().getClass(), MaskWriteRegisterModbusAddress.of("maskwrite:1/1/2"), new MaskWriteRegisterResponse(1, 1, 2)), + */ + producePair(MaskWriteRegisterModbusAddress.of("maskwrite:1/1/2"), new MaskWriteRegisterResponse(1, 1, 2), pair.getLeft()), + producePair(pair.getLeft().getClass(), ReadDiscreteInputsModbusAddress.of("readdiscreteinputs:1"), new ReadDiscreteInputsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x01}))), + producePair(pair.getLeft().getClass(), ReadHoldingRegistersModbusAddress.of("readholdingregisters:1"), new ReadHoldingRegistersResponse(Unpooled.wrappedBuffer(cutRegister(pair.getRight())))), + producePair(pair.getLeft().getClass(), ReadInputRegistersModbusAddress.of("readinputregisters:1"), new ReadInputRegistersResponse(Unpooled.wrappedBuffer(cutRegister(pair.getRight())))), + producePair(CoilModbusAddress.of("coil:1"), new WriteMultipleCoilsResponse(1, 3), pair.getLeft(), pair.getLeft(), pair.getLeft()), + producePair(RegisterModbusAddress.of("register:1"), new WriteMultipleRegistersResponse(1, 3), pair.getLeft(), pair.getLeft(), pair.getLeft()), + producePair(RegisterModbusAddress.of("register:1"), new WriteSingleRegisterResponse(1, cutRegister(pair.getRight())[0]), pair.getLeft()) )) .flatMap(stream -> stream) .map(pair -> new Object[]{pair.left.getRequest().getRequestItem().orElseThrow(IllegalStateException::new).getDatatype().getSimpleName(), pair.left, pair.left.getResponseFuture(), pair.left.getRequest().getClass().getSimpleName(), pair.right, pair.right.getModbusPdu().getClass().getSimpleName()}).collect(Collectors.toList()); } + private static ImmutablePair<PlcRequestContainer<PlcReadRequest, PlcResponse>, ModbusTcpPayload> producePair(Class type, Address address, ModbusPdu modbusPdu) { + return ImmutablePair.of( + new PlcRequestContainer<>( + PlcReadRequest + .builder() + .addItem(type, address) + .build(), new CompletableFuture<>()), + new ModbusTcpPayload((short) 0, (short) 0, modbusPdu) + ); + } + + @SuppressWarnings("unchecked") + private static ImmutablePair<PlcRequestContainer<PlcWriteRequest, PlcResponse>, ModbusTcpPayload> producePair(Address address, ModbusPdu modbusPdu, Object... values) { + if (values.length == 0) { + throw new IllegalArgumentException("At least one value ist required"); + } + if (values.length == 1) { + return ImmutablePair.of( + new PlcRequestContainer<>( + PlcWriteRequest + .builder() + .addItem(address, values[0]) + .build(), new CompletableFuture<>()), + new ModbusTcpPayload((short) 0, (short) 0, modbusPdu) + ); + } else { + return ImmutablePair.of( + new PlcRequestContainer<>( + PlcWriteRequest + .builder() + .addItem((Class<Object>) values[0].getClass(), address, values) + .build(), new CompletableFuture<>()), + new ModbusTcpPayload((short) 0, (short) 0, modbusPdu) + ); + } + } + private static byte[] cutRegister(byte[] right) { return new byte[]{right.length > 1 ? right[right.length - 2] : 0x0, right[right.length - 1]}; }