Skip to content

Commit 42d2794

Browse files
committed
[test] Add device file consistency test
1 parent e5c80a2 commit 42d2794

File tree

2 files changed

+193
-0
lines changed

2 files changed

+193
-0
lines changed

test/device_file_test.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
2+
import unittest
3+
import glob
4+
import os
5+
6+
import modm_devices.parser
7+
8+
DEVICE_FILES = None
9+
10+
class DeviceFileTest(unittest.TestCase):
11+
12+
def setUp(self):
13+
global DEVICE_FILES
14+
if DEVICE_FILES is None:
15+
DEVICE_FILES = {}
16+
device_files = os.path.join(os.path.dirname(__file__), "../../../devices/**/*.xml")
17+
device_file_names = glob.glob(device_files)
18+
19+
# Parse the files and build the :target enumeration
20+
parser = modm_devices.parser.DeviceParser()
21+
for device_file_name in device_file_names:
22+
for device in parser.parse(device_file_name).get_devices():
23+
DEVICE_FILES[device.partname] = device
24+
self.devices = DEVICE_FILES
25+
26+
27+
def tearDown(self):
28+
self.devices = None
29+
30+
def get_drivers(self, device):
31+
drivers = []
32+
for d in device._properties["driver"]:
33+
if "instance" in d:
34+
drivers.extend( (d["name"], i) for i in d["instance"] )
35+
else:
36+
drivers.append( (d["name"],) )
37+
return drivers
38+
39+
def test_drivers(self):
40+
failures = 0
41+
for name, device in self.devices.items():
42+
def assertIn(key, obj):
43+
if key not in obj:
44+
print('{}: Missing "{}" key in "{}"!'.format(name, key, obj))
45+
nonlocal failures
46+
failures += 1
47+
return False
48+
return True
49+
drivers = self.get_drivers(device)
50+
gpios = device.get_driver("gpio")
51+
assertIn("gpio", gpios)
52+
for gpio in gpios.get("gpio", []):
53+
signals = []
54+
for signal in gpio.get("signal", []):
55+
# Check for name and driver keys in each signal
56+
assertIn("name", signal)
57+
if assertIn("driver", signal):
58+
# Check if the signal driver is known
59+
if "instance" in signal:
60+
driver = (signal["driver"], signal["instance"])
61+
else:
62+
driver = (signal["driver"],)
63+
signals.append( (*driver, signal["name"]) )
64+
# assertIn(driver, drivers)
65+
66+
# Check for duplicate signals
67+
if not len(signals) == len(set(signals)):
68+
duplicates = set(x for x in signals if signals.count(x) > 1)
69+
print("{}: duplicated signals for P{}{}: {}".format(
70+
name, gpio["port"].upper(), gpio["pin"], duplicates))
71+
failures += 1
72+
73+
self.assertEqual(failures, 0, "Found inconsistencies in the device files!")
74+
75+
76+
77+
78+
79+
80+

