Skip to content

Commit 8510035

Browse files
committed
Move NVRAM migration tests into a separate module
1 parent cf486c1 commit 8510035

File tree

3 files changed

+114
-155
lines changed

3 files changed

+114
-155
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import pytest
2+
3+
import zigpy_znp.const as const
4+
import zigpy_znp.types as t
5+
import zigpy_znp.commands as c
6+
from zigpy_znp.types.nvids import ExNvIds, OsalNvIds
7+
8+
from ..conftest import FORMED_DEVICES, FormedZStack3CC2531
9+
10+
pytestmark = [pytest.mark.asyncio]
11+
12+
13+
@pytest.mark.parametrize("device", FORMED_DEVICES)
14+
async def test_addrmgr_empty_entries(make_connected_znp, device):
15+
znp, znp_server = await make_connected_znp(server_cls=device)
16+
17+
if znp.version >= 3.30:
18+
entries = [
19+
entry
20+
async for entry in znp.nvram.read_table(
21+
item_id=ExNvIds.ADDRMGR,
22+
item_type=t.AddrMgrEntry,
23+
)
24+
]
25+
else:
26+
entries = list(
27+
await znp.nvram.osal_read(
28+
OsalNvIds.ADDRMGR, item_type=t.AddressManagerTable
29+
)
30+
)
31+
32+
num_empty = 0
33+
34+
for entry in entries:
35+
if entry.extAddr != t.EUI64.convert("FF:FF:FF:FF:FF:FF:FF:FF"):
36+
continue
37+
38+
num_empty += 1
39+
40+
if znp.version >= 3.30:
41+
assert entry == const.EMPTY_ADDR_MGR_ENTRY_ZSTACK3
42+
else:
43+
assert entry == const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1
44+
45+
assert num_empty > 0
46+
47+
48+
@pytest.mark.parametrize("device", [FormedZStack3CC2531])
49+
async def test_addrmgr_rewrite_fix(device, make_application, mocker):
50+
# Keep track of reads
51+
addrmgr_reads = []
52+
53+
correct_entry = t.AddrMgrEntry(
54+
type=t.AddrMgrUserType.Default,
55+
nwkAddr=0xFFFF,
56+
extAddr=t.EUI64.convert("FF:FF:FF:FF:FF:FF:FF:FF"),
57+
)
58+
59+
bad_entry = t.AddrMgrEntry(
60+
type=t.AddrMgrUserType(0xFF),
61+
nwkAddr=0xFFFF,
62+
extAddr=t.EUI64.convert("FF:FF:FF:FF:FF:FF:FF:FF"),
63+
)
64+
65+
app, znp_server = make_application(server_cls=device)
66+
znp_server.callback_for_response(
67+
c.SYS.OSALNVReadExt.Req(Id=OsalNvIds.ADDRMGR, Offset=0), addrmgr_reads.append
68+
)
69+
70+
nvram = znp_server._nvram[ExNvIds.LEGACY]
71+
old_addrmgr, _ = t.AddressManagerTable.deserialize(nvram[OsalNvIds.ADDRMGR])
72+
73+
# Ensure the table looks the way we expect
74+
assert old_addrmgr.count(correct_entry) == 58
75+
assert old_addrmgr.count(bad_entry) == 0
76+
77+
assert nvram[OsalNvIds.ADDRMGR] == b"".join([e.serialize() for e in old_addrmgr])
78+
79+
# Purposefully corrupt the empty entries
80+
nvram[OsalNvIds.ADDRMGR] = b"".join(
81+
[(bad_entry if e == correct_entry else e).serialize() for e in old_addrmgr]
82+
)
83+
assert old_addrmgr != nvram[OsalNvIds.ADDRMGR]
84+
85+
assert len(addrmgr_reads) == 0
86+
await app.startup()
87+
await app.shutdown()
88+
assert len(addrmgr_reads) == 2
89+
90+
# Bad entries have been fixed
91+
new_addrmgr, _ = t.AddressManagerTable.deserialize(nvram[OsalNvIds.ADDRMGR])
92+
assert new_addrmgr == old_addrmgr
93+
94+
# Migration has been created
95+
assert t.uint8_t.deserialize(nvram[OsalNvIds.ZIGPY_ZNP_MIGRATION_ID])[0] >= 1
96+
97+
# Will not be read again
98+
assert len(addrmgr_reads) == 2
99+
await app.startup()
100+
await app.shutdown()
101+
assert len(addrmgr_reads) == 2
102+
103+
# Will be migrated again if the migration NVID is deleted
104+
del nvram[OsalNvIds.ZIGPY_ZNP_MIGRATION_ID]
105+
106+
old_addrmgr2 = nvram[OsalNvIds.ADDRMGR]
107+
108+
assert len(addrmgr_reads) == 2
109+
await app.startup()
110+
await app.shutdown()
111+
assert len(addrmgr_reads) == 3
112+
113+
# But nothing will change
114+
assert nvram[OsalNvIds.ADDRMGR] == old_addrmgr2

tests/application/test_startup.py

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import pytest
22

3-
import zigpy_znp.const as const
43
import zigpy_znp.types as t
54
import zigpy_znp.config as conf
65
import zigpy_znp.commands as c
@@ -17,7 +16,6 @@
1716
FormedZStack1CC2531,
1817
FormedZStack3CC2531,
1918
FormedLaunchpadCC26X2R1,
20-
load_nvram_json,
2119
)
2220

2321
pytestmark = [pytest.mark.asyncio]
@@ -269,27 +267,3 @@ async def test_auto_form_necessary(device, make_application, mocker):
269267
assert nvram[OsalNvIds.ZDO_DIRECT_CB] == t.Bool(True).serialize()
270268

271269
await app.shutdown()
272-
273-
274-
class BadAddrMgrZStack3CC2531(FormedZStack3CC2531):
275-
def __init__(self, *args, **kwargs):
276-
super().__init__(*args, **kwargs)
277-
278-
self._nvram = load_nvram_json("CC2531-ZStack3.bad_addrmgr.json")
279-
280-
281-
@pytest.mark.parametrize("device", [BadAddrMgrZStack3CC2531])
282-
async def test_addrmgr_rewrite_fix(device, make_application, mocker):
283-
app, znp_server = make_application(server_cls=device)
284-
285-
nvram = znp_server._nvram[ExNvIds.LEGACY]
286-
old_addrmgr = nvram[OsalNvIds.ADDRMGR]
287-
assert old_addrmgr.count(const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1.serialize()) == 0
288-
289-
await app.startup()
290-
await app.shutdown()
291-
292-
new_addrmgr = nvram[OsalNvIds.ADDRMGR]
293-
294-
assert old_addrmgr != new_addrmgr
295-
assert new_addrmgr.count(const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1.serialize()) != 0

tests/nvram/CC2531-ZStack3.bad_addrmgr.json

Lines changed: 0 additions & 129 deletions
This file was deleted.

0 commit comments

Comments
 (0)