From e553986bd1b37a9e2c734b850a8316690ed75875 Mon Sep 17 00:00:00 2001 From: Romulo Quidute Filho Date: Mon, 27 Jul 2026 11:30:23 -0300 Subject: [PATCH] Add nfc-ethernet DUT pairing mode for python_testing suites Add NFC_ETHERNET to DutPairingModeEnum and NFC_PAIRING_MODES so python_testing (SDK) tests can commission Matter-over-Ethernet devices via NFC, mirroring the connectedhomeip Python controller support already merged upstream (project-chip/connectedhomeip#43657). generate_command_arguments() requires no code change: since nfc-ethernet is not part of the wifi or thread pairing-mode tuples, it falls straight through to the existing NFC handling that suppresses --discriminator/--passcode and injects NFC_Reader_index. YAML/chip-tool test support is intentionally out of scope here, since chip-tool itself does not support nfc-ethernet yet (project-chip/connectedhomeip#43613 is still open upstream). Adds test coverage mirroring the existing nfc-wifi/nfc-thread tests in test_utils.py and test_test_environment_config.py. Related: project-chip/certification-tool#1067 --- app/constants/shared_constants.py | 2 + .../matter/test_test_environment_config.py | 6 +-- .../support/tests/python_tests/test_utils.py | 38 +++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/app/constants/shared_constants.py b/app/constants/shared_constants.py index 6e34e02e..ae39dc12 100644 --- a/app/constants/shared_constants.py +++ b/app/constants/shared_constants.py @@ -61,6 +61,7 @@ class DutPairingModeEnum(str, Enum): ON_NETWORK = "onnetwork" BLE_WIFI = "ble-wifi" NFC_WIFI = "nfc-wifi" + NFC_ETHERNET = "nfc-ethernet" BLE_THREAD = "ble-thread" WIFIPAF_WIFI = "wifipaf-wifi" NFC_THREAD = "nfc-thread" @@ -69,5 +70,6 @@ class DutPairingModeEnum(str, Enum): NFC_PAIRING_MODES = { DutPairingModeEnum.NFC_WIFI.value, + DutPairingModeEnum.NFC_ETHERNET.value, DutPairingModeEnum.NFC_THREAD.value, } diff --git a/test_collections/matter/sdk_tests/support/tests/matter/test_test_environment_config.py b/test_collections/matter/sdk_tests/support/tests/matter/test_test_environment_config.py index 52371237..e1dd1ce2 100644 --- a/test_collections/matter/sdk_tests/support/tests/matter/test_test_environment_config.py +++ b/test_collections/matter/sdk_tests/support/tests/matter/test_test_environment_config.py @@ -330,7 +330,7 @@ def test_create_config_matter_with_non_thread_modes_no_ba_params_succeeds( assert config_matter.dut_config.pairing_mode == pairing_mode -@pytest.mark.parametrize("pairing_mode", ["nfc-thread", "nfc-wifi"]) +@pytest.mark.parametrize("pairing_mode", ["nfc-thread", "nfc-wifi", "nfc-ethernet"]) def test_create_config_matter_nfc_without_discriminator_and_setup_code_succeeds( pairing_mode: str, ) -> None: @@ -369,7 +369,7 @@ def test_create_config_matter_nfc_without_discriminator_and_setup_code_succeeds( assert config_matter.dut_config.setup_code is None -@pytest.mark.parametrize("pairing_mode", ["nfc-thread", "nfc-wifi"]) +@pytest.mark.parametrize("pairing_mode", ["nfc-thread", "nfc-wifi", "nfc-ethernet"]) def test_create_config_matter_nfc_with_discriminator_succeeds( pairing_mode: str, ) -> None: @@ -405,7 +405,7 @@ def test_create_config_matter_nfc_with_discriminator_succeeds( assert config_matter.dut_config.discriminator == "3840" -@pytest.mark.parametrize("pairing_mode", ["nfc-thread", "nfc-wifi"]) +@pytest.mark.parametrize("pairing_mode", ["nfc-thread", "nfc-wifi", "nfc-ethernet"]) def test_create_config_matter_nfc_with_setup_code_succeeds( pairing_mode: str, ) -> None: diff --git a/test_collections/matter/sdk_tests/support/tests/python_tests/test_utils.py b/test_collections/matter/sdk_tests/support/tests/python_tests/test_utils.py index b3498afc..0fcf2217 100644 --- a/test_collections/matter/sdk_tests/support/tests/python_tests/test_utils.py +++ b/test_collections/matter/sdk_tests/support/tests/python_tests/test_utils.py @@ -187,6 +187,43 @@ async def test_generate_command_arguments_nfc_wifi_pairing_mode() -> None: ] == arguments +@pytest.mark.asyncio +async def test_generate_command_arguments_nfc_ethernet_pairing_mode() -> None: + # Mock config + mock_config = default_environment_config.copy(deep=True) # type: ignore + + mock_config.test_parameters = { + "paa-trust-store-path": "/paa-root-certs", + "storage_path": "/root/admin_storage.json", + } + + mock_dut_config = DutConfig( + pairing_mode=DutPairingModeEnum.NFC_ETHERNET, + chip_timeout=None, + ) + + mock_config.dut_config = mock_dut_config + + arguments = await generate_command_arguments( + config=mock_config, omit_commissioning_method=False + ) + + # NFC-Ethernet needs neither --wifi-* nor --thread-dataset-hex arguments, + # since Ethernet devices don't require network credentials to commission. + assert [ + "--trace-to json:log", + f"--commissioning-method {DutPairingModeEnum.NFC_ETHERNET.value}", + "--paa-trust-store-path /paa-root-certs", + "--storage_path /root/admin_storage.json", + "--int-arg", + "NFC_Reader_index:0", + ] == arguments + assert "--discriminator" not in " ".join(arguments) + assert "--passcode" not in " ".join(arguments) + assert "--wifi-ssid" not in " ".join(arguments) + assert "--thread-dataset-hex" not in " ".join(arguments) + + @pytest.mark.asyncio async def test_generate_command_arguments_ble_thread() -> None: # Mock config @@ -382,6 +419,7 @@ async def test_generate_command_arguments_nfc_thread_for_external_network() -> N NFC_PAIRING_MODES_PARAMS = [ pytest.param(DutPairingModeEnum.NFC_THREAD, id="nfc-thread"), pytest.param(DutPairingModeEnum.NFC_WIFI, id="nfc-wifi"), + pytest.param(DutPairingModeEnum.NFC_ETHERNET, id="nfc-ethernet"), ] MOCK_THREAD_DATASET = (