aboutsummaryrefslogtreecommitdiffstats
path: root/mpm/python/tests/eeprom_tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'mpm/python/tests/eeprom_tests.py')
-rw-r--r--mpm/python/tests/eeprom_tests.py199
1 files changed, 199 insertions, 0 deletions
diff --git a/mpm/python/tests/eeprom_tests.py b/mpm/python/tests/eeprom_tests.py
new file mode 100644
index 000000000..0fd69af84
--- /dev/null
+++ b/mpm/python/tests/eeprom_tests.py
@@ -0,0 +1,199 @@
+#!/usr/bin/env python3
+#
+# Copyright 2021 Ettus Research, a National Instruments Company
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+
+"""
+TLV eeprom tests
+"""
+
+import os
+import struct
+from base_tests import TestBase
+import usrp_mpm.eeprom
+import usrp_mpm.tlv_eeprom
+from usrp_mpm.eeprom import MboardEEPROM
+from usrp_mpm.periph_manager.base import PeriphManagerBase
+
+def get_eeprom_filename(name):
+ """
+ location of EEPROM test file relative to test
+ """
+ return os.path.join(os.path.dirname(__file__), "eeprom_tests", name)
+
+class TestEeprom(TestBase):
+ """
+ Tests EEPROM readers of different versions. Each reader is expected to
+ return a dictionary with values read by the reader. The tests pass
+ the dictionary to _check_data which checks equality of all data as well as
+ that both dicts contain the same keys.
+ """
+
+ # tag map for tlv eeprom tests
+ tagmap = {
+ # typical board map
+ 0x42: usrp_mpm.tlv_eeprom.NamedStruct(
+ '< H H H 7s 1x', ['pid', 'rev', 'rev_compat', 'serial']),
+ # tow additional maps to test unpack of multiple maps in a single eeprom
+ 0x47: usrp_mpm.tlv_eeprom.NamedStruct(
+ '< B B H', ['byte1', 'byte2', 'short']),
+ 0x11: usrp_mpm.tlv_eeprom.NamedStruct(
+ '< L', ['long'])
+ }
+ magic = 0xCEF10F00
+
+ def _check_data(self, data, **kwargs):
+ #generic data check with kwargs containing key-value pairs
+ self.assertEqual(len(kwargs), len(data),
+ "test does not check all items "
+ "(Expected: %s Read: %s)" %
+ (kwargs.keys(), data.keys()))
+ for key, value in kwargs.items():
+ self.assertTrue(key in data, "data does not contain %s" % key)
+ self.assertEqual(data[key], value,
+ "%s does not match. Expected: %s, Received: %s" %
+ (key, value, data[key]))
+
+ def test_eeprom_legacy_minsize(self):
+ """
+ check that empty eeprom files raises struct error
+ """
+ self.assertRaises(struct.error,
+ usrp_mpm.eeprom.read_eeprom,
+ get_eeprom_filename("empty.eeprom"),
+ 0,
+ MboardEEPROM.eeprom_header_format,
+ MboardEEPROM.eeprom_header_keys,
+ PeriphManagerBase.dboard_eeprom_magic)
+
+ def test_eeprom_mboard_v1(self):
+ """
+ read valid v1 map
+ """
+ keys = MboardEEPROM.eeprom_header_keys
+ (data, _) = usrp_mpm.eeprom.read_eeprom(
+ get_eeprom_filename("legacy_mboard_v1.eeprom"),
+ 0,
+ MboardEEPROM.eeprom_header_format,
+ keys,
+ PeriphManagerBase.mboard_eeprom_magic)
+ self._check_data(
+ data,
+ magic=PeriphManagerBase.mboard_eeprom_magic,
+ eeprom_version=1,
+ mcu_flags=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ pid=0xDEAD,
+ rev=0xABCD,
+ serial=b"mbrd_v1",
+ mac_addresses=b'\x01\x02\x03\x04\x05\x06\x00\x00'
+ b'\x0f\x0e\r\x0c\x0b\n\x00\x00\x11'
+ b'"3DUf\x00\x00',
+ CRC=0x02CC50AA)
+
+ def test_eeprom_mboard_v2(self):
+ """
+ read valid v2 map
+ """
+ (data, _) = usrp_mpm.eeprom.read_eeprom(
+ get_eeprom_filename("legacy_mboard_v2.eeprom"),
+ 0,
+ MboardEEPROM.eeprom_header_format,
+ MboardEEPROM.eeprom_header_keys,
+ PeriphManagerBase.mboard_eeprom_magic)
+ self._check_data(
+ data,
+ magic=PeriphManagerBase.mboard_eeprom_magic,
+ eeprom_version=2,
+ mcu_flags=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ pid=0xDEAD,
+ rev=0xBEEF,
+ serial=b"mbrd_v2",
+ mac_eth0=b'\x01\x02\x03\x04\x05\x06',
+ dt_compat=0xD1C0,
+ mac_eth1=b'\x0f\x0e\r\x0c\x0b\n',
+ ec_compat=0xECC0,
+ mac_eth2=b'\x11"3DUf',
+ CRC=0x42097DAC)
+
+ def test_eeprom_mboard_v3(self):
+ """
+ read valid v3 map
+ """
+ (data, _) = usrp_mpm.eeprom.read_eeprom(
+ get_eeprom_filename("legacy_mboard_v3.eeprom"),
+ 0,
+ MboardEEPROM.eeprom_header_format,
+ MboardEEPROM.eeprom_header_keys,
+ PeriphManagerBase.mboard_eeprom_magic)
+ self._check_data(
+ data,
+ magic=PeriphManagerBase.mboard_eeprom_magic,
+ eeprom_version=3,
+ mcu_flags=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ pid=0xDEAD,
+ rev=0xBEEF,
+ serial=b"mbrd_v3",
+ mac_eth0=b'\x01\x02\x03\x04\x05\x06',
+ dt_compat=0xD1C0,
+ mac_eth1=b'\x0f\x0e\r\x0c\x0b\n',
+ ec_compat=0xECC0,
+ mac_eth2=b'\x11"3DUf',
+ rev_compat=0x4EC0,
+ CRC=0x2E52CB41)
+
+ def test_eeprom_tlv_single(self):
+ """
+ read eeprom with tag map
+ """
+ (data, _) = usrp_mpm.tlv_eeprom.read_eeprom(
+ get_eeprom_filename("tlv_single.eeprom"),
+ self.tagmap,
+ self.magic)
+ self._check_data(
+ data,
+ rev=2,
+ rev_compat=2,
+ pid=0x410,
+ serial=b'3196D29')
+
+ def test_eeprom_tlv_multiple(self):
+ """
+ read eeprom with multiple tag maps
+ """
+ (data, _) = usrp_mpm.tlv_eeprom.read_eeprom(
+ get_eeprom_filename("tlv_multiple.eeprom"),
+ self.tagmap,
+ self.magic)
+ self._check_data(
+ data,
+ rev=2,
+ rev_compat=2,
+ pid=0x410,
+ serial=b'3196D29',
+ byte1=0x08,
+ byte2=0x15,
+ short=0xEFBE,
+ long=0xBEBAFECA)
+
+ def test_eeprom_tlv_unknown_tagmap(self):
+ """
+ Check that reading unknown tag map ID leads to empty data map instead
+ of runtime error
+ """
+ (data, _) = usrp_mpm.tlv_eeprom.read_eeprom(
+ get_eeprom_filename("tlv_unknown_tagmap.eeprom"),
+ self.tagmap,
+ self.magic)
+ self._check_data(data)
+
+ def test_eeprom_tlv_unknown_wrong_maplen(self):
+ """
+ Check that invalid map len results in TypeError
+ """
+ self.assertRaises(TypeError,
+ usrp_mpm.tlv_eeprom.read_eeprom,
+ get_eeprom_filename("tlv_wrong_maplen.eeprom"),
+ self.tagmap,
+ self.magic)