Skip to content

Commit 527a305

Browse files
authored
Framer test 100%. (#2754)
1 parent d2ef010 commit 527a305

File tree

4 files changed

+65
-6
lines changed

4 files changed

+65
-6
lines changed

pymodbus/framer/rtu.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ def decode(self, data: bytes) -> tuple[int, int, int, bytes]:
111111
if not (pdu_class := self.decoder.lookupPduClass(data[used_len:])):
112112
continue
113113
if not (size := pdu_class.calculateRtuFrameSize(data[used_len:])):
114-
size = data_len +1
114+
Log.debug("Frame - rtu_byte_count_pos wrong")
115+
return 0, dev_id, 0, self.EMPTY
115116
if data_len < used_len +size:
116117
Log.debug("Frame - not ready")
117118
return 0, dev_id, 0, self.EMPTY

pymodbus/pdu/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
11
"""Framer."""
22
__all__ = [
33
"DecodePDU",
4+
"DiagnosticBase",
45
"ExceptionResponse",
56
"FileRecord",
67
"ModbusPDU",
8+
"ReadCoilsRequest",
9+
"ReadDeviceInformationRequest",
10+
"ReadExceptionStatusRequest",
11+
"ReadHoldingRegistersRequest",
712
]
813

14+
from .bit_message import ReadCoilsRequest
915
from .decoders import DecodePDU
16+
from .diag_message import DiagnosticBase
1017
from .exceptionresponse import ExceptionResponse
1118
from .file_message import FileRecord
19+
from .mei_message import ReadDeviceInformationRequest
20+
from .other_message import ReadExceptionStatusRequest
1221
from .pdu import ModbusPDU
22+
from .register_message import ReadHoldingRegistersRequest
23+
24+

test/framer/test_extras.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
"""Test transaction."""
2+
from unittest.mock import patch
23

4+
import pytest
5+
6+
from pymodbus.exceptions import ModbusIOException
37
from pymodbus.framer import (
48
FramerAscii,
59
FramerRTU,
@@ -12,7 +16,7 @@
1216
TEST_MESSAGE = b"\x7b\x01\x03\x00\x00\x00\x05\x85\xC9\x7d"
1317

1418

15-
class TestExtas:
19+
class TestExtras:
1620
"""Test for the framer module."""
1721

1822
client = None
@@ -73,6 +77,26 @@ def test_tcp_framer_transaction_short(self):
7377
assert used_len == len(msg1) + len(msg2)
7478
assert pdu.function_code.to_bytes(1,'big') + pdu.encode() == msg2[7:]
7579

80+
def test_tcp_framer_transaction_wrong_id(self):
81+
"""Test a half completed tcp frame transaction."""
82+
msg = b"\x00\x01\x12\x34\x00\x06\xff\x02\x01\x02\x00\x08"
83+
used_len, pdu = self._tcp.handleFrame(msg, 1, 0)
84+
assert not pdu
85+
assert used_len == len(msg)
86+
87+
def test_tcp_framer_transaction_wrong_tid(self):
88+
"""Test a half completed tcp frame transaction."""
89+
msg = b"\x00\x01\x12\x34\x00\x06\xff\x02\x01\x02\x00\x08"
90+
used_len, pdu = self._tcp.handleFrame(msg, 0, 10)
91+
assert not pdu
92+
assert used_len == len(msg)
93+
94+
def test_tcp_framer_transaction_wrong_fc(self):
95+
"""Test a half completed tcp frame transaction."""
96+
msg = b"\x00\x01\x12\x34\x00\x06\xff\x70\x01\x02\x00\x08"
97+
with pytest.raises(ModbusIOException):
98+
self._tcp.handleFrame(msg, 0, 0)
99+
76100
def test_tls_incoming_packet(self):
77101
"""Framer tls incoming packet."""
78102
msg = b"\x00\x01\x12\x34\x00\x06\xff\x02\x01\x02\x00\x08"
@@ -85,6 +109,32 @@ def test_rtu_process_incoming_packets(self):
85109
_, pdu = self._rtu.handleFrame(msg, 0, 0)
86110
assert pdu
87111

112+
def test_rtu_short_packets(self):
113+
"""Test rtu process incoming packets."""
114+
msg1 = b"\x00\x01"
115+
msg2 = b"\x00\x00\x00\x01\xfc\x1b"
116+
used_len, pdu = self._rtu.handleFrame(msg1, 0, 0)
117+
assert not used_len
118+
assert not pdu
119+
used_len, pdu = self._rtu.handleFrame(msg1+msg2, 0, 0)
120+
assert used_len == len(msg1) + len(msg2)
121+
assert pdu
122+
123+
def test_rtu_calculate(self):
124+
"""Test rtu process incoming packets."""
125+
msg = b"\x00\x01\x00\x00\x00\x01\xfc\x1b"
126+
with patch("pymodbus.pdu.ReadCoilsRequest.calculateRtuFrameSize", return_value=0):
127+
used_len, pdu = self._rtu.handleFrame(msg, 0, 0)
128+
assert not used_len
129+
assert not pdu
130+
131+
def test_rtu_wrong_fc(self):
132+
"""Test rtu process incoming packets."""
133+
msg = b"\x00\x70\x00\x00\x00\x71\xfc\x1b"
134+
used_len, pdu = self._rtu.handleFrame(msg, 0, 0)
135+
assert not pdu
136+
assert not used_len
137+
88138
def test_ascii_process_incoming_packets(self):
89139
"""Test ascii process incoming packet."""
90140
msg = b":F7031389000A60\r\n"

test/framer/test_framer.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,3 @@ def test_framer_encode(self, test_framer, msg):
470470

471471
actual = test_framer.buildFrame(message)
472472
assert msg == actual
473-
474-
475-
476-
# @pytest.mark.parametrize(("entry"), list(FramerType))

0 commit comments

Comments
 (0)