Skip to content

Commit b78163a

Browse files
authored
More coverage. (#1947)
1 parent ac25d6d commit b78163a

File tree

3 files changed

+63
-20
lines changed

3 files changed

+63
-20
lines changed

pymodbus/framer/ascii_framer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ def __init__(self, decoder, client=None):
4545
# ----------------------------------------------------------------------- #
4646
# Private Helper Functions
4747
# ----------------------------------------------------------------------- #
48+
def _process(self, callback, error=False):
49+
"""Process incoming packets irrespective error condition."""
50+
4851
def decode_data(self, data):
4952
"""Decode data."""
5053
if len(data) > 1:

pymodbus/framer/binary_framer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ def __init__(self, decoder, client=None):
5656
# ----------------------------------------------------------------------- #
5757
# Private Helper Functions
5858
# ----------------------------------------------------------------------- #
59+
def _process(self, callback, error=False):
60+
"""Process incoming packets irrespective error condition."""
61+
5962
def decode_data(self, data):
6063
"""Decode data."""
6164
if len(data) > self._hsize:

test/test_framers.py

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,6 @@ def fixture_ascii_framer():
3535
return ModbusAsciiFramer(ClientDecoder())
3636

3737

38-
# @pytest.fixture
39-
# def binary_framer():
40-
# """Binary framer."""
41-
# return ModbusBinaryFramer(ClientDecoder())
42-
43-
4438
@pytest.mark.parametrize(
4539
"framer",
4640
[
@@ -98,14 +92,6 @@ def test_framer_initialization(framer):
9892
]
9993

10094

101-
@pytest.mark.parametrize("data", [(b"", {}), (b"abcd", {"fcode": 98, "slave": 97})])
102-
def test_decode_data(rtu_framer, data):
103-
"""Test decode data."""
104-
data, expected = data
105-
decoded = rtu_framer.decode_data(data)
106-
assert decoded == expected
107-
108-
10995
@pytest.mark.parametrize(
11096
"data",
11197
[
@@ -301,12 +287,6 @@ def test_rtu_incoming_packet(rtu_framer, data):
301287
assert mock_reset.call_count == (1 if reset_called else 0)
302288

303289

304-
def test_build_packet(rtu_framer):
305-
"""Test build packet."""
306-
message = ReadCoilsRequest(1, 10)
307-
assert rtu_framer.buildPacket(message) == TEST_MESSAGE
308-
309-
310290
def test_send_packet(rtu_framer):
311291
"""Test send packet."""
312292
message = TEST_MESSAGE
@@ -403,3 +383,60 @@ def _handle_response(_reply):
403383
framer = ModbusSocketFramer(ClientDecoder())
404384
framer.processIncomingPacket(message, _handle_response, slave=0)
405385
assert response_ok, "Response is valid, but not accepted"
386+
387+
# ---- 100% coverage
388+
@pytest.mark.parametrize(
389+
("framer", "message"),
390+
[
391+
(ModbusAsciiFramer, b':00010001000AF4\r\n',),
392+
(ModbusBinaryFramer, b'{\x00\x01\x00\x01\x00\n\xec\x1c}',),
393+
(ModbusRtuFramer, b"\x00\x01\x00\x01\x00\n\xec\x1c",),
394+
(ModbusSocketFramer, b'\x00\x00\x00\x00\x00\x06\x00\x01\x00\x01\x00\n',),
395+
]
396+
)
397+
def test_build_packet(framer, message):
398+
"""Test build packet."""
399+
test_framer = framer(ClientDecoder())
400+
request = ReadCoilsRequest(1, 10)
401+
assert test_framer.buildPacket(request) == message
402+
403+
404+
@pytest.mark.parametrize(
405+
("framer", "message"),
406+
[
407+
(ModbusAsciiFramer, b':00010001000AF4\r\n',),
408+
(ModbusBinaryFramer, b'{\x00\x01\x00\x01\x00\n\xec\x1c}',),
409+
(ModbusRtuFramer, b"\x00\x01\x00\x01\x00\n\xec\x1c",),
410+
(ModbusSocketFramer, b'\x00\x00\x00\x00\x00\x06\x00\x01\x00\x01\x00\n',),
411+
]
412+
)
413+
def test_processincomingpacket(framer, message):
414+
"""Test processIncomingPacket."""
415+
test_framer = framer(ClientDecoder())
416+
with mock.patch.object(
417+
framer,
418+
"_process",
419+
wraps=test_framer._process, # pylint: disable=protected-access
420+
), mock.patch.object(
421+
test_framer, "resetFrame", wraps=test_framer.resetFrame
422+
):
423+
test_framer.processIncomingPacket(message, mock.Mock(), 0x01)
424+
425+
@pytest.mark.parametrize(
426+
("framer", "message"),
427+
[
428+
(ModbusAsciiFramer, b':61620001000AF4\r\n',),
429+
(ModbusBinaryFramer, b'{\x61\x62\x00\x01\x00\n\xec\x1c}',),
430+
(ModbusRtuFramer, b"\x61\x62\x00\x01\x00\n\xec\x1c",),
431+
(ModbusSocketFramer, b'\x00\x00\x00\x00\x00\x06\x61\x62\x00\x01\x00\n',),
432+
]
433+
)
434+
@pytest.mark.parametrize("expected", [{"fcode": 98, "slave": 97}])
435+
def test_decode_data(framer, message, expected):
436+
"""Test decode data."""
437+
test_framer = framer(ClientDecoder())
438+
decoded = test_framer.decode_data(b'')
439+
assert decoded == {}
440+
decoded = test_framer.decode_data(message)
441+
assert decoded["fcode"] == expected["fcode"]
442+
assert decoded["slave"] == expected["slave"]

0 commit comments

Comments
 (0)