diff --git a/src/python_testing/TC_DRLK_2_9.py b/src/python_testing/TC_DRLK_2_9.py new file mode 100644 index 00000000000000..472c4822c35473 --- /dev/null +++ b/src/python_testing/TC_DRLK_2_9.py @@ -0,0 +1,566 @@ +# +# Copyright (c) 2024 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. + +# See https://github.com/project-chip/connectedhomeip/blob/master/docs/testing/python.md#defining-the-ci-test-arguments +# for details about the block below. +# +# === BEGIN CI TEST ARGUMENTS === +# test-runner-runs: run1 +# test-runner-run/run1/app: ${CHIP_LOCK_APP} +# test-runner-run/run1/factoryreset: True +# test-runner-run/run1/quiet: True +# test-runner-run/run1/app-args: --discriminator 1234 --KVS kvs1 --trace-to json:${TRACE_APP}.json +# test-runner-run/run1/script-args: --storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:${TRACE_TEST_JSON}.json --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto +# === END CI TEST ARGUMENTS === + +import logging + +import chip.clusters as Clusters +from chip.clusters.Types import NullValue +from chip.interaction_model import InteractionModelError, Status +from drlk_2_x_common import DRLK_COMMON +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main, type_matches +from mobly import asserts + +logger = logging.getLogger(__name__) + +drlkcluster = Clusters.DoorLock + + +class TC_DRLK_2_9(MatterBaseTest, DRLK_COMMON): + + def steps_TC_DRLK_2_9(self) -> list[TestStep]: + steps = [ + + TestStep("1", "TH reads NumberOfTotalUsersSupported attribute.", + "Verify that TH is able to read the attribute successfully."), + TestStep("2a", "TH sends SetUser Command to DUT.", "Verify that TH is able to read the attribute successfully."), + TestStep("2b", " TH reads MinPINCodeLength attribute .", + "Verify that TH is able to read the attribute successfully."), + TestStep("2c", "TH reads MaxPINCodeLength attribute.", + "Verify that TH is able to read the attribute successfully."), + TestStep("2d", "TH reads MinRFIDCodeLength attribute.", + "Verify that TH is able to read the attribute successfully."), + TestStep("2e", "TH reads MaxRFIDCodeLength attribute.", + "Verify that TH is able to read the attribute successfully."), + TestStep("2f", "TH sends SetCredential Command to DUT.", + "Verify that the DUT responds with SetCredentialResponse command with Status SUCCESS."), + TestStep("3", "TH sends GetCredentialStatus Command .", + "Verify that the DUT responds with GetCredentialStatusResponse Command ."), + TestStep("4", "TH sends SetCredential Command to DUT.", + "Verify that the DUT responds with SetCredentialResponse command with Status INVALID_COMMAND."), + TestStep("5", "TH sends SetCredential Command to DUT.", + "Verify that the DUT responds with SetCredentialResponse command with Status DUPLICATE."), + TestStep("6a", "TH sends SetCredential Command to DUT.", + "Verify that the DUT responds with SetCredentialResponse command with Status DUPLICATE or OCCUPIED."), + TestStep("6b", "TH sends SetCredential Command to DUT.", + "Verify that the DUT responds with SetCredentialResponse command with Status DUPLICATE or OCCUPIED."), + TestStep("7", "TH sends SetCredential Command to DUT.", + "Verify that the DUT responds with SetCredentialResponse command with Status INVALID_COMMAND."), + TestStep("8", "TH sends ClearCredential Command to DUT.", + "Verify that the DUT sends SUCCESS response."), + TestStep("9a", "TH sends GetCredentialStatus command to DUT ", + "Verify that the DUT responds with GetCredentialStatusResponse Command."), + TestStep("9b", "TH sends ClearUser Command to DUT.", + "Verify that the DUT sends SUCCESS response"), + TestStep("10", "TH sends SetUser Command to DUT.", + "Verify that the DUT sends SUCCESS response."), + TestStep("11", "TH sends SetCredential Command to DUT.", + "Verify that the DUT responds with SetCredentialResponse command with Status SUCCESS."), + TestStep("12a", "TH sends ClearCredential Command to DUT.", + " Verify that the DUT sends SUCCESS response."), + TestStep("13", " TH sends GetCredentialStatus Command.", + "Verify that the DUT responds with GetCredentialStatusResponse Command with credentialExists=FALSE."), + TestStep("14a", "TH sends ClearCredential Command to DUT", + "if {PICS_SF_ALIRO} verify that the DUT sends a SUCCESS response else DUT sends an INVALID_COMMAND response."), + TestStep("14b", "TH sends ClearCredential Command to DUT with Invalid Credential Type.", + "Verify that the DUT sends an INVALID_COMMAND."), + TestStep("14c", "TH sends ClearUser Command to DUT to clear all the users.", + "Verify that the DUT sends SUCCESS response."), + TestStep("15a", "TH reads NumberOfCredentialsSupportedPerUser attribute from DUT.", + "Verify that TH is able to read the attribute successfully."), + TestStep("15b", "TH sends SetUser Command to DUT.", + "Verify that the DUT sends SUCCESS response."), + TestStep("15c", "TH sends SetCredential Command to DUT.", + "Verify that the DUT sends SetCredentialResponse command with Status SUCCESS."), + TestStep("15d", " TH sends SetCredential Command with CredentialIndex as 'max-num-credential-user'.", + "Verify that the DUT sends SetCredentialResponse command with Status RESOURCE_EXHAUSTION."), + TestStep("15e", "TH sends ClearCredential Command to DUT to clear all the credentials of PIN type.", + "Verify that the DUT sends SUCCESS response."), + TestStep("16", " TH sends SetUser Command to DUT.", + "Verify that the DUT sends SUCCESS response"), + TestStep("17", "TH sends SetCredential Command to DUT with CredentialType.RFID.", + "Verify that the DUT sends SetCredentialResponse command with Status SUCCESS."), + TestStep("18", "TH sends SetCredential Command to DUT with CredentialType.PIN.", + "Verify that the DUT sends SetCredentialResponse command with Status SUCCESS."), + TestStep("19", "TH sends GetUser Command to DUT.", + "Verify that the DUT responds with GetUserResponse Command."), + TestStep("20", "TH sends SetCredential Command to DUT to modify the CredentialData.", + "Verify that the DUT sends SetCredentialResponse command with Status SUCCESS."), + TestStep("21", "TH sends GetUser Command to DUT.", + "Verify that the DUT responds with GetUserResponse Command."), + TestStep("22", "TH sends ClearCredential Command to DUT to clear all the credentials.", + "Verify that the DUT sends SUCCESS response."), + TestStep("23", "TH sends ClearUser Command to DUT.", + "Verify that the DUT sends SUCCESS response."), + ] + return steps + + async def read_attributes_from_dut(self, endpoint, cluster, attribute, expected_status: Status = Status.Success): + try: + attribute_value = await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, + attribute=attribute) + asserts.assert_equal(expected_status, Status.Success) + return attribute_value + except Exception as e: + logging.error(e) + asserts.assert_equal(expected_status, Status.Success, + f"Error reading attributes, response={attribute_value}") + + def pics_TC_DRLK_2_9(self) -> list[str]: + return ["DRLK.S"] + + async def generate_code(self): + + validpincodestr = await self.generate_pincode(self.maxpincodelength) + self.pin_code = bytes(validpincodestr, 'ascii') + validpincodestr = await self.generate_pincode(self.maxpincodelength) + self.pin_code1 = bytes(validpincodestr, 'ascii') + validpincodestr = await self.generate_pincode(self.maxpincodelength) + self.pin_code2 = bytes(validpincodestr, 'ascii') + inavlidpincodestr = await self.generate_pincode(self.maxpincodelength+1) + self.inavlid_pincode = bytes(inavlidpincodestr, 'ascii') + validpincodestr = await self.generate_pincode(self.maxrfidcodelength) + self.rfid_tag = bytes(validpincodestr, 'ascii') + + async def send_clear_user_cmd(self, user_index, expected_status: Status = Status.Success): + try: + await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.ClearUser(userIndex=user_index), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + asserts.assert_equal(expected_status, Status.Success) + except InteractionModelError as e: + asserts.assert_equal(e.status, expected_status, f"Unexpected error returned: {e}") + + async def get_user(self, userindex, username, useruniqueid, credentiallist, expected_status: Status = Status.Success): + try: + response = await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.GetUser(userIndex=userindex), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + asserts.assert_true(type_matches(response, Clusters.DoorLock.Commands.GetUserResponse), + "Unexpected return type for GetUserResponse") + asserts.assert_true(response.userIndex == userindex, + "Error when executing GetUserResponse command, credentialExists={}".format( + str(response.userIndex))) + asserts.assert_true(response.userName == username, + "Error when executing GetUserResponse command, credentialExists={}".format( + str(response.userName))) + asserts.assert_true(response.userUniqueID == useruniqueid, + "Error when executing GetUserResponse command, credentialExists={}".format( + str(response.userUniqueID))) + asserts.assert_true(response.credentials == credentiallist, + "Error when executing GetUserResponse command, credentialExists={}".format( + str(response.credentials))) + asserts.assert_equal(expected_status, Status.Success) + + except InteractionModelError as e: + asserts.assert_equal(e.status, expected_status, f"Unexpected error returned: {e}") + + async def get_credentials_status(self, credentialIndex: int, credentialType: drlkcluster.Enums.CredentialTypeEnum, + step, userIndex, credential_exists): + if step: + self.step(step) + try: + credentials_struct = drlkcluster.Structs.CredentialStruct(credentialIndex=credentialIndex, + credentialType=credentialType) + response = await self.send_single_cmd(endpoint=self.app_cluster_endpoint, timedRequestTimeoutMs=1000, + cmd=drlkcluster.Commands.GetCredentialStatus( + credential=credentials_struct)) + asserts.assert_true(type_matches(response, Clusters.DoorLock.Commands.GetCredentialStatusResponse), + "Unexpected return type for GetCredentialStatus") + asserts.assert_true(response.credentialExists == credential_exists, + "Error when executing GetCredentialStatus command, credentialExists={}".format( + str(response.credentialExists))) + if (not credential_exists): + asserts.assert_true(response.userIndex == NullValue, + "Error when executing GetCredentialStatus command, credentialExists={}".format( + str(response.userIndex))) + return response + except InteractionModelError as e: + logging.error(e) + asserts.assert_equal(e.status, Status.Success, f"Unexpected error returned: {e}") + + async def set_credential_cmd(self, credential_enum: drlkcluster.Enums.CredentialTypeEnum, statuscode, credentialIndex, + operationType, userIndex, credentialData, userStatus, userType): + custom_stautus_code = 149 + + credentials = drlkcluster.Structs.CredentialStruct( + credentialType=credential_enum, + credentialIndex=credentialIndex) + try: + logging.info("maxpincodelength value is %s" % (self.maxpincodelength)) + logging.info("maxrfidcodelength value is %s" % (self.maxrfidcodelength)) + logging.info("Credential Data is %s" % (credentialData)) + response = await self.send_single_cmd(cmd=drlkcluster.Commands.SetCredential( + operationType=operationType, + credential=credentials, + credentialData=credentialData, + userStatus=userStatus, + userType=userType, + userIndex=userIndex), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + asserts.assert_true(type_matches(response, drlkcluster.Commands.SetCredentialResponse), + "Unexpected return type for SetCredential") + + if (statuscode != custom_stautus_code): + asserts.assert_true(response.status == statuscode, + "Error sending SetCredential command, status={}".format(str(response.status))) + else: + asserts.assert_true(response.status == 2 or response.status == 3, + "Error sending SetCredential command, status={}".format(str(response.status))) + except InteractionModelError as e: + logging.exception(e) + asserts.assert_equal(e.status, statuscode, f"Unexpected error returned: {e}") + + async def clear_credentials_cmd(self, credential, step=None, expected_status: Status = Status.Success): + try: + + await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.ClearCredential(credential=credential), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + except InteractionModelError as e: + logging.exception(e) + asserts.assert_equal(e.status, expected_status, f"Unexpected error returned: {e}") + + @async_test_body + async def test_TC_DRLK_2_9(self): + + self.Attrib = 0 + self.numberofcredentialsupportedperuser = None + self.common_cluster_endpoint = 0 + self.app_cluster_endpoint = 1 + self.invalid_credential_type = 9 + self.user_unique_id1 = 6459 + self.user_unique_id2 = 1111 + self.user_name = "xxx" + self.credentialIndex_1 = 1 + self.credentialIndex_2 = 2 + self.credentialIndex_3 = 3 + self.operationType = drlkcluster.Enums.DataOperationTypeEnum.kAdd + self.userIndex_1 = 1 + self.userIndex_2 = 2 + self.invalid_user_status = 5 + self.invalid_user_type = 10 + self.pics_send_setcredential_pin_cmd = False + self.pics_send_setcredential_rfid_cmd = False + self.pin_code = b"" + self.pin_code1 = b"" + self.pin_code2 = b"" + self.inavlid_pincode = b"" + self.rfid_tag = b"" + + if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F08") + and self.check_pics("DRLK.S.C22.Rsp") and self.check_pics("DRLK.S.C23.Tx")): + self.pics_send_setcredential_pin_cmd = True + + if self.pics_guard(self.check_pics("DRLK.S.F01") and self.check_pics("DRLK.S.C22.Rsp") + and self.check_pics("DRLK.S.C23.Tx")): + self.pics_send_setcredential_rfid_cmd = True + + self.step("1") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.A0011")): + self.numberoftotaluserssupported = await self.read_attributes_from_dut(endpoint=self.app_cluster_endpoint, + cluster=drlkcluster, + attribute=Clusters.DoorLock.Attributes.NumberOfTotalUsersSupported) + self.step("2a") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C1a.Rsp")): + try: + await self.send_single_cmd(cmd=drlkcluster.Commands.SetUser( + operationType=Clusters.DoorLock.Enums.DataOperationTypeEnum.kAdd, + userIndex=1, + userName=self.user_name, + userUniqueID=self.user_unique_id1, + userStatus=Clusters.DoorLock.Enums.UserStatusEnum.kOccupiedEnabled, + userType=Clusters.DoorLock.Enums.UserTypeEnum.kUnrestrictedUser, + credentialRule=Clusters.DoorLock.Enums.CredentialRuleEnum.kSingle), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + except InteractionModelError as e: + logging.exception(e) + + self.step("2b") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.F00")): + self.minpincodelength = await self.read_attributes_from_dut(endpoint=self.app_cluster_endpoint, + cluster=drlkcluster, + attribute=Clusters.DoorLock.Attributes.MinPINCodeLength) + self.step("2c") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.F00")): + self.maxpincodelength = await self.read_attributes_from_dut(endpoint=self.app_cluster_endpoint, + cluster=drlkcluster, + attribute=Clusters.DoorLock.Attributes.MaxPINCodeLength) + self.step("2d") + if self.pics_guard(self.check_pics("DRLK.S.F01")): + self.minrfidcodelength = await self.read_attributes_from_dut(endpoint=self.app_cluster_endpoint, + cluster=drlkcluster, + attribute=Clusters.DoorLock.Attributes.MinRFIDCodeLength) + self.step("2e") + if self.pics_guard(self.check_pics("DRLK.S.F01")): + self.maxrfidcodelength = await self.read_attributes_from_dut(endpoint=self.app_cluster_endpoint, + cluster=drlkcluster, + attribute=Clusters.DoorLock.Attributes.MaxRFIDCodeLength) + self.step("2f") + await self.generate_code() + if self.pics_send_setcredential_pin_cmd: + + await self.set_credential_cmd(credentialData=self.pin_code, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=self.credentialIndex_1, userIndex=self.userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success) + self.step("3") + if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F08") + and self.check_pics("DRLK.S.C24.Rsp") and self.check_pics("DRLK.S.C25.Tx")): + await self.get_credentials_status(credentialIndex=self.credentialIndex_1, + credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin, step=None, userIndex=1, credential_exists=True) + self.step("4") + if self.pics_send_setcredential_pin_cmd: + + await self.set_credential_cmd(credentialData=self.inavlid_pincode, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=self.credentialIndex_2, userIndex=self.userIndex_1, userStatus=self.invalid_user_status, userType=self.invalid_user_type, statuscode=Status.InvalidCommand) + self.step("5") + if self.pics_send_setcredential_pin_cmd: + await self.set_credential_cmd(credentialData=self.pin_code, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=self.credentialIndex_2, userIndex=NullValue, userStatus=NullValue, userType=NullValue, statuscode=2) + + self.step("6a") + if self.pics_send_setcredential_pin_cmd: + await self.set_credential_cmd(credentialData=self.pin_code, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=self.credentialIndex_1, userIndex=NullValue, userStatus=NullValue, userType=NullValue, statuscode=149) + self.step("6b") + if self.pics_send_setcredential_pin_cmd: + await self.set_credential_cmd(credentialData=self.pin_code1, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=self.credentialIndex_1, userIndex=NullValue, userStatus=NullValue, userType=NullValue, statuscode=149) + self.step("7") + if self.pics_send_setcredential_pin_cmd: + await self.set_credential_cmd(credentialData=self.pin_code2, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kModify, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=self.credentialIndex_3, userIndex=self.userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.InvalidCommand) + self.step("8") + if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C26.Rsp")): + credentials = drlkcluster.Structs.CredentialStruct(credentialIndex=1, + credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin) + await self.clear_credentials_cmd(step=None, credential=credentials) + + self.step("9a") + if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C24.Rsp")): + await self.get_credentials_status(credentialIndex=self.credentialIndex_1, + credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin, step=None, userIndex=1, credential_exists=False) + self.step("9b") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C1d.Rsp")): + await self.send_clear_user_cmd(user_index=1) + + self.step("10") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C1a.Rsp")): + try: + await self.send_single_cmd(cmd=drlkcluster.Commands.SetUser( + operationType=Clusters.DoorLock.Enums.DataOperationTypeEnum.kAdd, + userIndex=self.userIndex_2, + userName=self.user_name, + userUniqueID=self.user_unique_id2, + userStatus=Clusters.DoorLock.Enums.UserStatusEnum.kOccupiedEnabled, + userType=Clusters.DoorLock.Enums.UserTypeEnum.kUnrestrictedUser, + credentialRule=Clusters.DoorLock.Enums.CredentialRuleEnum.kSingle), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + except InteractionModelError as e: + logging.exception(e) + + self.step("11") + if self.pics_send_setcredential_pin_cmd: + await self.set_credential_cmd(credentialData=self.pin_code, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=self.credentialIndex_1, userIndex=self.userIndex_2, userStatus=NullValue, userType=NullValue, statuscode=Status.Success) + self.step("12a") + if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C26.Rsp")): + credentials = drlkcluster.Structs.CredentialStruct(credentialIndex=0xFFFE, + credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin) + await self.clear_credentials_cmd(step=None, credential=credentials) + + self.step("13") + if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C24.Rsp") and self.check_pics("DRLK.S.C25.Tx")): + await self.get_credentials_status(credentialIndex=self.credentialIndex_1, + credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin, step=None, userIndex=1, credential_exists=False) + self.step("14a") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C26.Rsp")): + feature_map = await self.read_attributes_from_dut(endpoint=self.app_cluster_endpoint, + cluster=drlkcluster, + attribute=Clusters.DoorLock.Attributes.FeatureMap) + aliro_enabled = feature_map & Clusters.DoorLock.Bitmaps.Feature.kAliroProvisioning + if (aliro_enabled): + credentials = drlkcluster.Structs.CredentialStruct(credentialIndex=self.credentialIndex_1, + credentialType=drlkcluster.Enums.CredentialTypeEnum.kAliroNonEvictableEndpointKey) + await self.clear_credentials_cmd(step=None, credential=credentials) + else: + try: + await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.ClearCredential(credential=credentials), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + asserts.fail("Unexpected success in sending ClearCredential Command with invalid CredentialTpe") + + except InteractionModelError as e: + asserts.assert_equal(e.status, Status.InvalidCommand, + "Unexpected error sending ClearCredential Command with invalid CredentialTpe") + + self.step("14b") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C26.Rsp")): + credentials = drlkcluster.Structs.CredentialStruct(credentialIndex=self.credentialIndex_1, + credentialType=self.invalid_credential_type) + try: + await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.ClearCredential(credential=credentials), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + asserts.fail("Unexpected success in sending ClearCredential Command with invalid CredentialTpe") + except InteractionModelError as e: + asserts.assert_equal(e.status, Status.InvalidCommand, + "Unexpected error sending ClearCredential Command with invalid CredentialTpe") + + self.step("14c") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C1d.Rsp")): + await self.send_clear_user_cmd(self.userIndex_1) + + self.step("15a") + if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.A001c")): + + numberofcredentialsupportedperuser = await self.read_attributes_from_dut(endpoint=self.app_cluster_endpoint, + cluster=drlkcluster, + attribute=Clusters.DoorLock.Attributes.NumberOfCredentialsSupportedPerUser) + self.step("15b") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C1a.Rsp")): + try: + await self.send_single_cmd(cmd=drlkcluster.Commands.SetUser( + operationType=Clusters.DoorLock.Enums.DataOperationTypeEnum.kAdd, + userIndex=self.userIndex_1, + userName=self.user_name, + userUniqueID=self.user_unique_id1, + userStatus=Clusters.DoorLock.Enums.UserStatusEnum.kOccupiedEnabled, + userType=Clusters.DoorLock.Enums.UserTypeEnum.kUnrestrictedUser, + credentialRule=Clusters.DoorLock.Enums.CredentialRuleEnum.kSingle), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + except InteractionModelError as e: + logging.exception(e) + + self.step("15c") + if self.pics_send_setcredential_pin_cmd: + logging.info("setting 'start_credential_index' to value 1 ") + start_credential_index = 1 + while 1: + uniquePincodeString = await self.generate_pincode(self.maxpincodelength) + uniquePincode = bytes(uniquePincodeString, 'ascii') + logging.info("Credential Data value is %s" % (uniquePincode)) + if start_credential_index <= (numberofcredentialsupportedperuser): + await self.set_credential_cmd(credentialData=uniquePincode, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=start_credential_index, userIndex=self.userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success) + start_credential_index += 1 + logging.info(f"The updated value of start_credential_index is {start_credential_index}") + else: + break + self.step("15d") + if self.pics_send_setcredential_pin_cmd: + await self.set_credential_cmd(credentialData=self.pin_code, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=start_credential_index, userIndex=self.userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.ResourceExhausted) + self.step("15e") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C26.Rsp")): + credentials = drlkcluster.Structs.CredentialStruct(credentialIndex=0xFFFE, + credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin) + await self.clear_credentials_cmd(step=None, credential=credentials) + + self.step("16") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C1a.Rsp")): + try: + await self.send_single_cmd(cmd=drlkcluster.Commands.SetUser( + operationType=Clusters.DoorLock.Enums.DataOperationTypeEnum.kAdd, + userIndex=self.userIndex_1, + userName=self.user_name, + userUniqueID=self.user_unique_id1, + userStatus=Clusters.DoorLock.Enums.UserStatusEnum.kOccupiedEnabled, + userType=Clusters.DoorLock.Enums.UserTypeEnum.kUnrestrictedUser, + credentialRule=Clusters.DoorLock.Enums.CredentialRuleEnum.kSingle), + endpoint=self.app_cluster_endpoint, + timedRequestTimeoutMs=1000) + except InteractionModelError as e: + logging.exception(e) + + self.step("17") + if self.pics_send_setcredential_rfid_cmd: + + await self.set_credential_cmd(credentialData=self.rfid_tag, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kRfid, + credentialIndex=self.credentialIndex_1, userIndex=self.userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success) + self.step("18") + if self.pics_send_setcredential_pin_cmd: + await self.set_credential_cmd(credentialData=self.pin_code, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=self.credentialIndex_1, userIndex=self.userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success) + + self.step("19") + if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F01") and self.check_pics("DRLK.S.C1b.Rsp")): + + credentiallist: list[drlkcluster.Structs.CredentialStruct] + credentiallist = [drlkcluster.Structs.CredentialStruct(credentialIndex=self.credentialIndex_1, + credentialType=drlkcluster.Enums.CredentialTypeEnum.kRfid), + drlkcluster.Structs.CredentialStruct(credentialIndex=self.credentialIndex_1, + credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin)] + await self.get_user(self.userIndex_1, self.user_name, self.user_unique_id1, credentiallist, Status.Success) + + self.step("20") + if self.pics_send_setcredential_pin_cmd: + await self.set_credential_cmd(credentialData=self.pin_code1, + operationType=drlkcluster.Enums.DataOperationTypeEnum.kModify, + credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin, + credentialIndex=self.credentialIndex_1, userIndex=self.userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success) + + self.step("21") + if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F01") and self.check_pics("DRLK.S.C1b.Rsp")): + await self.get_user(self.userIndex_1, self.user_name, self.user_unique_id1, credentiallist, Status.Success) + + self.step("22") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C26.Rsp")): + await self.clear_credentials_cmd(step=None, credential=NullValue) + + self.step("23") + if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C1d.Rsp")): + await self.send_clear_user_cmd(self.userIndex_1) + + +if __name__ == '__main__': + default_matter_test_main()