Skip to content
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

New radio API #848

Merged
merged 44 commits into from Jun 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
f6b5787
[WIP] New radio settings API
puddly Nov 10, 2021
6c1b85d
Shorten `NetworkInformation` to `NetworkInfo`, to match `NodeInfo`
puddly Nov 10, 2021
4705afd
Fix references to removed network properties
puddly Nov 12, 2021
6cd0ff2
Allow `FixedIntType` objects to be pickled
puddly Nov 14, 2021
cfceb83
Add a new `FormationFailure` exception
puddly Nov 14, 2021
f263cf2
Use `ZigBeeAlliance09` instead of hex ints for the default TC link key
puddly Nov 14, 2021
1a45dbf
Fix unit tests
puddly Nov 16, 2021
7ab8a0d
Re-add `probe` classmethod
puddly Nov 16, 2021
fc1a08a
Exclude unimplemented abstract methods from coverage
puddly Nov 16, 2021
db8e5b3
Improve test coverage
puddly Nov 16, 2021
1fb50b2
Fix unit tests to work with Python 3.7
puddly Nov 16, 2021
8057fb4
Store extended network state information in `internal` an JSON subkey
puddly Nov 28, 2021
9775065
Use `Key` classes for TCLK and network key, again
puddly Dec 12, 2021
3ee63ed
Remove reference to `tc_address`
puddly Dec 16, 2021
9333263
Add more type annotations
puddly Dec 26, 2021
e7e6870
Add a `replace` method to the state dataclasses
puddly Feb 12, 2022
94760d6
Merge branch 'dev' into puddly/new-radio-settings-api
puddly Feb 23, 2022
c2ad812
Merge remote-tracking branch 'zigpy/dev' into puddly/new-radio-settin…
puddly Feb 25, 2022
0c1bc0e
Move `connect`/`disconnect` into `startup`
puddly Feb 27, 2022
c6d6b1f
Merge branch 'dev' into puddly/new-radio-settings-api
puddly Feb 27, 2022
4c78afc
Apply the config schema within `ControllerApplication.__init__`
puddly Mar 6, 2022
6805f96
Remove duplicate `ControllerApplication._send_sequence`
puddly Mar 6, 2022
0a6bcf4
Use the radio library config schema, not the zigpy schema
puddly Mar 7, 2022
312b7c3
Ensure the well-known TCLK is used when `form_network` is called
puddly Mar 14, 2022
d1706ed
Re-use the device IEEE address when forming a new network
puddly Mar 15, 2022
d9129db
Add deprecated properties back to `ControllerApplication`
puddly Mar 17, 2022
9a6ff5b
Default TC address to `t.EUI64.UNKNOWN`
puddly Mar 23, 2022
75f494e
Merge branch 'dev' into puddly/new-radio-settings-api
puddly Mar 31, 2022
e1a4c1e
Merge branch 'dev' into puddly/new-radio-settings-api
puddly Apr 14, 2022
cd2d090
Create a `ControllerApplication.register_endpoint` method
puddly Apr 16, 2022
660ab1e
Rename `register_endpoint` to `add_endpoint`
puddly Apr 18, 2022
8593f1a
Create a `register_endpoints` method with defaults
puddly Apr 19, 2022
8cadae8
Merge branch 'dev' into puddly/new-radio-settings-api
puddly May 2, 2022
52b3e13
Add a `_device` property to the app referencing the current device
puddly May 10, 2022
9673a44
Merge branch 'dev' into puddly/new-radio-settings-api
puddly May 10, 2022
1c5496b
Add more startup debug logs
puddly May 14, 2022
186de2d
Allow radios to specify `metadata` in the network info
puddly May 14, 2022
2ebd351
Create a `source` field in network info
puddly May 14, 2022
6efb275
Clean up network info dictionary code
puddly May 14, 2022
018105e
Use correct property name for logging network info
puddly May 15, 2022
839dccb
Fix unit tests
puddly May 15, 2022
25eb04d
Merge remote-tracking branch 'zigpy/dev' into puddly/new-radio-settin…
puddly May 23, 2022
4ea5a39
Merge branch 'dev' into puddly/new-radio-settings-api
puddly Jun 7, 2022
a1c654a
Add deprecated properties for old `_information` attributes
puddly Jun 13, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
70 changes: 60 additions & 10 deletions tests/conftest.py
@@ -1,5 +1,6 @@
"""Common fixtures."""
import logging
from unittest.mock import patch

import pytest

Expand Down Expand Up @@ -38,12 +39,6 @@ def raise_on_bad_log_formatting():


class App(zigpy.application.ControllerApplication):
async def shutdown(self):
pass

async def startup(self, auto_form=False):
pass

