Skip to content

Replace internal network state objects with zigpy.state #85

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Oct 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ target/

# virtualenv
.venv/
.venv*/
venv/
ENV/

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
python_requires=">=3.7",
install_requires=[
"pyserial-asyncio>=0.6", # 0.5 is broken on Windows
"zigpy>=0.37.0",
"zigpy>=0.40.0",
"async_timeout",
"voluptuous",
"coloredlogs",
Expand Down
39 changes: 39 additions & 0 deletions tests/api/test_network_state.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import dataclasses

import pytest

from ..conftest import ALL_DEVICES, FORMED_DEVICES, BaseZStack1CC2531

pytestmark = [pytest.mark.asyncio]


@pytest.mark.parametrize("to_device", ALL_DEVICES)
@pytest.mark.parametrize("from_device", FORMED_DEVICES)
async def test_state_transfer(from_device, to_device, make_connected_znp):
formed_znp, _ = await make_connected_znp(server_cls=from_device)

await formed_znp.load_network_info()
formed_znp.close()

empty_znp, _ = await make_connected_znp(server_cls=to_device)

await empty_znp.write_network_info(
network_info=formed_znp.network_info,
node_info=formed_znp.node_info,
)
await empty_znp.load_network_info()

# Z-Stack 1 devices can't have some security info read out
if issubclass(from_device, BaseZStack1CC2531):
assert formed_znp.network_info == dataclasses.replace(
empty_znp.network_info, stack_specific={}
)
elif issubclass(to_device, BaseZStack1CC2531):
assert (
dataclasses.replace(formed_znp.network_info, stack_specific={})
== empty_znp.network_info
)
else:
assert formed_znp.network_info == empty_znp.network_info

assert formed_znp.node_info == empty_znp.node_info
22 changes: 11 additions & 11 deletions tests/api/test_nvram.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ async def test_osal_writes_invalid(connected_znp):

# Passing in untyped integers is not allowed
with pytest.raises(TypeError):
await znp.nvram.osal_write(nvids.OsalNvIds.STARTUP_OPTION, 0xAB)
await znp.nvram.osal_write(nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1, 0xAB)

# Neither is passing in an empty value
with pytest.raises(ValueError):
await znp.nvram.osal_write(nvids.OsalNvIds.STARTUP_OPTION, b"")
await znp.nvram.osal_write(nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1, b"")

# Or a type that serializes to an empty value
class Empty:
Expand All @@ -27,7 +27,7 @@ def serialize(self):
assert Empty().serialize() == b""

with pytest.raises(ValueError):
await znp.nvram.osal_write(nvids.OsalNvIds.STARTUP_OPTION, Empty())
await znp.nvram.osal_write(nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1, Empty())


@pytest.mark.parametrize(
Expand All @@ -41,7 +41,7 @@ def serialize(self):
async def test_osal_write_existing(connected_znp, value):
znp, znp_server = connected_znp

nvid = nvids.OsalNvIds.STARTUP_OPTION
nvid = nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1

# The item is one byte long
length_rsp = znp_server.reply_once_to(
Expand All @@ -65,7 +65,7 @@ async def test_osal_write_existing(connected_znp, value):
async def test_osal_write_same_length(connected_znp):
znp, znp_server = connected_znp

nvid = nvids.OsalNvIds.STARTUP_OPTION
nvid = nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1
value = b"\x01"

# The existing item is also one byte long so we will not recreate it
Expand All @@ -87,7 +87,7 @@ async def test_osal_write_same_length(connected_znp):
await write_rsp


@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.STARTUP_OPTION])
@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1])
@pytest.mark.parametrize("value", [b"\x01\x02"])
@pytest.mark.parametrize("create", [True, False])
async def test_osal_write_wrong_length(connected_znp, nvid, value, create):
Expand Down Expand Up @@ -130,7 +130,7 @@ async def test_osal_write_wrong_length(connected_znp, nvid, value, create):
assert not write_rsp.done()


@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.STARTUP_OPTION])
@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1])
@pytest.mark.parametrize("value", [b"test"])
async def test_osal_write_bad_length(connected_znp, nvid, value):
znp, znp_server = connected_znp
Expand All @@ -147,7 +147,7 @@ async def test_osal_write_bad_length(connected_znp, nvid, value):
await length_rsp


@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.STARTUP_OPTION])
@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1])
@pytest.mark.parametrize("value", [b"test"])
async def test_osal_read_success(connected_znp, nvid, value):
znp, znp_server = connected_znp
Expand All @@ -169,7 +169,7 @@ async def test_osal_read_success(connected_znp, nvid, value):
assert result == value


@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.STARTUP_OPTION])
@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1])
@pytest.mark.parametrize("value", [b"test" * 62 + b"x"]) # 248 + 1 bytes, needs two
async def test_osal_read_long_success(connected_znp, nvid, value):
znp, znp_server = connected_znp
Expand Down Expand Up @@ -197,7 +197,7 @@ async def test_osal_read_long_success(connected_znp, nvid, value):
assert result == value


@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.STARTUP_OPTION])
@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1])
async def test_osal_read_failure(connected_znp, nvid):
znp, znp_server = connected_znp

Expand All @@ -212,7 +212,7 @@ async def test_osal_read_failure(connected_znp, nvid):
await length_rsp


@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.STARTUP_OPTION])
@pytest.mark.parametrize("nvid", [nvids.OsalNvIds.HAS_CONFIGURED_ZSTACK1])
async def test_osal_write_nonexistent(connected_znp, nvid):
znp, znp_server = connected_znp

Expand Down
4 changes: 2 additions & 2 deletions tests/application/test_connect.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,13 +245,13 @@ async def test_reconnect_lockup_pyserial(device, event_loop, make_application, m

did_load_info = asyncio.get_running_loop().create_future()

async def patched_load_network_info(*, old_load=app._load_network_info):
async def patched_load_network_info(*, old_load=app.load_network_info):
try:
return await old_load()
finally:
did_load_info.set_result(True)

with swap_attribute(app, "_load_network_info", patched_load_network_info):
with swap_attribute(app, "load_network_info", patched_load_network_info):
# "Drop" the connection like PySerial
app._znp._uart.connection_lost(exc=None)

Expand Down
7 changes: 3 additions & 4 deletions tests/application/test_startup.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,7 @@ async def test_info(
assert app.extended_pan_id == t.EUI64.convert("ff:ff:ff:ff:ff:ff:ff:ff")
assert app.channel is None
assert app.channels is None
assert app.network_key is None
assert app.network_key_seq is None
assert app.state.network_information.network_key is None

await app.startup(auto_form=False)

Expand All @@ -85,8 +84,8 @@ async def test_info(
assert app.extended_pan_id == ext_pan_id
assert app.channel == channel
assert app.channels == channels
assert app.network_key == network_key
assert app.network_key_seq == 0
assert app.state.network_information.network_key.key == network_key
assert app.state.network_information.network_key.seq == 0

assert app.zigpy_device.manufacturer == "Texas Instruments"
assert app.zigpy_device.model == model
Expand Down
57 changes: 0 additions & 57 deletions tests/application/test_update_network.py

This file was deleted.

Loading