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 b2ff46249b6506f9ffcf686195c4f694b00fc659 Author: Christofer Dutz <christofer.d...@c-ware.de> AuthorDate: Tue Oct 30 10:42:08 2018 +0100 - Removed obsolete classes (S7TypeDecoder and S7TypeEncoder) - Added tests for S7RequestSizeCalculator and S7RequestSizeCalculator --- plc4j/protocols/s7/pom.xml | 5 + .../s7/netty/util/S7RequestSizeCalculator.java | 12 -- .../s7/netty/util/S7ResponseSizeEstimator.java | 14 +- .../plc4x/java/s7/netty/util/S7TypeDecoder.java | 96 ------------- .../plc4x/java/s7/netty/util/S7TypeEncoder.java | 153 --------------------- .../s7/netty/util/S7RequestSizeCalculatorTest.java | 141 +++++++++++++++++++ .../s7/netty/util/S7ResponseSizeEstimatorTest.java | 122 ++++++++++++++++ 7 files changed, 271 insertions(+), 272 deletions(-) diff --git a/plc4j/protocols/s7/pom.xml b/plc4j/protocols/s7/pom.xml index 198f92a..ce0b9bf 100644 --- a/plc4j/protocols/s7/pom.xml +++ b/plc4j/protocols/s7/pom.xml @@ -91,6 +91,11 @@ <artifactId>commons-io</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>org.apache.plc4x</groupId> diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7RequestSizeCalculator.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7RequestSizeCalculator.java index bfebfd6..b8fe22c 100644 --- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7RequestSizeCalculator.java +++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7RequestSizeCalculator.java @@ -84,10 +84,6 @@ public class S7RequestSizeCalculator { } private static short getRequestParameterSize(S7Parameter parameter) { - if (parameter == null) { - return 0; - } - switch (parameter.getType()) { case READ_VAR: case WRITE_VAR: @@ -130,10 +126,6 @@ public class S7RequestSizeCalculator { } private static short getRequestPayloadSize(S7Payload payload) { - if (payload == null) { - return 0; - } - switch (payload.getType()) { case WRITE_VAR: return getRequestWriteVarPayloadSize((VarPayload) payload); @@ -152,10 +144,6 @@ public class S7RequestSizeCalculator { } private static short getRequestWriteVarPayloadItemSize(VarPayloadItem varPayloadItem) { - if(varPayloadItem == null) { - return 0; - } - // A var payload item always has a minimum size of 4 bytes (return code, transport size, size (two bytes)) short length = 4; length += varPayloadItem.getData().length; diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimator.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimator.java index a0e66b8..121ea0b 100644 --- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimator.java +++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimator.java @@ -94,10 +94,6 @@ public class S7ResponseSizeEstimator { } private static short getEstimatedResponseParameterSize(S7Parameter parameter) { - if (parameter == null) { - return 0; - } - switch (parameter.getType()) { case READ_VAR: case WRITE_VAR: @@ -125,19 +121,15 @@ public class S7ResponseSizeEstimator { } private static short getEstimatedResponsePayloadSize(S7Parameter parameter) { - if (parameter == null) { - return 0; - } - switch (parameter.getType()) { case READ_VAR: return getEstimatedResponseReadVarPayloadSize((VarParameter) parameter); case WRITE_VAR: return getEstimatedResponseWriteVarPayloadSize((VarParameter) parameter); - case SETUP_COMMUNICATION: + // As we already handled all cases in the parameter size section, SETUP_COMMUNICATION + // is the last possible option. + default : return 0; - default: - throw new NotImplementedException("Not implemented"); } } diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7TypeDecoder.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7TypeDecoder.java deleted file mode 100644 index cb60ee7..0000000 --- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7TypeDecoder.java +++ /dev/null @@ -1,96 +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.s7.netty.util; - -import org.apache.plc4x.java.api.exceptions.PlcUnsupportedDataTypeException; - -import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; - -public class S7TypeDecoder { - - private S7TypeDecoder() { - // Utility class - } - - @SuppressWarnings("unchecked") - public static <T> List<T> decodeData(Class<T> datatype, byte[] s7Data) { - - List<Object> result = new LinkedList<>(); - int i = 0; - final int length = s7Data.length; - while (i < length) { - if (datatype == Boolean.class) { - result.add((s7Data[i] & 0x01) == 0x01); - i += 1; - } else if (datatype == Byte.class) { - result.add(s7Data[i]); - i += 1; - } else if (datatype == Short.class) { - result.add((short) (((s7Data[i] & 0xff) << 8) | (s7Data[i + 1] & 0xff))); - i += 2; - } else if (datatype == Integer.class) { - result.add(((s7Data[i] & 0xff) << 24) | ((s7Data[i + 1] & 0xff) << 16) | - ((s7Data[i + 2] & 0xff) << 8) | (s7Data[i + 3] & 0xff)); - i += 4; - } else if (datatype == Float.class) { - // Description of the Real number format: - // https://www.sps-lehrgang.de/zahlenformate-step7/#c144 - // https://de.wikipedia.org/wiki/IEEE_754 - int intValue = ((s7Data[i] & 0xff) << 24) - | ((s7Data[i + 1] & 0xff) << 16) - | ((s7Data[i + 2] & 0xff) << 8) - | (s7Data[i + 3] & 0xff); - result.add(Float.intBitsToFloat(intValue)); - i += 4; - } else if (datatype == Double.class) { - // Description of the Real number format: - // https://www.sps-lehrgang.de/zahlenformate-step7/#c144 - // https://de.wikipedia.org/wiki/IEEE_754 - long longValue = (((long) (s7Data[i] & 0xff)) << 56) - | (((long) (s7Data[i] & 0xff)) << 48) - | (((long) (s7Data[i + 1] & 0xff)) << 40) - | (((long) (s7Data[i + 2] & 0xff)) << 32) - - | (((long) (s7Data[i + 3] & 0xff)) << 24) - | (((long) (s7Data[i + 4] & 0xff)) << 16) - | (((long) (s7Data[i + 5] & 0xff)) << 8) - | ((long) s7Data[i + 6] & 0xff); - result.add(Double.longBitsToDouble(longValue)); - i += 8; - } else if (datatype == String.class) { - // Every string value had a prefix of two bytes for which I have no idea, what the meaning is. - // This code assumes the string values doesn't contain UTF-8 values with a code of 0x00 as it - // uses this as termination char. - int j = 0; - for (; j < s7Data.length; j++) { - if (s7Data[j] == 0) { - break; - } - } - result.add(new String(s7Data, 2, j - 2, StandardCharsets.UTF_8)); - i += s7Data.length; - } else { - throw new PlcUnsupportedDataTypeException(datatype); - } - } - return (List<T>) result; - } -} diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7TypeEncoder.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7TypeEncoder.java deleted file mode 100644 index bcadbde..0000000 --- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7TypeEncoder.java +++ /dev/null @@ -1,153 +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.s7.netty.util; - -import org.apache.plc4x.java.api.exceptions.PlcNotImplementedException; -import org.apache.plc4x.java.api.exceptions.PlcUnsupportedDataTypeException; - -import java.util.Calendar; - -public class S7TypeEncoder { - - private S7TypeEncoder() { - // Utility class - } - - public static byte[] encodeData(Object[] values) { - final int length = values.length; - if (length == 0) { - return new byte[]{}; - } - final byte[] result; - Class valueType = values[0].getClass(); - if (valueType == Boolean.class) { - result = encodeBoolean(values, length); - } else if (valueType == Byte.class) { - result = encodeByte(values, length); - } else if (valueType == Short.class) { - result = encodeShort(values, length); - } else if (valueType == Integer.class) { - result = encodeInteger(values, length); - } else if (valueType == Calendar.class) { - // TODO: Decide what to do here ... - throw new PlcNotImplementedException("calender not yet implemented in s7"); - } else if (valueType == Float.class) { - result = encodeFloat(values, length); - } else if (valueType == Double.class) { - result = encodeDouble(values, length); - } else if (valueType == String.class) { - result = encodeString(values, length); - } else { - throw new PlcUnsupportedDataTypeException(valueType); - } - return result; - } - - public static byte[] encodeString(Object[] values, int length) { - byte[] result; - int size = 0; - for (Object value : values) { - size = size + ((String) value).length(); - } - result = new byte[size + length]; - int j = 0; - for (Object value : values) { - String str = (String) value; - for (int i = 0; i < str.length(); i++) { - result[j++] = (byte) str.charAt(i); - } - result[j++] = (byte) 0x0; - } - return result; - } - - public static byte[] encodeFloat(Object[] values, int length) { - byte[] result; - result = new byte[length * 4]; - for (int i = 0; i < length; i++) { - float floatValue = (float) values[i]; - int intValue = Float.floatToIntBits(floatValue); - result[i * 4] = (byte) ((intValue & 0xff000000) >> 24); - result[(i * 4) + 1] = (byte) ((intValue & 0x00ff0000) >> 16); - result[(i * 4) + 2] = (byte) ((intValue & 0x0000ff00) >> 8); - result[(i * 4) + 3] = (byte) (intValue & 0xff); - } - return result; - } - - public static byte[] encodeDouble(Object[] values, int length) { - byte[] result; - result = new byte[length * 8]; - for (int i = 0; i < length; i++) { - double doubleValue = (double) values[i]; - long longValue = Double.doubleToLongBits(doubleValue); - result[i * 8] = (byte) ((longValue & 0xFF000000_00000000L) >> 56); - result[(i * 8) + 1] = (byte) ((longValue & 0x00FF0000_00000000L) >> 48); - result[(i * 8) + 2] = (byte) ((longValue & 0x0000FF00_00000000L) >> 40); - result[(i * 8) + 3] = (byte) ((longValue & 0x000000FF_00000000L) >> 32); - result[(i * 8) + 4] = (byte) ((longValue & 0x00000000_FF000000L) >> 24); - result[(i * 8) + 5] = (byte) ((longValue & 0x00000000_00FF0000L) >> 16); - result[(i * 8) + 6] = (byte) ((longValue & 0x00000000_0000FF00L) >> 8); - result[(i * 8) + 7] = (byte) (longValue & 0x00000000_000000FFL); - } - return result; - } - - public static byte[] encodeInteger(Object[] values, int length) { - byte[] result; - result = new byte[length * 4]; - for (int i = 0; i < length; i++) { - int intValue = (int) values[i]; - result[i * 4] = (byte) ((intValue & 0xff000000) >> 24); - result[(i * 4) + 1] = (byte) ((intValue & 0x00ff0000) >> 16); - result[(i * 4) + 2] = (byte) ((intValue & 0x0000ff00) >> 8); - result[(i * 4) + 3] = (byte) (intValue & 0xff); - } - return result; - } - - public static byte[] encodeShort(Object[] values, int length) { - byte[] result; - result = new byte[length * 2]; - for (int i = 0; i < length; i++) { - short intValue = (short) values[i]; - result[i * 2] = (byte) ((intValue & 0xff00) >> 8); - result[(i * 2) + 1] = (byte) (intValue & 0xff); - } - return result; - } - - public static byte[] encodeByte(Object[] values, int length) { - byte[] result; - result = new byte[length]; - for (int i = 0; i < length; i++) { - result[i] = (byte) values[i]; - } - return result; - } - - public static byte[] encodeBoolean(Object[] values, int length) { - byte[] result;// TODO: Check if this is true and the result is not Math.ceil(values.lenght / 8) - result = new byte[length]; - for (int i = 0; i < length; i++) { - result[i] = (byte) (((Boolean) values[i]) ? 0x01 : 0x00); - } - return result; - } -} diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7RequestSizeCalculatorTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7RequestSizeCalculatorTest.java new file mode 100644 index 0000000..a7ab173 --- /dev/null +++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7RequestSizeCalculatorTest.java @@ -0,0 +1,141 @@ +/* + 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.s7.netty.util; + +import org.apache.commons.lang3.NotImplementedException; +import org.apache.plc4x.java.s7.netty.model.messages.S7RequestMessage; +import org.apache.plc4x.java.s7.netty.model.params.S7Parameter; +import org.apache.plc4x.java.s7.netty.model.params.SetupCommunicationParameter; +import org.apache.plc4x.java.s7.netty.model.params.VarParameter; +import org.apache.plc4x.java.s7.netty.model.params.items.S7AnyVarParameterItem; +import org.apache.plc4x.java.s7.netty.model.params.items.VarParameterItem; +import org.apache.plc4x.java.s7.netty.model.payloads.S7Payload; +import org.apache.plc4x.java.s7.netty.model.payloads.VarPayload; +import org.apache.plc4x.java.s7.netty.model.payloads.items.VarPayloadItem; +import org.apache.plc4x.java.s7.netty.model.types.*; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class S7RequestSizeCalculatorTest { + + @Test + void getReadVarRequestMessageSize() { + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList( + new VarParameter(ParameterType.READ_VAR, Collections.singletonList( + new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS, TransportSize.BYTE, 1, (short) 1, (short) 0, (byte) 0)))), + Collections.emptyList(), + null); + short size = S7RequestSizeCalculator.getRequestMessageSize(readVarRequest); + assertEquals(24, size); + } + + @Test + void getWriteVarRequestMessageSize() { + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList( + new VarParameter(ParameterType.WRITE_VAR, Collections.singletonList( + new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS, TransportSize.BYTE, 1, (short) 1, (short) 0, (byte) 0)))), + Collections.singletonList( + new VarPayload(ParameterType.WRITE_VAR, Collections.singletonList( + new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[] {(byte) 0x01})))), + null); + short size = S7RequestSizeCalculator.getRequestMessageSize(readVarRequest); + assertEquals(30, size); + } + + @Test + void getSetupCommunicationRequestMessageSize() { + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList( + new SetupCommunicationParameter((short) 1, (short) 2, (short) 250)), + Collections.emptyList(), + null); + short size = S7RequestSizeCalculator.getRequestMessageSize(readVarRequest); + assertEquals(18, size); + } + + @Test + void getUnimplementedParameterItemTypeMessageSize() { + S7Parameter mockParameter = mock(S7Parameter.class); + when(mockParameter.getType()).thenReturn(ParameterType.UPLOAD); + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList(mockParameter), + Collections.emptyList(), + null); + Assertions.assertThrows(NotImplementedException.class, + () -> S7RequestSizeCalculator.getRequestMessageSize(readVarRequest)); + } + + @Test + void getUnimplementedVarAddressingModeMessageSize() { + VarParameterItem mockParameterItem = mock(VarParameterItem.class); + when(mockParameterItem.getAddressingMode()).thenReturn(VariableAddressingMode.ALARM_QUERYREQ); + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList( + new VarParameter(ParameterType.WRITE_VAR, Collections.singletonList(mockParameterItem))), + Collections.emptyList(), + null); + Assertions.assertThrows(NotImplementedException.class, + () -> S7RequestSizeCalculator.getRequestMessageSize(readVarRequest)); + } + + @Test + void getUnimplementedPayloadTypeMessageSize() { + S7Payload mockPayload = mock(S7Payload.class); + when(mockPayload.getType()).thenReturn(ParameterType.UPLOAD); + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList( + new VarParameter(ParameterType.WRITE_VAR, Collections.singletonList( + new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS, TransportSize.BYTE, 1, (short) 1, (short) 0, (byte) 0)))), + Collections.singletonList(mockPayload), + null); + Assertions.assertThrows(NotImplementedException.class, + () -> S7RequestSizeCalculator.getRequestMessageSize(readVarRequest)); + } + + @Test + void getRequestItemTotalSize() { + short size = S7RequestSizeCalculator.getRequestItemTotalSize( + new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS, TransportSize.BYTE, 1, (short) 1, (short) 0, (byte) 0), + new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[] {(byte) 0x01}) + ); + assertEquals(18, size); + } + +} \ No newline at end of file diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimatorTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimatorTest.java new file mode 100644 index 0000000..6116643 --- /dev/null +++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimatorTest.java @@ -0,0 +1,122 @@ +/* + 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.s7.netty.util; + +import org.apache.commons.lang3.NotImplementedException; +import org.apache.plc4x.java.s7.netty.model.messages.S7RequestMessage; +import org.apache.plc4x.java.s7.netty.model.params.S7Parameter; +import org.apache.plc4x.java.s7.netty.model.params.SetupCommunicationParameter; +import org.apache.plc4x.java.s7.netty.model.params.VarParameter; +import org.apache.plc4x.java.s7.netty.model.params.items.S7AnyVarParameterItem; +import org.apache.plc4x.java.s7.netty.model.payloads.VarPayload; +import org.apache.plc4x.java.s7.netty.model.payloads.items.VarPayloadItem; +import org.apache.plc4x.java.s7.netty.model.types.*; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class S7ResponseSizeEstimatorTest { + + @Test + void getEstimatedReadVarResponseSize() { + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList( + new VarParameter(ParameterType.READ_VAR, Collections.singletonList( + new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS, + TransportSize.BOOL, 1, (short) 1, (short) 0, (byte) 0)))), + Collections.emptyList(), + null); + short size = S7ResponseSizeEstimator.getEstimatedResponseMessageSize(readVarRequest); + assertEquals(20, size); + } + + @Test + void getEstimatedWriteVarResponseSize() { + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList( + new VarParameter(ParameterType.WRITE_VAR, Collections.singletonList( + new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS, + TransportSize.BYTE, 1, (short) 1, (short) 0, (byte) 0)))), + Collections.singletonList( + new VarPayload(ParameterType.WRITE_VAR, Collections.singletonList( + new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, + new byte[] {(byte) 0x01})))), + null); + short size = S7ResponseSizeEstimator.getEstimatedResponseMessageSize(readVarRequest); + assertEquals(15, size); + } + + @Test + void getEstimatedSetupCommunicationResponseSize() { + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList( + new SetupCommunicationParameter((short) 1, (short) 2, (short) 250)), + Collections.emptyList(), + null); + short size = S7ResponseSizeEstimator.getEstimatedResponseMessageSize(readVarRequest); + assertEquals(20, size); + } + + @Test + void getEstimatedUnimplementedParameterItemTypeResponseSize() { + S7Parameter mockParameter = mock(S7Parameter.class); + when(mockParameter.getType()).thenReturn(ParameterType.UPLOAD); + S7RequestMessage readVarRequest = new S7RequestMessage( + MessageType.JOB, + (short) 1, + Collections.singletonList(mockParameter), + Collections.emptyList(), + null); + Assertions.assertThrows(NotImplementedException.class, + () -> S7ResponseSizeEstimator.getEstimatedResponseMessageSize(readVarRequest)); + } + + @Test + void getEstimatedResponseReadItemTotalSize() { + short size = S7ResponseSizeEstimator.getEstimatedResponseReadItemTotalSize( + new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS, + TransportSize.BYTE, 1, (short) 1, (short) 0, (byte) 0), + null + ); + assertEquals(5, size); + } + + @Test + void getEstimatedResponseWriteItemTotalSize() { + short size = S7ResponseSizeEstimator.getEstimatedResponseReadItemTotalSize( + new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS, + TransportSize.BYTE, 1, (short) 1, (short) 0, (byte) 0), + new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[] {(byte) 0x01}) + ); + assertEquals(1, size); + } + +} \ No newline at end of file