Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
async def test_request_optional(cluster):
schema = [t.uint8_t, t.uint16_t, t.Optional(t.uint16_t), t.Optional(t.uint8_t)]
res = cluster.request(True, 0, schema)
assert isinstance(res.exception(), ValueError)
assert cluster._endpoint.request.call_count == 0
cluster._endpoint.request.reset_mock()
res = cluster.request(True, 0, schema, 1)
assert isinstance(res.exception(), ValueError)
assert cluster._endpoint.request.call_count == 0
cluster._endpoint.request.reset_mock()
cluster.request(True, 0, schema, 1, 2)
assert cluster._endpoint.request.call_count == 1
cluster._endpoint.request.reset_mock()
cluster.request(True, 0, schema, 1, 2, 3)
def test_optional_struct_special_case():
class TestStruct(t.Struct):
foo: t.uint8_t
OptionalTestStruct = t.Optional(TestStruct)
assert OptionalTestStruct.deserialize(b"") == (None, b"")
assert OptionalTestStruct.deserialize(b"\x00") == (
OptionalTestStruct(foo=0x00),
b"",
)
t.Optional(t.int16s),
t.Optional(t.uint16_t),
t.Optional(t.uint16_t),
t.Optional(t.uint8_t),
t.Optional(t.uint16_t),
),
True,
),
0x0001: (
"location_data_response",
(
foundation.Status,
t.Optional(t.uint8_t),
t.Optional(t.int16s),
t.Optional(t.int16s),
t.Optional(t.int16s),
t.Optional(t.uint16_t),
t.Optional(t.uint8_t),
t.Optional(t.uint8_t),
t.Optional(t.uint16_t),
),
True,
),
0x0002: ("location_data_notification", (), False),
0x0003: ("compact_location_data_notification", (), False),
0x0004: ("rssi_ping", (t.uint8_t,), False), # data8
0x0005: ("rssi_req", (), False),
0x0006: ("report_rssi_measurements", (t.EUI64, t.LVList(NeighborInfo)), False),
0x0007: ("request_own_location", (t.EUI64,), False),
}
(
t.uint32_t,
t.uint8_t,
t.bitmap8,
t.bitmap8,
t.bitmap16,
t.uint32_t,
t.EUI64,
t.uint8_t,
t.uint8_t,
t.NWK,
t.NWK,
t.uint8_t,
t.uint8_t,
t.Optional(t.uint8_t),
t.Optional(t.uint16_t),
t.Optional(t.uint16_t),
t.Optional(t.uint8_t),
t.Optional(t.uint8_t),
),
True,
),
0x0003: (
"device_information_rsp",
(t.uint32_t, t.uint8_t, t.uint8_t, t.LVList(DeviceInfoRecord)),
True,
),
0x0011: (
"network_start_rsp",
(t.uint32_t, foundation.Status, t.EUI64, t.uint8_t, t.uint8_t, t.uint16_t),
True,
),
ZDOCmd.Extended_Active_EP_rsp: (
STATUS,
NWKI,
("ActiveEPCount", t.uint8_t),
("StartIndex", t.uint8_t),
("ActiveEPList", t.List(t.uint8_t)),
),
ZDOCmd.Parent_annce_rsp: (STATUS, ("Children", t.LVList(t.EUI64))),
# Bind Management Server Services Responses
ZDOCmd.End_Device_Bind_rsp: (STATUS,),
ZDOCmd.Bind_rsp: (STATUS,),
ZDOCmd.Unbind_rsp: (STATUS,),
# ... TODO optional stuff ...
# Network Management Server Services Responses
ZDOCmd.Mgmt_Lqi_rsp: (STATUS, ("Neighbors", t.Optional(Neighbors))),
ZDOCmd.Mgmt_Rtg_rsp: (STATUS, ("Routes", t.Optional(Routes))),
# ... TODO optional stuff ...
ZDOCmd.Mgmt_Leave_rsp: (STATUS,),
ZDOCmd.Mgmt_Permit_Joining_rsp: (STATUS,),
ZDOCmd.Mgmt_NWK_Update_rsp: (
STATUS,
("ScannedChannels", t.Channels),
("TotalTransmissions", t.uint16_t),
("TransmissionFailures", t.uint16_t),
("EnergyValues", t.LVList(t.uint8_t)),
)
# ... TODO optional stuff ...
}
# Rewrite to (name, param_names, param_types)
for command_id, schema in CLUSTERS.items():
t.Optional(t.uint16_t),
t.Optional(t.uint8_t),
t.Optional(t.uint16_t),
),
True,
),
0x0001: (
"location_data_response",
(
foundation.Status,
t.Optional(t.uint8_t),
t.Optional(t.int16s),
t.Optional(t.int16s),
t.Optional(t.int16s),
t.Optional(t.uint16_t),
t.Optional(t.uint8_t),
t.Optional(t.uint8_t),
t.Optional(t.uint16_t),
),
True,
),
0x0002: ("location_data_notification", (), False),
0x0003: ("compact_location_data_notification", (), False),
0x0004: ("rssi_ping", (t.uint8_t,), False), # data8
0x0005: ("rssi_req", (), False),
0x0006: ("report_rssi_measurements", (t.EUI64, t.LVList(NeighborInfo)), False),
0x0007: ("request_own_location", (t.EUI64,), False),
}
class AnalogInput(Cluster):
cluster_id = 0x000C
NWKI,
("SimpleDescriptor", t.Optional(SizePrefixedSimpleDescriptor)),
),
ZDOCmd.Active_EP_rsp: (STATUS, NWKI, ("ActiveEPList", t.LVList(t.uint8_t))),
ZDOCmd.Match_Desc_rsp: (STATUS, NWKI, ("MatchList", t.LVList(t.uint8_t))),
# ZDO.Complex_Desc_rsp: (
# STATUS,
# NWKI,
# ('Length', t.uint8_t),
# ('ComplexDescriptor', t.Optional(ComplexDescriptor)),
# ),
ZDOCmd.User_Desc_rsp: (
STATUS,
NWKI,
("Length", t.uint8_t),
("UserDescriptor", t.Optional(t.fixed_list(16, t.uint8_t))),
),
ZDOCmd.Discovery_Cache_rsp: (STATUS,),
ZDOCmd.User_Desc_conf: (STATUS, NWKI),
ZDOCmd.System_Server_Discovery_rsp: (STATUS, ("ServerMask", t.uint16_t)),
ZDOCmd.Discovery_Store_rsp: (STATUS,),
ZDOCmd.Node_Desc_store_rsp: (STATUS,),
ZDOCmd.Power_Desc_store_rsp: (STATUS, IEEE, ("PowerDescriptor", PowerDescriptor)),
ZDOCmd.Active_EP_store_rsp: (STATUS,),
ZDOCmd.Simple_Desc_store_rsp: (STATUS,),
ZDOCmd.Remove_node_cache_rsp: (STATUS,),
ZDOCmd.Find_node_cache_rsp: (("CacheNWKAddr", t.EUI64), NWK, IEEE),
ZDOCmd.Extended_Simple_Desc_rsp: (
STATUS,
NWK,
("Endpoint", t.uint8_t),
("AppInputClusterCount", t.uint8_t),
# Responses
# Device and Service Discovery Server Responses
ZDOCmd.NWK_addr_rsp: (
STATUS,
IEEE,
NWK,
("NumAssocDev", t.Optional(t.uint8_t)),
("StartIndex", t.Optional(t.uint8_t)),
("NWKAddressAssocDevList", t.Optional(t.List(t.NWK))),
),
ZDOCmd.IEEE_addr_rsp: (
STATUS,
IEEE,
NWK,
("NumAssocDev", t.Optional(t.uint8_t)),
("StartIndex", t.Optional(t.uint8_t)),
("NWKAddrAssocDevList", t.Optional(t.List(t.NWK))),
),
ZDOCmd.Node_Desc_rsp: (
STATUS,
NWKI,
("NodeDescriptor", t.Optional(NodeDescriptor)),
),
ZDOCmd.Power_Desc_rsp: (
STATUS,
NWKI,
("PowerDescriptor", t.Optional(PowerDescriptor)),
),
ZDOCmd.Simple_Desc_rsp: (
STATUS,
NWKI,
("SimpleDescriptor", t.Optional(SizePrefixedSimpleDescriptor)),