-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: Implement TC acknowledgement test cases (#37015)
* test: Implement TC acknowledgement test cases 2.5-2.8 Implements test cases for Terms & Conditions acknowledgement verification: - TC-*-2.5: SetTCAcknowledgements verification - TC-*-2.6: CommissioningComplete with no terms accepted - TC-*-2.7: CommissioningComplete with invalid terms - TC-*-2.8: TCAcknowledgements reset after Factory Reset Remaining test cases to be implemented in follow-up changes: - TC-*-2.9: Reset after fabric removal - TC-*-2.10: Required terms validation - TC-*-2.11: Post-commission updates Testing: Test cases implemented according to test plan specifications. Each test verifies specific TC acknowledgement behaviors. * test: Implement remaining TC acknowledgement test cases 2.9-2.11 Implements remaining test cases for Terms & Conditions acknowledgement verification: - TC-*-2.9: TCAcknowledgements reset after fabric removal - TC-*-2.10: Required terms validation - TC-*-2.11: Post-commission TC updates This completes the test coverage for TC acknowledgement verification, following up on the previous implementation of test cases 2.5-2.8. The new test cases verify: - TC state after fabric removal - Protection of required terms - Ability to update TC version and acknowledgements post-commissioning Testing: Test cases implemented according to test plan specifications. Each test verifies specific TC acknowledgement behaviors. * wip * feat(testing): Add PICS guard for Terms & Conditions test steps - Wrap test steps in PICS guard checks for "CGEN.S" and "CGEN.S.F00(TC)" - Ensure test steps only execute when Terms & Conditions feature flag is enabled - Maintain test logic while adding conditional execution based on PICS support * Added PICS and PIXIT definitions to src/app/tests/suites/certification/PICS.yaml * refactor: Extract commission_devices functionality into reusable methods Move commissioning logic from CommissionDeviceTest class into standalone functions to improve code reusability. Introduce CommissioningInfo dataclass to encapsulate commissioning parameters and add commission_device/ commission_devices helper functions. The changes: - Move SetupPayloadInfo dataclass to module level - Add new CommissioningInfo dataclass for commissioning parameters - Extract commission_device and commission_devices as standalone async functions - Add commission_devices method to MatterBaseTest class - Maintain backward compatibility with existing usage in CommissionDeviceTest * Addressed PR comments * Improve test assertions and manual testing steps - Use Matter-specific type assertions in TC_CGEN_2_5 - Update TC_CGEN_2_8 manual testing flow and prompts * restyle * refactor: simplify CGEN feature identifier from CGEN.S.F00(TC) to CGEN.S.F00 - Update PICS.yaml and ci-pics-values to use simplified feature ID - Update Python test files to use new feature identifier - Improve error messaging when commissioning feature check fails - Affected test files: TC_CGEN_2_5 through TC_CGEN_2_11 * Update TC_CGEN_2_5 to use Nullable type for TCUpdateDeadline validation * Add type validation for TCAcceptedVersion and TCAcknowledgements
- Loading branch information
1 parent
cd58e5e
commit 8b302e6
Showing
14 changed files
with
1,303 additions
and
87 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
# | ||
# Copyright (c) 2025 Project CHIP Authors | ||
# All rights reserved. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
# | ||
|
||
# === BEGIN CI TEST ARGUMENTS === | ||
# test-runner-runs: | ||
# run1: | ||
# app: ${TERMS_AND_CONDITIONS_APP} | ||
# app-args: > | ||
# --tc-min-required-version 1 | ||
# --tc-required-acknowledgements 1 | ||
# --custom-flow 2 | ||
# --capabilities 6 | ||
# script-args: | ||
# --PICS src/app/tests/suites/certification/ci-pics-values | ||
# --in-test-commissioning-method on-network | ||
# --tc-version-to-simulate 1 | ||
# --tc-user-response-to-simulate 1 | ||
# --qr-code MT:-24J0AFN00KA0648G00 | ||
# --trace-to json:log | ||
# factoryreset: True | ||
# quiet: True | ||
# === END CI TEST ARGUMENTS === | ||
|
||
import chip.clusters as Clusters | ||
from chip import ChipDeviceCtrl | ||
from chip.commissioning import ROOT_ENDPOINT_ID | ||
from chip.testing.matter_testing import MatterBaseTest, TestStep, async_test_body, default_matter_test_main | ||
from mobly import asserts | ||
|
||
|
||
class TC_CGEN_2_10(MatterBaseTest): | ||
def desc_TC_CGEN_2_10(self) -> str: | ||
return "[TC-CGEN-2.10] Verification that required terms can't be unset from TCAcknowledgements with SetTCAcknowledgements [DUT as Server]" | ||
|
||
def pics_TC_CGEN_2_10(self) -> list[str]: | ||
""" This function returns a list of PICS for this test case that must be True for the test to be run""" | ||
return ["CGEN.S", "CGEN.S.F00"] | ||
|
||
def steps_TC_CGEN_2_10(self) -> list[TestStep]: | ||
return [ | ||
TestStep(0, description="", expectation="", is_commissioning=False), | ||
TestStep(1, "TH reads from the DUT the attribute TCAcceptedVersion. Store the value as acceptedVersion."), | ||
TestStep(2, "TH reads from the DUT the attribute TCAcknowledgements. Store the value as userAcknowledgements."), | ||
TestStep(3, "TH Sends the SetTCAcknowledgements command to the DUT with the fields set as follows:\n* TCVersion: 0\n* TCUserResponse: 65535"), | ||
TestStep(4, "TH reads from the DUT the attribute TCAcceptedVersion."), | ||
TestStep(5, "TH reads from the DUT the attribute TCAcknowledgements."), | ||
TestStep(6, "TH Sends the SetTCAcknowledgements command to the DUT with the fields set as follows:\n* TCVersion: acceptedVersion + 1\n* TCUserResponse: 0"), | ||
TestStep(7, "TH reads from the DUT the attribute TCAcceptedVersion."), | ||
TestStep(8, "TH reads from the DUT the attribute TCAcknowledgements."), | ||
] | ||
|
||
@async_test_body | ||
async def test_TC_CGEN_2_10(self): | ||
commissioner: ChipDeviceCtrl.ChipDeviceController = self.default_controller | ||
|
||
self.step(0) | ||
if not self.check_pics("CGEN.S.F00"): | ||
asserts.skip('Root endpoint does not support the [commissioning] feature under test') | ||
return | ||
|
||
# Step 1: Begin commissioning with PASE and failsafe | ||
commissioner.SetSkipCommissioningComplete(True) | ||
self.matter_test_config.commissioning_method = self.matter_test_config.in_test_commissioning_method | ||
self.matter_test_config.tc_version_to_simulate = None | ||
self.matter_test_config.tc_user_response_to_simulate = None | ||
await self.commission_devices() | ||
|
||
# Step 1: Read TCAcceptedVersion | ||
self.step(1) | ||
response = await commissioner.ReadAttribute(nodeid=self.dut_node_id, attributes=[(ROOT_ENDPOINT_ID, Clusters.GeneralCommissioning.Attributes.TCAcceptedVersion)]) | ||
accepted_version = response[ROOT_ENDPOINT_ID][Clusters.GeneralCommissioning][Clusters.GeneralCommissioning.Attributes.TCAcceptedVersion] | ||
|
||
# Step 2: Read TCAcknowledgements | ||
self.step(2) | ||
response = await commissioner.ReadAttribute(nodeid=self.dut_node_id, attributes=[(ROOT_ENDPOINT_ID, Clusters.GeneralCommissioning.Attributes.TCAcknowledgements)]) | ||
user_acknowledgements = response[ROOT_ENDPOINT_ID][Clusters.GeneralCommissioning][Clusters.GeneralCommissioning.Attributes.TCAcknowledgements] | ||
|
||
# Step 3: Send SetTCAcknowledgements with invalid version | ||
self.step(3) | ||
response = await commissioner.SendCommand( | ||
nodeid=self.dut_node_id, | ||
endpoint=ROOT_ENDPOINT_ID, | ||
payload=Clusters.GeneralCommissioning.Commands.SetTCAcknowledgements(TCVersion=0, TCUserResponse=65535), | ||
) | ||
|
||
# Verify TCMinVersionNotMet error | ||
asserts.assert_equal( | ||
response.errorCode, | ||
Clusters.GeneralCommissioning.Enums.CommissioningErrorEnum.kTCMinVersionNotMet, | ||
"Expected TCMinVersionNotMet error", | ||
) | ||
|
||
# Step 4: Verify TCAcceptedVersion unchanged | ||
self.step(4) | ||
response = await commissioner.ReadAttribute(nodeid=self.dut_node_id, attributes=[(ROOT_ENDPOINT_ID, Clusters.GeneralCommissioning.Attributes.TCAcceptedVersion)]) | ||
current_version = response[ROOT_ENDPOINT_ID][Clusters.GeneralCommissioning][Clusters.GeneralCommissioning.Attributes.TCAcceptedVersion] | ||
asserts.assert_equal(current_version, accepted_version, "TCAcceptedVersion changed unexpectedly") | ||
|
||
# Step 5: Verify TCAcknowledgements unchanged | ||
self.step(5) | ||
response = await commissioner.ReadAttribute(nodeid=self.dut_node_id, attributes=[(ROOT_ENDPOINT_ID, Clusters.GeneralCommissioning.Attributes.TCAcknowledgements)]) | ||
current_acknowledgements = response[ROOT_ENDPOINT_ID][Clusters.GeneralCommissioning][Clusters.GeneralCommissioning.Attributes.TCAcknowledgements] | ||
asserts.assert_equal(current_acknowledgements, user_acknowledgements, "TCAcknowledgements changed unexpectedly") | ||
|
||
# Step 6: Send SetTCAcknowledgements with invalid response | ||
self.step(6) | ||
response = await commissioner.SendCommand( | ||
nodeid=self.dut_node_id, | ||
endpoint=ROOT_ENDPOINT_ID, | ||
payload=Clusters.GeneralCommissioning.Commands.SetTCAcknowledgements( | ||
TCVersion=accepted_version + 1, TCUserResponse=0 | ||
), | ||
) | ||
|
||
# Verify RequiredTCNotAccepted error | ||
asserts.assert_equal( | ||
response.errorCode, | ||
Clusters.GeneralCommissioning.Enums.CommissioningErrorEnum.kRequiredTCNotAccepted, | ||
"Expected RequiredTCNotAccepted error", | ||
) | ||
|
||
# Step 7: Verify TCAcceptedVersion still unchanged | ||
self.step(7) | ||
response = await commissioner.ReadAttribute(nodeid=self.dut_node_id, attributes=[(ROOT_ENDPOINT_ID, Clusters.GeneralCommissioning.Attributes.TCAcceptedVersion)]) | ||
current_version = response[ROOT_ENDPOINT_ID][Clusters.GeneralCommissioning][Clusters.GeneralCommissioning.Attributes.TCAcceptedVersion] | ||
asserts.assert_equal(current_version, accepted_version, "TCAcceptedVersion changed unexpectedly after second attempt") | ||
|
||
# Step 8: Verify TCAcknowledgements still unchanged | ||
self.step(8) | ||
response = await commissioner.ReadAttribute(nodeid=self.dut_node_id, attributes=[(ROOT_ENDPOINT_ID, Clusters.GeneralCommissioning.Attributes.TCAcknowledgements)]) | ||
current_acknowledgements = response[ROOT_ENDPOINT_ID][Clusters.GeneralCommissioning][Clusters.GeneralCommissioning.Attributes.TCAcknowledgements] | ||
asserts.assert_equal( | ||
current_acknowledgements, | ||
user_acknowledgements, | ||
"TCAcknowledgements changed unexpectedly after second attempt", | ||
) | ||
|
||
|
||
if __name__ == "__main__": | ||
default_matter_test_main() |
Oops, something went wrong.