test/device_identifier_test.py

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
2+
import unittest
3+
4+
from modm_devices.exception import DeviceIdentifierException
5+
from modm_devices.device_identifier import DeviceIdentifier, MultiDeviceIdentifier
6+
7+
class DeviceIdentifierTest(unittest.TestCase):
8+
9+
def test_should_construct_empty(self):
10+
ident = DeviceIdentifier()
11+
self.assertEqual(repr(ident), "DeviceId()")
12+
self.assertEqual(len(ident.keys()), 0)
13+
self.assertRaises(DeviceIdentifierException,
14+
lambda: ident.string)
15+
self.assertRaises(DeviceIdentifierException,
16+
lambda: str(ident))
17+
self.assertRaises(AttributeError,
18+
lambda: ident.whatevs)
19+
20+
21+
def test_setter_getter(self):
22+
ident = DeviceIdentifier()
23+
ident.set("platform", "stm32")
24+
self.assertEqual(ident.get("platform"), "stm32")
25+
self.assertEqual(ident["platform"], "stm32")
26+
self.assertEqual(ident.platform, "stm32")
27+
self.assertEqual(repr(ident), "DeviceId(platformstm32)")
28+
self.assertRaises(DeviceIdentifierException,
29+
lambda: ident.string)
30+
self.assertRaises(DeviceIdentifierException,
31+
lambda: str(ident))
32+
33+
ident.set("platform", "avr")
34+
self.assertEqual(ident.get("platform"), "avr")
35+
self.assertEqual(ident["platform"], "avr")
36+
self.assertEqual(ident.platform, "avr")
37+
38+
self.assertEqual(ident.get("whatevs"), None)
39+
self.assertEqual(ident.get("whatevs", "default"), "default")
40+
self.assertEqual(ident["whatevs"], None)
41+
self.assertRaises(AttributeError,
42+
lambda: ident.whatevs)
43+
44+
45+
def test_naming_schema(self):
46+
ident = DeviceIdentifier("{platform}{family}{name}")
47+
self.assertEqual(ident.string, "")
48+
ident.set("platform", "stm32")
49+
self.assertEqual(ident.string, "stm32")
50+
ident.set("name", "03")
51+
self.assertEqual(ident.string, "stm3203")
52+
ident.set("family", "f1")
53+
self.assertEqual(ident.string, "stm32f103")
54+
55+
self.assertEqual(str(ident), "stm32f103")
56+
self.assertEqual(repr(ident), "stm32f103")
57+
self.assertEqual(hash(ident), hash("familyf1name03platformstm32{platform}{family}{name}"))
58+
59+
ident2 = DeviceIdentifier("{platform}{family}{name}")
60+
ident2.set("platform", "stm32")
61+
ident2.set("family", "f1")
62+
ident2.set("name", "03")
63+
self.assertEqual(hash(ident2), hash("familyf1name03platformstm32{platform}{family}{name}"))
64+
65+
self.assertTrue(ident == ident2)
66+
self.assertFalse(ident != ident2)
67+
self.assertEqual(ident, ident2)
68+
69+
ident3 = DeviceIdentifier("{platform}{family}")
70+
ident3.set("platform", "stm32")
71+
ident3.set("family", "f1")
72+
self.assertEqual(hash(ident3), hash("familyf1platformstm32{platform}{family}"))
73+
74+
self.assertTrue(ident != ident3)
75+
self.assertFalse(ident == ident3)
76+
self.assertNotEqual(ident, ident3)
77+
78+
79+
def test_copy(self):
80+
ident = DeviceIdentifier("{platform}")
81+
ident.set("platform", "stm32")
82+
83+
ident2 = ident.copy()
84+
self.assertEqual(ident2.platform, "stm32")
85+
self.assertEqual(ident2.naming_schema, "{platform}")
86+
ident2.set("platform", "avr")
87+
self.assertEqual(ident2.platform, "avr")
88+
self.assertEqual(ident.platform, "stm32")
89+
ident2.naming_schema = "{platform}{family}"
90+
self.assertEqual(ident2.naming_schema, "{platform}{family}")
91+
self.assertEqual(ident.naming_schema, "{platform}")
92+
93+
94+
95+
class MultiDeviceIdentifierTest(unittest.TestCase):
96+
97+
def setUp(self):
98+
self.ident = MultiDeviceIdentifier()
99+
100+
def test_should_construct_empty(self):
101+
self.assertEqual(self.ident.string, "")
102+
self.assertEqual(self.ident.naming_schema, "")
103+
104+
def test_should_merge_naming_schemas(self):
105+
106+
self.ident.append(DeviceIdentifier("{one}"))
107+
self.assertEqual(self.ident.naming_schema, "{one}")
108+
109+
self.ident.append(DeviceIdentifier("{one}"))
110+
self.assertEqual(self.ident.naming_schema, "{one}")
111+
112+
self.ident.append(DeviceIdentifier("{one}{two}"))
113+
self.assertEqual(self.ident.naming_schema, "{one}{one}{two}")

0 commit comments

Comments
 (0)