Skip to content

Commit c84f697

Browse files
committed
feat(conformance_test): Add conformance test
1 parent f45052c commit c84f697

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

mm_pal/conformance_test.py

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""A conformance test to ensure devices adhere to the the specifications."""
2+
from collections import ChainMap
3+
from mm_pal.mm_if import MmIf
4+
5+
6+
class BaseConformanceSuite:
7+
"""Base class for conformance tests."""
8+
9+
def target(self) -> MmIf: # pragma: no cover
10+
"""Target to test, overridden by device."""
11+
raise NotImplementedError
12+
13+
def test_read_reg(self, target: MmIf):
14+
"""Read all registers."""
15+
for key, val in target.mem_map.items():
16+
res = target.read_reg(key)
17+
if val.get('default'):
18+
assert val.get('default') == res
19+
20+
def test_read_struct(self, target: MmIf):
21+
"""Read only structs."""
22+
regs = {}
23+
for key in target.mem_map.keys():
24+
name = key.split('.')
25+
if len(name) > 1:
26+
if name[0] not in regs:
27+
regs[name[0]] = []
28+
if not key.endswith('.res') and not key.endswith('.padding'):
29+
regs[name[0]].append(key)
30+
for key, reg_names in regs.items():
31+
res = dict(ChainMap(*target.read_struct(key)))
32+
33+
for reg_name in reg_names:
34+
if self._consistent_reg(target, reg_name):
35+
assert res[reg_name] == target.read_reg(reg_name)
36+
37+
def test_write_reg(self, target: MmIf):
38+
"""Write all registers."""
39+
for key, val in target.mem_map.items():
40+
try:
41+
if val['access'] & self.resolved_write_permission:
42+
res = target.read_reg(key)
43+
res = target.write_reg(key, res)
44+
except AttributeError:
45+
res = target.read_reg(key)
46+
res = target.write_reg(key, res)
47+
48+
def _consistent_reg(self, target: MmIf, reg_name):
49+
"""Check if a register can be consistently read."""
50+
flags = target.mem_map[reg_name].get('flag', "").split()
51+
if "VOLATILE" in flags:
52+
return False
53+
if "DEVICE_SPECIFIC" in flags:
54+
return False
55+
return True

tests/test_conformance.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from mm_pal.conformance_test import BaseConformanceSuite
2+
import pytest
3+
4+
class TestMockIf(BaseConformanceSuite):
5+
@pytest.fixture
6+
def target(self, mock_app_json, mm_if_inst):
7+
self.resolved_write_permission = 1
8+
return mm_if_inst

0 commit comments

Comments
 (0)