Skip to content

Commit acd2aa5

Browse files
authored
Disable XNCP MEMBER_OF_ALL_GROUPS on current firmwares (#658)
* Disable XNCP group feature for now * Add a unit test
1 parent a81bbd4 commit acd2aa5

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

bellows/ezsp/__init__.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,21 @@ async def version(self):
179179
ver,
180180
)
181181

182-
async def get_xncp_features(self) -> None:
182+
async def get_xncp_features(self) -> xncp.FirmwareFeatures:
183183
try:
184184
self._xncp_features = await self.xncp_get_supported_firmware_features()
185185
except InvalidCommandError:
186186
self._xncp_features = xncp.FirmwareFeatures.NONE
187187

188+
# Disable the XNCP feature flag, it doesn't seem to work correctly
189+
if FirmwareFeatures.MEMBER_OF_ALL_GROUPS in self._xncp_features:
190+
_, _, version = await self.get_board_info()
191+
192+
if version == "7.4.4.0 build 0":
193+
self._xncp_features &= ~FirmwareFeatures.MEMBER_OF_ALL_GROUPS
194+
188195
LOGGER.debug("XNCP features: %s", self._xncp_features)
196+
return self._xncp_features
189197

190198
async def disconnect(self):
191199
self.stop_ezsp()

tests/test_xncp.py

+44-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from unittest.mock import AsyncMock, call
3+
from unittest.mock import AsyncMock, call, patch
44

55
import pytest
66

@@ -181,3 +181,46 @@ async def test_xncp_get_flow_control_type(ezsp_f: EZSP) -> None:
181181
assert customFrame.mock_calls == [
182182
call(xncp.XncpCommand.from_payload(xncp.GetFlowControlTypeReq()).serialize())
183183
]
184+
185+
186+
async def test_xncp_get_xncp_features_fixes(ezsp_f: EZSP) -> None:
187+
"""Test XNCP `get_xncp_features`, with fixes."""
188+
ezsp_f._mock_commands["customFrame"] = customFrame = AsyncMock(
189+
return_value=[
190+
t.EmberStatus.SUCCESS,
191+
xncp.XncpCommand.from_payload(
192+
xncp.GetSupportedFeaturesRsp(
193+
features=(
194+
xncp.FirmwareFeatures.MANUAL_SOURCE_ROUTE
195+
| xncp.FirmwareFeatures.MEMBER_OF_ALL_GROUPS
196+
)
197+
)
198+
).serialize(),
199+
]
200+
)
201+
202+
# In 7.4.4.0, it's broken
203+
with patch.object(
204+
ezsp_f,
205+
"get_board_info",
206+
return_value=("Model", "Manufacturer", "7.4.4.0 build 0"),
207+
):
208+
assert (
209+
await ezsp_f.get_xncp_features()
210+
) == xncp.FirmwareFeatures.MANUAL_SOURCE_ROUTE
211+
212+
# In a hypothetical new release, it's not
213+
with patch.object(
214+
ezsp_f,
215+
"get_board_info",
216+
return_value=("Model", "Manufacturer", "7.4.4.0 build 1"),
217+
):
218+
assert (await ezsp_f.get_xncp_features()) == (
219+
xncp.FirmwareFeatures.MANUAL_SOURCE_ROUTE
220+
| xncp.FirmwareFeatures.MEMBER_OF_ALL_GROUPS
221+
)
222+
223+
assert customFrame.mock_calls == [
224+
call(xncp.XncpCommand.from_payload(xncp.GetSupportedFeaturesReq()).serialize()),
225+
call(xncp.XncpCommand.from_payload(xncp.GetSupportedFeaturesReq()).serialize()),
226+
]

0 commit comments

Comments
 (0)