xref: /aosp_15_r20/external/pigweed/pw_hdlc/py/encode_test.py (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*61c4878aSAndroid Build Coastguard Worker# Copyright 2020 The Pigweed Authors
3*61c4878aSAndroid Build Coastguard Worker#
4*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
5*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
6*61c4878aSAndroid Build Coastguard Worker# the License at
7*61c4878aSAndroid Build Coastguard Worker#
8*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
9*61c4878aSAndroid Build Coastguard Worker#
10*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
14*61c4878aSAndroid Build Coastguard Worker# the License.
15*61c4878aSAndroid Build Coastguard Worker"""Tests encoding HDLC frames."""
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerimport unittest
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Workerfrom pw_hdlc import encode
20*61c4878aSAndroid Build Coastguard Workerfrom pw_hdlc import protocol
21*61c4878aSAndroid Build Coastguard Workerfrom pw_hdlc.protocol import frame_check_sequence as _fcs
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard WorkerFLAG = bytes([protocol.FLAG])
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Workerdef _with_fcs(data: bytes) -> bytes:
27*61c4878aSAndroid Build Coastguard Worker    return data + _fcs(data)
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker
30*61c4878aSAndroid Build Coastguard Workerclass TestEncodeUIFrame(unittest.TestCase):
31*61c4878aSAndroid Build Coastguard Worker    """Tests Encoding bytes with different arguments using a custom serial."""
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard Worker    def test_empty(self):
34*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
35*61c4878aSAndroid Build Coastguard Worker            encode.ui_frame(0, b''), FLAG + _with_fcs(b'\x01\x03') + FLAG
36*61c4878aSAndroid Build Coastguard Worker        )
37*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
38*61c4878aSAndroid Build Coastguard Worker            encode.ui_frame(0x1A, b''), FLAG + _with_fcs(b'\x35\x03') + FLAG
39*61c4878aSAndroid Build Coastguard Worker        )
40*61c4878aSAndroid Build Coastguard Worker
41*61c4878aSAndroid Build Coastguard Worker    def test_1byte(self):
42*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
43*61c4878aSAndroid Build Coastguard Worker            encode.ui_frame(0, b'A'), FLAG + _with_fcs(b'\x01\x03A') + FLAG
44*61c4878aSAndroid Build Coastguard Worker        )
45*61c4878aSAndroid Build Coastguard Worker
46*61c4878aSAndroid Build Coastguard Worker    def test_multibyte(self):
47*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
48*61c4878aSAndroid Build Coastguard Worker            encode.ui_frame(0, b'123456789'),
49*61c4878aSAndroid Build Coastguard Worker            FLAG + _with_fcs(b'\x01\x03123456789') + FLAG,
50*61c4878aSAndroid Build Coastguard Worker        )
51*61c4878aSAndroid Build Coastguard Worker
52*61c4878aSAndroid Build Coastguard Worker    def test_multibyte_address(self):
53*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
54*61c4878aSAndroid Build Coastguard Worker            encode.ui_frame(128, b'123456789'),
55*61c4878aSAndroid Build Coastguard Worker            FLAG + _with_fcs(b'\x00\x03\x03123456789') + FLAG,
56*61c4878aSAndroid Build Coastguard Worker        )
57*61c4878aSAndroid Build Coastguard Worker
58*61c4878aSAndroid Build Coastguard Worker    def test_escape(self):
59*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
60*61c4878aSAndroid Build Coastguard Worker            encode.ui_frame(0x3E, b'\x7d'),
61*61c4878aSAndroid Build Coastguard Worker            FLAG + b'\x7d\x5d\x03\x7d\x5d' + _fcs(b'\x7d\x03\x7d') + FLAG,
62*61c4878aSAndroid Build Coastguard Worker        )
63*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
64*61c4878aSAndroid Build Coastguard Worker            encode.ui_frame(0x3E, b'A\x7e\x7dBC'),
65*61c4878aSAndroid Build Coastguard Worker            FLAG
66*61c4878aSAndroid Build Coastguard Worker            + b'\x7d\x5d\x03A\x7d\x5e\x7d\x5dBC'
67*61c4878aSAndroid Build Coastguard Worker            + _fcs(b'\x7d\x03A\x7e\x7dBC')
68*61c4878aSAndroid Build Coastguard Worker            + FLAG,
69*61c4878aSAndroid Build Coastguard Worker        )
70*61c4878aSAndroid Build Coastguard Worker
71*61c4878aSAndroid Build Coastguard Worker
72*61c4878aSAndroid Build Coastguard Workerif __name__ == '__main__':
73*61c4878aSAndroid Build Coastguard Worker    unittest.main()
74