12
12
from bellows .ash import NcpFailure
13
13
from bellows .exception import EzspError , InvalidCommandError
14
14
from bellows .ezsp import EZSP , EZSP_LATEST
15
+ from bellows .ezsp .xncp import FirmwareFeatures
15
16
import bellows .types as t
16
17
17
18
if sys .version_info [:2 ] < (3 , 11 ):
@@ -323,46 +324,60 @@ async def test_ezsp_newer_version(ezsp_f):
323
324
(
324
325
"mfg_board_name" ,
325
326
"mfg_string" ,
327
+ "xncp_build_string" ,
326
328
"value_version_info" ,
327
329
"expected" ,
328
330
),
329
331
[
330
332
(
331
333
(b"\xfe \xff \xff \xff " ,),
332
334
(b"Manufacturer\xff \xff \xff " ,),
335
+ (InvalidCommandError ("XNCP is not supported" ),),
333
336
(t .EmberStatus .SUCCESS , b"\x01 \x02 \x03 \x04 \x05 \x06 " ),
334
337
("Manufacturer" , "0xFE" , "3.4.5.6 build 513" ),
335
338
),
336
339
(
337
340
(b"\xfe \xff \xff \xff " ,),
338
341
(b"Manufacturer\xff \xff \xff " ,),
342
+ (InvalidCommandError ("XNCP is not supported" ),),
339
343
(t .EmberStatus .ERR_FATAL , b"\x01 \x02 \x03 \x04 \x05 \x06 " ),
340
344
("Manufacturer" , "0xFE" , None ),
341
345
),
342
346
(
343
347
(b"SkyBlue v0.1\x00 \xff \xff \xff " ,),
344
348
(b"Nabu Casa\x00 \xff \xff \xff \xff \xff \xff " ,),
349
+ (InvalidCommandError ("XNCP is not supported" ),),
345
350
(t .EmberStatus .SUCCESS , b"\xbf \x00 \x07 \x01 \x00 \x00 \xaa " ),
346
351
("Nabu Casa" , "SkyBlue v0.1" , "7.1.0.0 build 191" ),
347
352
),
348
353
(
349
354
(b"\xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff " ,),
350
355
(b"\xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff " ,),
356
+ (InvalidCommandError ("XNCP is not supported" ),),
351
357
(t .EmberStatus .SUCCESS , b"\xbf \x00 \x07 \x01 \x00 \x00 \xaa " ),
352
358
(None , None , "7.1.0.0 build 191" ),
353
359
),
354
360
(
355
361
(b"\xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff " ,),
356
362
(b"\xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \xff \x00 \x00 " ,),
363
+ (InvalidCommandError ("XNCP is not supported" ),),
357
364
(t .EmberStatus .SUCCESS , b")\x01 \x06 \n \x03 \x00 \xaa " ),
358
365
(None , None , "6.10.3.0 build 297" ),
359
366
),
367
+ (
368
+ (b"SkyBlue v0.1\x00 \xff \xff \xff " ,),
369
+ (b"Nabu Casa\x00 \xff \xff \xff \xff \xff \xff " ,),
370
+ ("special build" ,),
371
+ (t .EmberStatus .SUCCESS , b"\xbf \x00 \x07 \x01 \x00 \x00 \xaa " ),
372
+ ("Nabu Casa" , "SkyBlue v0.1" , "7.1.0.0 build 191 (special build)" ),
373
+ ),
360
374
],
361
375
)
362
376
async def test_board_info (
363
377
ezsp_f ,
364
378
mfg_board_name : bytes ,
365
379
mfg_string : bytes ,
380
+ xncp_build_string : str | Exception ,
366
381
value_version_info : tuple [t .EmberStatus , bytes ],
367
382
expected : tuple [str | None , str | None , str ],
368
383
):
@@ -384,7 +399,7 @@ async def replacement(command_name, tokenId=None, valueId=None):
384
399
("getValue" , t .EzspValueId .VALUE_VERSION_INFO ): value_version_info ,
385
400
}
386
401
),
387
- ):
402
+ ), patch . object ( ezsp_f , "xncp_get_build_string" , side_effect = xncp_build_string ) :
388
403
mfg , brd , ver = await ezsp_f .get_board_info ()
389
404
390
405
assert (mfg , brd , ver ) == expected
@@ -432,6 +447,28 @@ async def _mock_cmd(*args, **kwargs):
432
447
await ezsp_f .leaveNetwork (timeout = 0.01 )
433
448
434
449
450
+ async def test_xncp_token_override (ezsp_f ):
451
+ ezsp_f .getMfgToken = AsyncMock (return_value = [b"firmware value" ])
452
+ ezsp_f .xncp_get_mfg_token_override = AsyncMock (return_value = b"xncp value" )
453
+
454
+ # Without firmware support, the XNCP command isn't sent
455
+ assert (
456
+ await ezsp_f .get_mfg_token (t .EzspMfgTokenId .MFG_CUSTOM_EUI_64 )
457
+ ) == b"firmware value"
458
+
459
+ # With firmware support, it is
460
+ ezsp_f ._xncp_features |= FirmwareFeatures .MFG_TOKEN_OVERRIDES
461
+ assert (
462
+ await ezsp_f .get_mfg_token (t .EzspMfgTokenId .MFG_CUSTOM_EUI_64 )
463
+ ) == b"xncp value"
464
+
465
+ # Tokens without overrides are still read normally
466
+ ezsp_f .xncp_get_mfg_token_override .side_effect = InvalidCommandError
467
+ assert (
468
+ await ezsp_f .get_mfg_token (t .EzspMfgTokenId .MFG_CUSTOM_EUI_64 )
469
+ ) == b"firmware value"
470
+
471
+
435
472
@pytest .mark .parametrize (
436
473
"value, expected_result" ,
437
474
[
0 commit comments