Skip to content

Commit 7c4a310

Browse files
authored
update message tests (incorporate all old tests). (#2088)
1 parent 647b270 commit 7c4a310

File tree

7 files changed

+126
-1371
lines changed

7 files changed

+126
-1371
lines changed

test/message/test_ascii.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,6 @@ def prepare_frame():
1414
return MessageAscii([1], False)
1515

1616

17-
def test_roundtrip_LRC(self):
18-
"""Test combined compute/check LRC."""
19-
data = b'\x12\x34\x23\x45\x34\x56\x45\x67'
20-
assert MessageAscii.compute_LRC(data) == 0x1c
21-
assert MessageAscii.check_LRC(data, 0x1C)
22-
2317
@pytest.mark.parametrize(
2418
("packet", "used_len", "res_id", "res"),
2519
[
@@ -43,21 +37,6 @@ def test_decode(self, frame, packet, used_len, res_id, res):
4337
assert not tid
4438
assert dev_id == res_id
4539

46-
@pytest.mark.parametrize(
47-
("data", "dev_id", "res_msg"),
48-
[
49-
(b'\x01\x05\x04\x00\x17', 1, b':010105040017DE\r\n'),
50-
(b'\x03\x07\x06\x00\x73', 2, b':0203070600737B\r\n'),
51-
(b'\x08\x00\x01', 3, b':03080001F4\r\n'),
52-
(b'\x84\x01', 2, b':02840179\r\n'),
53-
],
54-
)
55-
def test_encode(self, frame, data, dev_id, res_msg):
56-
"""Test encode."""
57-
msg = frame.encode(data, dev_id, 0)
58-
assert res_msg == msg
59-
assert dev_id == int(msg[1:3], 16)
60-
6140
@pytest.mark.parametrize(
6241
("data", "dev_id", "res_msg"),
6342
[

test/message/test_message.py

Lines changed: 126 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,27 @@ def test_LRC_CRC(self, func, lrc, expect):
116116
data = b'\x12\x34\x23\x45\x34\x56\x45\x67'
117117
assert expect == func(data, lrc) if lrc else func(data)
118118

119+
def test_roundtrip_LRC(self):
120+
"""Test combined compute/check LRC."""
121+
data = b'\x12\x34\x23\x45\x34\x56\x45\x67'
122+
assert MessageAscii.compute_LRC(data) == 0x1c
123+
assert MessageAscii.check_LRC(data, 0x1C)
124+
125+
def test_crc16_table(self):
126+
"""Test the crc16 table is prefilled."""
127+
assert len(MessageRTU.crc16_table) == 256
128+
assert isinstance(MessageRTU.crc16_table[0], int)
129+
assert isinstance(MessageRTU.crc16_table[255], int)
130+
131+
def test_roundtrip_CRC(self):
132+
"""Test combined compute/check CRC."""
133+
data = b'\x12\x34\x23\x45\x34\x56\x45\x67'
134+
assert MessageRTU.compute_CRC(data) == 0xE2DB
135+
assert MessageRTU.check_CRC(data, 0xE2DB)
119136

120-
class TestMessages: # pylint: disable=too-few-public-methods
137+
138+
139+
class TestMessages:
121140
"""Test message classes."""
122141

123142
@pytest.mark.parametrize(
@@ -198,10 +217,114 @@ class TestMessages: # pylint: disable=too-few-public-methods
198217
def test_encode(self, frame, frame_expected, data, dev_id, tid, inx1, inx2, inx3):
199218
"""Test encode method."""
200219
if frame != MessageSocket and tid:
201-
return
220+
pytest.skip("Not supported")
202221
if frame == MessageTLS and (tid or dev_id):
203-
return
222+
pytest.skip("Not supported")
204223
frame_obj = frame(None, True)
205224
expected = frame_expected[inx1 + inx2 + inx3]
206225
encoded_data = frame_obj.encode(data, dev_id, tid)
207226
assert encoded_data == expected
227+
228+
@pytest.mark.parametrize(
229+
("msg_type", "data", "dev_id", "tid", "expected"),
230+
[
231+
(MessageType.ASCII, b':0003007C00027F\r\n', 0, 0, b"\x03\x00\x7c\x00\x02",), # Request
232+
(MessageType.ASCII, b':000304008D008EDE\r\n', 0, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
233+
(MessageType.ASCII, b':0083027B\r\n', 0, 0, b'\x83\x02',), # Exception
234+
(MessageType.ASCII, b':1103007C00026E\r\n', 17, 0, b"\x03\x00\x7c\x00\x02",), # Request
235+
(MessageType.ASCII, b':110304008D008ECD\r\n', 17, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
236+
(MessageType.ASCII, b':1183026A\r\n', 17, 0, b'\x83\x02',), # Exception
237+
(MessageType.ASCII, b':FF03007C000280\r\n', 255, 0, b"\x03\x00\x7c\x00\x02",), # Request
238+
(MessageType.ASCII, b':FF0304008D008EDF\r\n', 255, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
239+
(MessageType.ASCII, b':FF83027C\r\n', 255, 0, b'\x83\x02',), # Exception
240+
(MessageType.RTU, b'\x00\x03\x00\x7c\x00\x02\x04\x02', 0, 0, b"\x03\x00\x7c\x00\x02",), # Request
241+
(MessageType.RTU, b'\x00\x03\x04\x00\x8d\x00\x8e\xfa\xbc', 0, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
242+
(MessageType.RTU, b'\x00\x83\x02\x91\x31', 0, 0, b'\x83\x02',), # Exception
243+
(MessageType.RTU, b'\x11\x03\x00\x7c\x00\x02\x07\x43', 17, 0, b"\x03\x00\x7c\x00\x02",), # Request
244+
(MessageType.RTU, b'\x11\x03\x04\x00\x8d\x00\x8e\xfb\xbd', 17, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
245+
(MessageType.RTU, b'\x11\x83\x02\xc1\x34', 17, 0, b'\x83\x02',), # Exception
246+
(MessageType.RTU, b'\xff\x03\x00|\x00\x02\x10\x0d', 255, 0, b"\x03\x00\x7c\x00\x02",), # Request
247+
(MessageType.RTU, b'\xff\x03\x04\x00\x8d\x00\x8e\xf5\xb3', 255, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
248+
(MessageType.RTU, b'\xff\x83\x02\xa1\x01', 255, 0, b'\x83\x02',), # Exception
249+
(MessageType.SOCKET, b'\x00\x00\x00\x00\x00\x06\x00\x03\x00\x7c\x00\x02', 0, 0, b"\x03\x00\x7c\x00\x02",), # Request
250+
(MessageType.SOCKET, b'\x00\x00\x00\x00\x00\x07\x00\x03\x04\x00\x8d\x00\x8e', 0, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
251+
(MessageType.SOCKET, b'\x00\x00\x00\x00\x00\x03\x00\x83\x02', 0, 0, b'\x83\x02',), # Exception
252+
(MessageType.SOCKET, b'\x00\x00\x00\x00\x00\x06\x11\x03\x00\x7c\x00\x02', 17, 0, b"\x03\x00\x7c\x00\x02",), # Request
253+
(MessageType.SOCKET, b'\x00\x00\x00\x00\x00\x07\x11\x03\x04\x00\x8d\x00\x8e', 17, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
254+
(MessageType.SOCKET, b'\x00\x00\x00\x00\x00\x03\x11\x83\x02', 17, 0, b'\x83\x02',), # Exception
255+
(MessageType.SOCKET, b'\x00\x00\x00\x00\x00\x06\xff\x03\x00\x7c\x00\x02', 255, 0, b"\x03\x00\x7c\x00\x02",), # Request
256+
(MessageType.SOCKET, b'\x00\x00\x00\x00\x00\x07\xff\x03\x04\x00\x8d\x00\x8e', 255, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
257+
(MessageType.SOCKET, b'\x00\x00\x00\x00\x00\x03\xff\x83\x02', 255, 0, b'\x83\x02',), # Exception
258+
(MessageType.SOCKET, b'\x0c\x05\x00\x00\x00\x06\x00\x03\x00\x7c\x00\x02', 0, 3077, b"\x03\x00\x7c\x00\x02",), # Request
259+
(MessageType.SOCKET, b'\x0c\x05\x00\x00\x00\x07\x00\x03\x04\x00\x8d\x00\x8e', 0, 3077, b"\x03\x04\x00\x8d\x00\x8e",), # Response
260+
(MessageType.SOCKET, b'\x0c\x05\x00\x00\x00\x03\x00\x83\x02', 0, 3077, b'\x83\x02',), # Exception
261+
(MessageType.SOCKET, b'\x0c\x05\x00\x00\x00\x06\x11\x03\x00\x7c\x00\x02', 17, 3077, b"\x03\x00\x7c\x00\x02",), # Request
262+
(MessageType.SOCKET, b'\x0c\x05\x00\x00\x00\x07\x11\x03\x04\x00\x8d\x00\x8e', 17, 3077, b"\x03\x04\x00\x8d\x00\x8e",), # Response
263+
(MessageType.SOCKET, b'\x0c\x05\x00\x00\x00\x03\x11\x83\x02', 17, 3077, b'\x83\x02',), # Exception
264+
(MessageType.SOCKET, b'\x0c\x05\x00\x00\x00\x06\xff\x03\x00\x7c\x00\x02', 255, 3077, b"\x03\x00\x7c\x00\x02",), # Request
265+
(MessageType.SOCKET, b'\x0c\x05\x00\x00\x00\x07\xff\x03\x04\x00\x8d\x00\x8e', 255, 3077, b"\x03\x04\x00\x8d\x00\x8e",), # Response
266+
(MessageType.SOCKET, b'\x0c\x05\x00\x00\x00\x03\xff\x83\x02', 255, 3077, b'\x83\x02',), # Exception
267+
(MessageType.TLS, b'\x03\x00\x7c\x00\x02', 0, 0, b"\x03\x00\x7c\x00\x02",), # Request
268+
(MessageType.TLS, b'\x03\x04\x00\x8d\x00\x8e', 0, 0, b"\x03\x04\x00\x8d\x00\x8e",), # Response
269+
(MessageType.TLS, b'\x83\x02', 0, 0, b'\x83\x02',), # Exception
270+
]
271+
)
272+
@pytest.mark.parametrize(
273+
("split"),
274+
[
275+
"no",
276+
"half",
277+
"single",
278+
]
279+
)
280+
async def test_decode(self, dummy_message, msg_type, data, dev_id, tid, expected, split):
281+
"""Test encode method."""
282+
if msg_type == MessageType.RTU:
283+
pytest.skip("Waiting on implementation!")
284+
if msg_type == MessageType.TLS and split != "no":
285+
pytest.skip("Not supported.")
286+
frame = dummy_message(
287+
msg_type,
288+
CommParams(),
289+
False,
290+
[1],
291+
)
292+
frame.callback_request_response = mock.Mock()
293+
if split == "no":
294+
used_len = frame.callback_data(data)
295+
296+
elif split == "half":
297+
split_len = int(len(data) / 2)
298+
assert not frame.callback_data(data[0:split_len])
299+
frame.callback_request_response.assert_not_called()
300+
used_len = frame.callback_data(data)
301+
else:
302+
last = len(data)
303+
for i in range(0, last -1):
304+
assert not frame.callback_data(data[0:i+1])
305+
frame.callback_request_response.assert_not_called()
306+
used_len = frame.callback_data(data)
307+
assert used_len == len(data)
308+
frame.callback_request_response.assert_called_with(expected, dev_id, tid)
309+
310+
@pytest.mark.parametrize(
311+
("frame", "data", "exp_len"),
312+
[
313+
(MessageAscii, b':0003007C00017F\r\n', 17), # bad crc
314+
# (MessageAscii, b'abc:0003007C00027F\r\n', 3), # garble in front
315+
# (MessageAscii, b':0003007C00017F\r\nabc', 17), # bad crc, garble after
316+
# (MessageAscii, b':0003007C00017F\r\n:0003', 17), # part second message
317+
(MessageRTU, b'\x00\x83\x02\x91\x31', 0), # bad crc
318+
# (MessageRTU, b'\x00\x83\x02\x91\x31', 0), # garble in front
319+
# (MessageRTU, b'\x00\x83\x02\x91\x31', 0), # garble after
320+
# (MessageRTU, b'\x00\x83\x02\x91\x31', 0), # part second message
321+
]
322+
)
323+
async def test_decode_bad_crc(self, frame, data, exp_len):
324+
"""Test encode method."""
325+
if frame == MessageRTU:
326+
pytest.skip("Waiting for implementation.")
327+
frame_obj = frame(None, True)
328+
used_len, _, _, data = frame_obj.decode(data)
329+
assert used_len == exp_len
330+
assert not data

test/message/test_rtu.py

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -13,76 +13,6 @@ def prepare_frame():
1313
"""Return message object."""
1414
return MessageRTU([1], False)
1515

16-
def test_crc16_table(self):
17-
"""Test the crc16 table is prefilled."""
18-
assert len(MessageRTU.crc16_table) == 256
19-
assert isinstance(MessageRTU.crc16_table[0], int)
20-
assert isinstance(MessageRTU.crc16_table[255], int)
21-
22-
def test_roundtrip_CRC(self):
23-
"""Test combined compute/check CRC."""
24-
data = b'\x12\x34\x23\x45\x34\x56\x45\x67'
25-
assert MessageRTU.compute_CRC(data) == 0xE2DB
26-
assert MessageRTU.check_CRC(data, 0xE2DB)
27-
28-
# b"\x02\x01\x01\x00Q\xcc"
29-
# b"\x01\x01\x03\x01\x00\n\xed\x89"
30-
# b"\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x43"
31-
# b"\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49\xAD"
32-
33-
# b"\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49\xAD\x11\x03" # good frame + part of next frame
34-
35-
# b"\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49\xAC" # invalid frame CRC
36-
# b"\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49\xAC" # bad crc
37-
# b"\x61\x62\x00\x01\x00\n\xec\x1c" # bad function code
38-
# b"\x01\x03\x03\x01\x00\n\x94\x49" # Not ok
39-
40-
# test frame ready
41-
# (b"", False),
42-
# (b"\x11", False),
43-
# (b"\x11\x03", False),
44-
# (b"\x11\x03\x06", False),
45-
# (b"\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49", False),
46-
# (b"\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49\xAD", True),
47-
# (b"\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49\xAD\xAB\xCD", True),
48-
49-
50-
@pytest.mark.parametrize(
51-
("packet", "used_len", "res_id", "res"),
52-
[
53-
(b':010100010001FC\r\n', 17, 1, b'\x01\x00\x01\x00\x01'),
54-
(b':00010001000AF4\r\n', 17, 0, b'\x01\x00\x01\x00\x0a'),
55-
(b':01010001000AF3\r\n', 17, 1, b'\x01\x00\x01\x00\x0a'),
56-
(b':61620001000A32\r\n', 17, 97, b'\x62\x00\x01\x00\x0a'),
57-
(b':01270001000ACD\r\n', 17, 1, b'\x27\x00\x01\x00\x0a'),
58-
(b':010100', 0, 0, b''), # short frame
59-
(b':00010001000AF4', 0, 0, b''),
60-
(b'abc:00010001000AF4', 3, 0, b''), # garble before frame
61-
(b'abc00010001000AF4', 17, 0, b''), # only garble
62-
(b':01010001000A00\r\n', 17, 0, b''),
63-
],
64-
)
65-
def xtest_decode(self, frame, packet, used_len, res_id, res):
66-
"""Test decode."""
67-
res_len, tid, dev_id, data = frame.decode(packet)
68-
assert res_len == used_len
69-
assert data == res
70-
assert not tid
71-
assert dev_id == res_id
72-
73-
@pytest.mark.parametrize(
74-
("data", "dev_id", "res_msg"),
75-
[
76-
(b'\x01\x01\x00', 2, b'\x02\x01\x01\x00\x51\xcc'),
77-
(b'\x03\x06\xAE\x41\x56\x52\x43\x40', 17, b'\x11\x03\x06\xAE\x41\x56\x52\x43\x40\x49\xAD'),
78-
(b'\x01\x03\x01\x00\x0a', 1, b'\x01\x01\x03\x01\x00\x0a\xed\x89'),
79-
],
80-
)
81-
def test_encode(self, frame, data, dev_id, res_msg):
82-
"""Test encode."""
83-
msg = frame.encode(data, dev_id, 0)
84-
assert res_msg == msg
85-
assert dev_id == int(msg[0])
8616

8717
@pytest.mark.parametrize(
8818
("data", "dev_id", "res_msg"),

test/message/test_socket.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,6 @@ def test_decode(self, frame, packet, used_len, res_id, res_tid, res):
3333
assert res_tid == tid
3434
assert dev_id == res_id
3535

36-
@pytest.mark.parametrize(
37-
("data", "dev_id", "tid", "res_msg"),
38-
[
39-
(b'\x01\x05\x04\x00\x17', 7, 5, b'\x00\x05\x00\x00\x00\x06\x07\x01\x05\x04\x00\x17'),
40-
(b'\x03\x07\x06\x00\x73', 2, 9, b'\x00\x09\x00\x00\x00\x06\x02\x03\x07\x06\x00\x73'),
41-
(b'\x08\x00\x01', 3, 6, b'\x00\x06\x00\x00\x00\x04\x03\x08\x00\x01'),
42-
(b'\x84\x01', 4, 8, b'\x00\x08\x00\x00\x00\x03\x04\x84\x01'),
43-
],
44-
)
45-
def test_encode(self, frame, data, dev_id, tid, res_msg):
46-
"""Test encode."""
47-
msg = frame.encode(data, dev_id, tid)
48-
assert res_msg == msg
49-
assert dev_id == int(msg[6])
50-
assert tid == int.from_bytes(msg[0:2], 'big')
5136

5237
@pytest.mark.parametrize(
5338
("data", "dev_id", "tid", "res_msg"),

test/message/test_tls.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,6 @@ def test_decode(self, frame, packet, used_len,):
3030
assert not tid
3131
assert not dev_id
3232

33-
@pytest.mark.parametrize(
34-
("data"),
35-
[
36-
(b'\x01\x05\x04\x00\x17'),
37-
(b'\x03\x07\x06\x00\x73'),
38-
(b'\x08\x00\x01'),
39-
(b'\x84\x01'),
40-
],
41-
)
42-
def test_encode(self, frame, data):
43-
"""Test encode."""
44-
msg = frame.encode(data, 0, 0)
45-
assert data == msg
4633

4734
@pytest.mark.parametrize(
4835
("data"),

0 commit comments

Comments
 (0)