diff --git a/bellows/ezsp/__init__.py b/bellows/ezsp/__init__.py index 72f3944f..06516ba8 100644 --- a/bellows/ezsp/__init__.py +++ b/bellows/ezsp/__init__.py @@ -267,19 +267,25 @@ async def get_board_info(self) -> Tuple[str, str, str]: """Return board info.""" tokens = [] + for token in (t.EzspMfgTokenId.MFG_STRING, t.EzspMfgTokenId.MFG_BOARD_NAME): - LOGGER.debug("getting " "%s" " token", token.name) - (result,) = await self.getMfgToken(token) + (value,) = await self.getMfgToken(token) + LOGGER.debug("Read %s token: %s", token.name, value) + + # Tokens are fixed-length and initially filled with \xFF + result = value.rstrip(b"\xFF").split(b"\x00", 1)[0] + try: - result = result.split(b"\xFF")[0] - result = result.decode() + result = result.decode("utf-8") except UnicodeDecodeError: - pass + result = "0x" + result.hex().upper() + tokens.append(result) (status, ver_info_bytes) = await self.getValue( self.types.EzspValueId.VALUE_VERSION_INFO ) + if status == t.EmberStatus.SUCCESS: build, ver_info_bytes = t.uint16_t.deserialize(ver_info_bytes) major, ver_info_bytes = t.uint8_t.deserialize(ver_info_bytes) diff --git a/tests/test_ezsp.py b/tests/test_ezsp.py index 812391f8..1bd25ce5 100644 --- a/tests/test_ezsp.py +++ b/tests/test_ezsp.py @@ -336,31 +336,84 @@ async def test_ezsp_newer_version(ezsp_f): async def test_board_info(ezsp_f): """Test getting board info.""" - status = 0x00 + def cmd_mock(config): + async def replacement(*args): + return tuple(config[args]) - async def cmd_mock(cmd_name, *args): - assert cmd_name in ("getMfgToken", "getValue") - if cmd_name == "getMfgToken": - if args[0] == t.EzspMfgTokenId.MFG_BOARD_NAME: - return (b"\xfe\xff\xff\xff",) - return (b"Manufacturer\xff\xff\xff",) + return replacement - if cmd_name == "getValue": - return (status, b"\x01\x02\x03\x04\x05\x06") - - with patch.object(ezsp_f, "_command", new=cmd_mock): + with patch.object( + ezsp_f, + "_command", + new=cmd_mock( + { + ("getMfgToken", t.EzspMfgTokenId.MFG_BOARD_NAME): ( + b"\xfe\xff\xff\xff", + ), + ("getMfgToken", t.EzspMfgTokenId.MFG_STRING): ( + b"Manufacturer\xff\xff\xff", + ), + ("getValue", ezsp_f.types.EzspValueId.VALUE_VERSION_INFO): ( + 0x00, + b"\x01\x02\x03\x04\x05\x06", + ), + } + ), + ): mfg, brd, ver = await ezsp_f.get_board_info() + assert mfg == "Manufacturer" - assert brd == b"\xfe" + assert brd == "0xFE" assert ver == "3.4.5.6 build 513" - with patch.object(ezsp_f, "_command", new=cmd_mock): - status = 0x01 + with patch.object( + ezsp_f, + "_command", + new=cmd_mock( + { + ("getMfgToken", t.EzspMfgTokenId.MFG_BOARD_NAME): ( + b"\xfe\xff\xff\xff", + ), + ("getMfgToken", t.EzspMfgTokenId.MFG_STRING): ( + b"Manufacturer\xff\xff\xff", + ), + ("getValue", ezsp_f.types.EzspValueId.VALUE_VERSION_INFO): ( + 0x01, + b"\x01\x02\x03\x04\x05\x06", + ), + } + ), + ): mfg, brd, ver = await ezsp_f.get_board_info() + assert mfg == "Manufacturer" - assert brd == b"\xfe" + assert brd == "0xFE" assert ver == "unknown stack version" + with patch.object( + ezsp_f, + "_command", + new=cmd_mock( + { + ("getMfgToken", t.EzspMfgTokenId.MFG_BOARD_NAME): ( + b"SkyBlue v0.1\x00\xff\xff\xff", + ), + ("getMfgToken", t.EzspMfgTokenId.MFG_STRING): ( + b"Nabu Casa\x00\xff\xff\xff\xff\xff\xff", + ), + ("getValue", ezsp_f.types.EzspValueId.VALUE_VERSION_INFO): ( + 0x00, + b"\xbf\x00\x07\x01\x00\x00\xaa", + ), + } + ), + ): + mfg, brd, ver = await ezsp_f.get_board_info() + + assert mfg == "Nabu Casa" + assert brd == "SkyBlue v0.1" + assert ver == "7.1.0.0 build 191" + async def test_set_source_route(ezsp_f): """Test setting a src route for device."""