async def request(
self,
device,
Expand All @@ -58,11 +53,60 @@ async def request(
):
pass

async def connect(self):
pass

async def disconnect(self):
pass

async def start_network(self):
pass

async def force_remove(self, dev):
pass

async def add_endpoint(self, descriptor):
pass

async def permit_ncp(self, time_s=60):
pass

async def probe(self, config):
return True
async def broadcast(
self,
profile,
cluster,
src_ep,
dst_ep,
grpid,
radius,
sequence,
data,
broadcast_address,
):
pass

async def mrequest(
self,
group_id,
profile,
cluster,
src_ep,
sequence,
data,
*,
hops=0,
non_member_radius=3,
):
pass

async def permit_with_key(self, node, code, time_s=60):
pass

async def write_network_info(self, *, network_info, node_info):
pass

async def load_network_info(self, *, load_devices=False):
pass


@pytest.fixture
Expand All @@ -72,8 +116,14 @@ def app_mock():
config = App.SCHEMA(
{CONF_DATABASE: None, CONF_DEVICE: {CONF_DEVICE_PATH: "/dev/null"}}
)
app_mock = MagicMock(spec_set=App(config))
app_mock.state.node_information = app_state.NodeInfo(

app = App(config)

# Accessing the property fails when the mock's `spec_set` is being created
with patch.object(app, "devices"):
app_mock = MagicMock(spec_set=app)

app_mock.state.node_info = app_state.NodeInfo(
t.NWK(0x0000), ieee=NCP_IEEE, logical_type=zdo_t.LogicalType.Coordinator
)
return app_mock
82 changes: 82 additions & 0 deletions tests/test_app_state.py
Expand Up @@ -3,6 +3,8 @@
import pytest

import zigpy.state as app_state
import zigpy.types as t
import zigpy.zdo.types as zdo_t

COUNTER_NAMES = ["counter_1", "counter_2", "some random name"]

Expand Down Expand Up @@ -210,3 +212,83 @@ def test_counter_groups():

new_groups = [group for group in groups]
assert new_groups == [counter_group]


@pytest.fixture
def node_info():
return app_state.NodeInfo(
nwk=t.NWK(0x0000),
ieee=t.EUI64.convert("93:2C:A9:34:D9:D0:5D:12"),
logical_type=zdo_t.LogicalType.Coordinator,
)


@pytest.fixture
def network_info(node_info):
return app_state.NetworkInfo(
extended_pan_id=t.ExtendedPanId.convert("0D:49:91:99:AE:CD:3C:35"),
pan_id=t.PanId(0x9BB0),
nwk_update_id=0x12,
nwk_manager_id=t.NWK(0x0000),
channel=t.uint8_t(15),
channel_mask=t.Channels.from_channel_list([15, 20, 25]),
security_level=t.uint8_t(5),
network_key=app_state.Key(
key=t.KeyData.convert("9A:79:D6:9A:DA:EC:45:C6:F2:EF:EB:AF:DA:A3:07:B6"),
seq=108,
tx_counter=39009277,
),
tc_link_key=app_state.Key(
key=t.KeyData(b"ZigBeeAlliance09"),
partner_ieee=node_info.ieee,
tx_counter=8712428,
),
key_table=[
app_state.Key(
key=t.KeyData.convert(
"85:7C:05:00:3E:76:1A:F9:68:9A:49:41:6A:60:5C:76"
),
tx_counter=3792973670,
rx_counter=1083290572,
seq=147,
partner_ieee=t.EUI64.convert("69:0C:07:52:AA:D7:7D:71"),
),
app_state.Key(
key=t.KeyData.convert(
"CA:02:E8:BB:75:7C:94:F8:93:39:D3:9C:B3:CD:A7:BE"
),
tx_counter=2597245184,
rx_counter=824424412,
seq=19,
partner_ieee=t.EUI64.convert("A3:1A:F6:8E:19:95:23:BE"),
),
],
children=[
# Has a key
t.EUI64.convert("A3:1A:F6:8E:19:95:23:BE"),
# Does not have a key
t.EUI64.convert("C6:DF:28:F9:60:33:DB:03"),
],
# If exposed by the stack, NWK addresses of other connected devices on the network
nwk_addresses={
# Two children above
t.EUI64.convert("A3:1A:F6:8E:19:95:23:BE"): t.NWK(0x2C59),
t.EUI64.convert("C6:DF:28:F9:60:33:DB:03"): t.NWK(0x1CA0),
# Random devices on the network
t.EUI64.convert("7A:BF:38:A9:59:21:A0:7A"): t.NWK(0x16B5),
t.EUI64.convert("10:55:FE:67:24:EA:96:D3"): t.NWK(0xBFB9),
t.EUI64.convert("9A:0E:10:50:00:1B:1A:5F"): t.NWK(0x1AF6),
},
stack_specific={"zstack": {"tclk_seed": "71e31105bb92a2d15747a0d0a042dbfd"}},
metadata={"zstack": {"version": "20220102"}},
)


def test_state_backup_restore_unchanged(network_info, node_info):
obj = app_state.network_state_to_json(
network_info=network_info, node_info=node_info
)
network_info2, node_info2 = app_state.json_to_network_state(obj)

assert node_info == node_info2
assert network_info == network_info2