diff options
Diffstat (limited to 'host/tests/pychdr_parse_test.py')
-rw-r--r-- | host/tests/pychdr_parse_test.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/host/tests/pychdr_parse_test.py b/host/tests/pychdr_parse_test.py new file mode 100644 index 000000000..34842ad28 --- /dev/null +++ b/host/tests/pychdr_parse_test.py @@ -0,0 +1,68 @@ +# +# Copyright 2020 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +""" +Unit test for libpyuhd.chdr (CHDR Parsing API) +""" + +import unittest +from uhd.libpyuhd import chdr +from chdr_resource import hardcoded_packets +from chdr_resource import rfnoc_packets_data +from chdr_resource import rfnoc_packets_ctrl_mgmt + +# unittest doesn't support parameterized tests natively, +# rather than add another dependency just for testing, we use this +class parameterize: + """Decorate a class with this. It deletes the method named by + func_name and adds methods for every test case, appending _{name} + to the name of the function + """ + def __init__(self, func_name, names, cases): + self.func_name = func_name + self.cases = cases + self.names = names + + def __call__(self, cls): + func = getattr(cls, self.func_name) + # First remove the function + delattr(cls, self.func_name) + for case, name in zip(self.cases, self.names): + # Add a new test function for every case + def new_func(self, this_case=case): + return func(self, *this_case) + setattr(cls, self.func_name + "_" + name, new_func) + return cls + + +@parameterize("test_serialize_deserialize_eq", hardcoded_packets.names, hardcoded_packets.packets) +class CHDRParseTest(unittest.TestCase): + """ Test Python-wrapped CHDR Parser classes """ + + def test_parse_no_errors(self): + """Parse every packet in the trace we have. + This test is just looking for errors + """ + packets = [packet_data for peer in [ + rfnoc_packets_ctrl_mgmt.peer0, + rfnoc_packets_ctrl_mgmt.peer1, + rfnoc_packets_data.peer0, + rfnoc_packets_data.peer1 + ] for packet_data in peer] + for packet_data in packets: + _packet = chdr.ChdrPacket.deserialize( + chdr.ChdrWidth.W64, packet_data) + + def test_serialize_deserialize_eq(self, packet, data): + """This test serializes and then deserializes a few packets to + make sure that they survive a round trip without changing + """ + generated_data = bytes(packet.serialize()) + self.assertEqual(generated_data, data) + + generated_packet = chdr.ChdrPacket.deserialize( + chdr.ChdrWidth.W64, data) + generated_data = bytes(generated_packet.serialize()) + self.assertEqual(generated_data, data) |