Added DRLK-2.5 and DRLK-2.9 python script (#35201)

* added drlkcluster variable

* Delete src/python_testing/TC_DRLK_2_9.py

* added DRLK_2.5 python script

* Added Script DRLK_2.9

* removed DRLK_2_5 yaml file

* removed DRLK_2.9.yaml file

* updated DLOG_2_1.yaml

* removed redefined command clear user

* removed unsed var

* removed unused var

* Updated TC_DRLK_2_4.yaml script as per test plan

* Updated the TC to include PIN, Aliro combination and do Modify credential

* Restyled by autopep8

* updated PICS

* Appended steps to check modify of both PIN and Aliro credentiaType is as expected

* Updated DRLK-2.5 test case as per PR comment
1.correted test step description for step 4,5,6 and 9
2.Corrected steps 5,6 and 9

* Updated DRLK-2.9
1. Corrected test step description
2. Corrected PICS
3. Validated arrtibutes read based on respective range
4. modified get_user function to check for given credentialsirespective to the order of credentials listed

* Added nextcredentialIndex check in get_credential_status function

* fixed code-lints error

* Added generate_max_pincode_len for generating valid pin code of Max pincode length

* Restyled by isort

* added a check in get_user funtion that length of given Credential list matches with length of response credential list

* PR review -Init the pin and rid variables

* fixed lint error

---------

Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/src/app/tests/suites/certification/Test_TC_DLOG_2_1.yaml b/src/app/tests/suites/certification/Test_TC_DLOG_2_1.yaml
index 45111b0..ebc658f 100644
--- a/src/app/tests/suites/certification/Test_TC_DLOG_2_1.yaml
+++ b/src/app/tests/suites/certification/Test_TC_DLOG_2_1.yaml
@@ -34,6 +34,18 @@
           Length of TransferFileDesignator is equal to 32 characters
           Length of TransferFileDesignator is greater than 32 characters
           To send a message that mismatches the current transfer mode
+          1. Execute the below commands in the interactive mode:
+           ./chip-tool interactive start
+          2. Before running the below steps ensure that  \tmp folder on the system does not contain the below files.
+             If they are present please delete these files:
+               TH_LOG_OK_NORMAL : "Length_1234567.txt"
+               TH_LOG_OK_FULL_LENGTH : "Length_123456789123456789123.txt"
+          3. Use the below command in the all-cluster-app for setting up the diagonistics logs.
+           ./chip-all-clusters-app --trace_decode 1 --end_user_support_log ~/tmp/end_user_support_log.txt --network_diagnostics_log ~/tmp/nw_log.txt --crash_log ~/tmp/crash_log.txt
+          The log file content can be set such that the file size can be as follows to obtain different status code from DUT:
+          1. end_user_support_log  > 1024 bytes
+          2. Make sure that nw_log.txt does not exist
+          3. crash_log < 1024 bytes
       disabled: true
 
     - label: "Step 1: Commission DUT to TH"
@@ -187,7 +199,7 @@
           TH_LOG_OK_NORMAL)"
       PICS: MCORE.BDX.Initiator
       verification: |
-          "diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator Length_1234567.txt
+          diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator Length_1234567.txt
 
           On TH(chip-tool), Verify that the DUT sends SendInit message with TransferFileDesignator field set to Length_1234567891234567891
           [1707967645.770994][10882:10885] CHIP:ATM: SendInit
@@ -219,7 +231,7 @@
           by setting Intent field to . NetworkDiag . CrashLogs"
       PICS: MCORE.BDX.Initiator
       verification: |
-          "diagnosticlogs retrieve-logs-request 0 0 1 0
+          diagnosticlogs retrieve-logs-request 0 0 1 0
 
           On TH(chip-tool), Verify that the DUT responds with Success(0) status code for the RetrieveLogsResponse command Verify that LogContent field contains at most 1024 bytes
 
@@ -254,7 +266,7 @@
           EndUserSupport, RequestedProtocol= BDX)"
       PICS: MCORE.BDX.Initiator
       verification: |
-          "diagnosticlogs retrieve-logs-request 0 1 1 0
+          diagnosticlogs retrieve-logs-request 0 1 1 0
 
           On TH(chip-tool), Verify that the DUT responds with INVALID_COMMAND for the RetrieveLogsRequest that was sent without TransferFileDesignator
 
@@ -290,7 +302,7 @@
           RequestedProtocol= BDX, TransferFileDesignator = TH_LOG_OK_NORMAL)"
       PICS: "!MCORE.BDX.Initiator"
       verification: |
-          "diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator Length_1234567.txt
+          diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator Length_1234567.txt
 
           On TH(chip-tool), Verify that the DUT responds with Exhausted(1)  status code for the RetrieveLogsResponse command with the  LogContent field containing at most 1024 bytes
 
@@ -300,13 +312,39 @@
       disabled: true
 
     - label:
+          "Step 11: TH sends RetrieveLogsRequest Command to DUT with Invalid
+          Intent : RetrieveLogsRequest(Intent = 3, RequestedProtocol= BDX,
+          TransferFileDesignator = TH_LOG_OK_NORMAL) Repeat this step with
+          RequestedProtocol as ResponsePayload"
+      verification: |
+          diagnosticlogs retrieve-logs-request 3 0 1 0 --TransferFileDesignator Length_1234567.txt
+
+          On TH(chip-tool), Verify that the DUT responds with INVALID_COMMAND for the RetrieveLogsRequest that was sent invalid Intent(3)
+
+          [1707901794.468552][36124:36127] CHIP:DMG:                                 StatusIB =
+          [1707901794.468560][36124:36127] CHIP:DMG:                                 {
+          [1707901794.468569][36124:36127] CHIP:DMG:                                         status = 0x85 (INVALID_COMMAND),
+          [1707901794.468576][36124:36127] CHIP:DMG:                                 },
+          [1707901794.468584][36124:36127] CHIP:DMG:
+          [1707901794.468591][36124:36127] CHIP:DMG:                         },
+
+          Repeat this step by setting RequestedProtocol as ResponsePayload :
+
+          diagnosticlogs retrieve-logs-request 3 1 1 0 --TransferFileDesignator Length_1234567.txt
+          On TH(chip-tool), Verify that the DUT responds with INVALID_COMMAND for the RetrieveLogsRequest that was sent invalid Intent(3)
+          [1707901794.468552][36124:36127] CHIP:DMG:                                 StatusIB =
+          [1707901794.468560][36124:36127] CHIP:DMG:                                 {
+          [1707901794.468569][36124:36127] CHIP:DMG:                                         status = 0x85 (INVALID_COMMAND),
+          [1707901794.468576][36124:36127] CHIP:DMG:                                 },
+      disabled: true
+
+    - label:
           "Step 12: TH sends RetrieveLogsRequest Command to DUT with Invalid
           RequestedProtocol : RetrieveLogsRequest(Intent =
           EndUserSupport,RequestedProtocol= 2, TransferFileDesignator =
           TH_LOG_OK_NORMAL)"
-      PICS: MCORE.BDX.Initiator
       verification: |
-          "diagnosticlogs retrieve-logs-request 0 2 1 0 --TransferFileDesignator Length_1234567.txt
+          diagnosticlogs retrieve-logs-request 0 2 1 0 --TransferFileDesignator Length_1234567.txt
 
           On TH(chip-tool), Verify that the DUT responds with INVALID_COMMAND for the RetrieveLogsRequest that was sent Invalid RequestedProtocol(2)
 
@@ -344,39 +382,14 @@
           TransferFileDesignator length : RetrieveLogsRequest(Intent =
           EndUserSupport,RequestedProtocol= BDX, TransferFileDesignator =
           TH_LOG_ERROR_EMPTY)"
+      PICS: MCORE.BDX.Initiator
       verification: |
-          "diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator ''
-
-          [1707904517.151453][36678:36681] CHIP:DMG: ICR moving to [ResponseRe]
-          [1707904517.151489][36678:36681] CHIP:DMG: InvokeResponseMessage =
-          [1707904517.151501][36678:36681] CHIP:DMG: {
-          [1707904517.151511][36678:36681] CHIP:DMG:         suppressResponse = false,
-          [1707904517.151522][36678:36681] CHIP:DMG:         InvokeResponseIBs =
-          [1707904517.151541][36678:36681] CHIP:DMG:         [
-          [1707904517.151548][36678:36681] CHIP:DMG:                 InvokeResponseIB =
-          [1707904517.151565][36678:36681] CHIP:DMG:                 {
-          [1707904517.151573][36678:36681] CHIP:DMG:                         CommandStatusIB =
-          [1707904517.151582][36678:36681] CHIP:DMG:                         {
-          [1707904517.151590][36678:36681] CHIP:DMG:                                 CommandPathIB =
-          [1707904517.151599][36678:36681] CHIP:DMG:                                 {
-          [1707904517.151613][36678:36681] CHIP:DMG:                                         EndpointId = 0x0,
-          [1707904517.151627][36678:36681] CHIP:DMG:                                         ClusterId = 0x32,
-          [1707904517.151640][36678:36681] CHIP:DMG:                                         CommandId = 0x0,
-          [1707904517.151652][36678:36681] CHIP:DMG:                                 },
-          [1707904517.151670][36678:36681] CHIP:DMG:
-          [1707904517.151681][36678:36681] CHIP:DMG:                                 StatusIB =
-          [1707904517.151696][36678:36681] CHIP:DMG:                                 {
-          [1707904517.151708][36678:36681] CHIP:DMG:                                         status = 0x87 (CONSTRAINT_ERROR),
-          [1707904517.151720][36678:36681] CHIP:DMG:                                 },
-          [1707904517.151734][36678:36681] CHIP:DMG:
-          [1707904517.151745][36678:36681] CHIP:DMG:                         },
-          [1707904517.151763][36678:36681] CHIP:DMG:
-          [1707904517.151772][36678:36681] CHIP:DMG:                 },
-          [1707904517.151790][36678:36681] CHIP:DMG:
-          [1707904517.151798][36678:36681] CHIP:DMG:         ],
-          [1707904517.151816][36678:36681] CHIP:DMG:
-          [1707904517.151824][36678:36681] CHIP:DMG:         InteractionModelRevision = 11
-          [1707904517.151830][36678:36681] CHIP:DMG: },"
+          diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator ''
+           On TH(chip-tool), Verify that DUT sends RetrieveLogsResponse command to TH with Denied(4) status code.
+          [1719990173.360981][8053:8056] CHIP:TOO:   RetrieveLogsResponse: {
+          [1719990173.361009][8053:8056] CHIP:TOO:     status: 4
+          [1719990173.361021][8053:8056] CHIP:TOO:     logContent:
+          [1719990173.361030][8053:8056] CHIP:TOO:    }
       disabled: true
 
     - label:
@@ -385,9 +398,9 @@
           EndUserSupport,RequestedProtocol= BDX, TransferFileDesignator =
           TH_LOG_BAD_LENGTH)"
       verification: |
-          "diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator Length_1234567891234567891234567891212345.txt
+          diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator Length_1234567891234567891234567891212345.txt
 
-          On TH(chip-tool), Verify that the DUT responds with CONSTRAINT_ERRORfor the RetrieveLogsRequest that was sent Invalid Invalid TransferFileDesignator length(> 32)
+          On TH(chip-tool), Verify that the DUT responds with CONSTRAINT_ERROR for the RetrieveLogsRequest that was sent Invalid Invalid TransferFileDesignator length(> 32)
 
           [1707904517.151453][36678:36681] CHIP:DMG: ICR moving to [ResponseRe]
           [1707904517.151489][36678:36681] CHIP:DMG: InvokeResponseMessage =
diff --git a/src/app/tests/suites/certification/Test_TC_DRLK_2_4.yaml b/src/app/tests/suites/certification/Test_TC_DRLK_2_4.yaml
index bece149..a525389 100644
--- a/src/app/tests/suites/certification/Test_TC_DRLK_2_4.yaml
+++ b/src/app/tests/suites/certification/Test_TC_DRLK_2_4.yaml
@@ -33,104 +33,6 @@
               - name: "nodeId"
                 value: nodeId
 
-    - label: "Create new user"
-      command: "SetUser"
-      PICS: DRLK.S.F08 && DRLK.S.F00
-      timedInteractionTimeoutMs: 1000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "UserIndex"
-                value: 1
-              - name: "UserName"
-                value: "xxx"
-              - name: "UserUniqueID"
-                value: 6452
-              - name: "UserStatus"
-                value: 1
-              - name: "UserType"
-                value: 0
-              - name: "CredentialRule"
-                value: 0
-
-    - label: "Read the user back and verify its fields"
-      command: "GetUser"
-      PICS: DRLK.S.F08 && DRLK.S.F00
-      arguments:
-          values:
-              - name: "UserIndex"
-                value: 1
-      response:
-          values:
-              - name: "UserIndex"
-                value: 1
-              - name: "UserName"
-                value: "xxx"
-              - name: "UserUniqueID"
-                value: 6452
-              - name: "UserStatus"
-                value: 1
-              - name: "UserType"
-                value: 0
-              - name: "CredentialRule"
-                value: 0
-              - name: "Credentials"
-                value: []
-              - name: "CreatorFabricIndex"
-                value: 1
-              - name: "LastModifiedFabricIndex"
-                value: 1
-              - name: "NextUserIndex"
-                value: null
-
-    - label: "Create new PIN credential and lock/unlock user"
-      command: "SetCredential"
-      PICS: DRLK.S.F08 && DRLK.S.F00
-      timedInteractionTimeoutMs: 1000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-              - name: "CredentialData"
-                value: "123456"
-              - name: "UserIndex"
-                value: 1
-              - name: "UserStatus"
-                value: null
-              - name: "UserType"
-                value: null
-      response:
-          values:
-              - name: "Status"
-                value: 0
-              - name: "UserIndex"
-                value: null
-              - name: "NextCredentialIndex"
-                value: 2
-
-    - label: "Verify created PIN credential"
-      PICS: DRLK.S.F08 && DRLK.S.F00
-      command: "GetCredentialStatus"
-      arguments:
-          values:
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-      response:
-          values:
-              - name: "CredentialExists"
-                value: true
-              - name: "UserIndex"
-                value: 1
-              - name: "CreatorFabricIndex"
-                value: 1
-              - name: "LastModifiedFabricIndex"
-                value: 1
-              - name: "NextCredentialIndex"
-                value: null
-
     - label:
           "Step 1a: TH writes AutoRelockTime attribute value as 10 seconds on
           the DUT"
@@ -172,7 +74,80 @@
           error: UNSUPPORTED_WRITE
 
     - label:
-          "Step 2a: TH sends the Unlock with Timeout argument value as 10
+          "Step 2a: TH sends SetUser Command to DUT with the following values:"
+      command: "SetUser"
+      PICS: DRLK.S.F08 && DRLK.S.C1a.Rsp
+      timedInteractionTimeoutMs: 1000
+      arguments:
+          values:
+              - name: "OperationType"
+                value: 0
+              - name: "UserIndex"
+                value: 1
+              - name: "UserName"
+                value: "xxx"
+              - name: "UserUniqueID"
+                value: 6452
+              - name: "UserStatus"
+                value: 1
+              - name: "UserType"
+                value: 0
+              - name: "CredentialRule"
+                value: 0
+
+    - label: "Step 2b: TH reads MinPINCodeLength attribute from DUT"
+      PICS: DRLK.S.F00 && DRLK.S.A0018
+      command: "readAttribute"
+      attribute: "MinPINCodeLength"
+      response:
+          saveAs: MinPINCodeLengthValue
+          constraints:
+              type: int8u
+              minValue: 0
+              maxValue: 255
+
+    - label: "Step 2c: TH reads MaxPINCodeLength attribute from DUT"
+      PICS: DRLK.S.F00 && DRLK.S.A0017
+      command: "readAttribute"
+      attribute: "MaxPINCodeLength"
+      response:
+          saveAs: MaxPINCodeLengthValue
+          constraints:
+              type: int8u
+              minValue: 0
+              maxValue: 255
+    - label:
+          "Step 2d: TH sends SetCredential Command to DUT with the following
+          fields and CredentialData Length is in an inclusive range of
+          MaxPINCodeLengthValue to MaxPINCodeLengthValue"
+      command: "SetCredential"
+      PICS: DRLK.S.F00 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx
+      timedInteractionTimeoutMs: 1000
+      arguments:
+          values:
+              - name: "OperationType"
+                value: 0
+              - name: "Credential"
+                value: { CredentialType: 1, CredentialIndex: 1 }
+              - name: "CredentialData"
+                value: "123456"
+              - name: "UserIndex"
+                value: 1
+              - name: "UserStatus"
+                value: null
+              - name: "UserType"
+                value: null
+      response:
+          values:
+              - name: "Status"
+                value: 0
+              - name: "UserIndex"
+                value: null
+              - name: "NextCredentialIndex"
+                value: 2
+
+    - label:
+          "Step 2e: TH sends the Unlock with Timeout argument value as 10
           seconds"
       PICS: DRLK.S.C03.Rsp && PICS_SDK_CI_ONLY
       command: "UnlockWithTimeout"
@@ -185,7 +160,7 @@
                 value: "123456"
 
     - label:
-          "Step 2b: TH sends the Unlock with Timeout argument value as 60
+          "Step 2f: TH sends the Unlock with Timeout argument value as 60
           seconds"
       PICS:
           " DRLK.S.F08 && DRLK.S.F00 && DRLK.S.C03.Rsp && PICS_SKIP_SAMPLE_APP "
@@ -199,7 +174,7 @@
                 value: "123456"
 
     - label:
-          "Step 2b: TH sends the Unlock with Timeout argument value as 60
+          "Step 2g: TH sends the Unlock with Timeout argument value as 60
           seconds"
       PICS:
           " (!DRLK.S.F08 || !DRLK.S.F00) && DRLK.S.C03.Rsp &&
@@ -230,27 +205,30 @@
               - name: "ms"
                 value: 70000
 
-    - label: "Step 2c: TH reads LockState attribute"
+    - label: "Step 2h: TH reads LockState attribute"
       PICS: DRLK.S.A0000 && DRLK.S.C03.Rsp
       command: "readAttribute"
       attribute: "LockState"
       response:
           value: 1
 
-    - label: "Cleanup the created user"
-      command: "ClearUser"
-      PICS: DRLK.S.F08 && DRLK.S.F00
-      timedInteractionTimeoutMs: 1000
-      arguments:
-          values:
-              - name: "UserIndex"
-                value: 1
-
-    - label: "Clean the created credential"
-      PICS: DRLK.S.F08 && DRLK.S.F00 && DRLK.S.C26.Rsp
+    - label:
+          "Step 3a: TH sends ClearCredential Command to DUT with the following
+          fields:"
+      PICS: DRLK.S.F00 && DRLK.S.C26.Rsp
       command: "ClearCredential"
       timedInteractionTimeoutMs: 1000
       arguments:
           values:
               - name: "Credential"
                 value: { CredentialType: 1, CredentialIndex: 1 }
+
+    - label:
+          "Step 3b: TH sends ClearUser Command to DUT with the UserIndex as 1"
+      command: "ClearUser"
+      PICS: DRLK.S.F08 && DRLK.S.C1d.Rsp
+      timedInteractionTimeoutMs: 1000
+      arguments:
+          values:
+              - name: "UserIndex"
+                value: 1
diff --git a/src/app/tests/suites/certification/Test_TC_DRLK_2_5.yaml b/src/app/tests/suites/certification/Test_TC_DRLK_2_5.yaml
deleted file mode 100644
index c0c8feb..0000000
--- a/src/app/tests/suites/certification/Test_TC_DRLK_2_5.yaml
+++ /dev/null
@@ -1,320 +0,0 @@
-# Copyright (c) 2021 Project CHIP Authors
-#
-# 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.
-
-name:
-    111.2.5. [TC-DRLK-2.5] Verification for the following Commands - Set Week
-    Day Schedule, Get Week Day Schedule , Get Week Day Schedule Response, Clear
-    Week Day Schedule [DUT-Server]
-
-PICS:
-    - DRLK.S
-    - DRLK.S.F08
-
-config:
-    nodeId: 0x12344321
-    cluster: "Door Lock"
-    endpoint: 1
-
-tests:
-    - label: "Wait for the commissioned device to be retrieved"
-      cluster: "DelayCommands"
-      command: "WaitForCommissionee"
-      arguments:
-          values:
-              - name: "nodeId"
-                value: nodeId
-
-    - label: "Precondition: Create new user"
-      command: "SetUser"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "UserIndex"
-                value: 1
-              - name: "UserName"
-                value: "xxx"
-              - name: "UserUniqueID"
-                value: 6452
-              - name: "UserStatus"
-                value: 1
-              - name: "UserType"
-                value: 0
-              - name: "CredentialRule"
-                value: 0
-
-    - label: "Precondition: Read the user back and verify its fields"
-      command: "GetUser"
-      arguments:
-          values:
-              - name: "UserIndex"
-                value: 1
-      response:
-          values:
-              - name: "UserIndex"
-                value: 1
-              - name: "UserName"
-                value: "xxx"
-              - name: "UserUniqueID"
-                value: 6452
-              - name: "UserStatus"
-                value: 1
-              - name: "UserType"
-                value: 0
-              - name: "CredentialRule"
-                value: 0
-              - name: "Credentials"
-                value: []
-              - name: "CreatorFabricIndex"
-                value: 1
-              - name: "LastModifiedFabricIndex"
-                value: 1
-              - name: "NextUserIndex"
-                value: null
-
-    - label:
-          "Step 1: TH reads NumberOfWeekDay SchedulesSupportedPerUser attribute
-          and saves for future use"
-      PICS: DRLK.S.F04 && DRLK.S.A0014
-      command: "readAttribute"
-      attribute: "NumberOfWeekDaySchedulesSupportedPerUser"
-      response:
-          saveAs: NumberOfWeekDaySchedulesSupportedPerUserValue
-          constraints:
-              minValue: 0
-              maxValue: 255
-
-    - label:
-          "Step 2: TH reads NumberOfTotalUsers Supported attribute and saves for
-          future use"
-      PICS: DRLK.S.F08 && DRLK.S.A0011
-      command: "readAttribute"
-      attribute: "NumberOfTotalUsersSupported"
-      response:
-          saveAs: NumberOfTotalUsersSupportedValue
-          constraints:
-              minValue: 0
-              maxValue: 65534
-
-    - label:
-          "Step 3: TH send Set Week Day Schedule Command to DUT with the
-          following values : a)WeekDayIndex as 1 b)UserIndex as 1 c)DaysMaskMap
-          as 2 d)StartHour as 15 e)StartMinute as 45 f)EndHour as 16 g)EndMinute
-          as 55 "
-      PICS: DRLK.S.F04 && DRLK.S.C0b.Rsp
-      command: "SetWeekDaySchedule"
-      arguments:
-          values:
-              - name: "WeekDayIndex"
-                value: 1
-              - name: "UserIndex"
-                value: 1
-              - name: "DaysMask"
-                value: 2
-              - name: "StartHour"
-                value: 15
-              - name: "StartMinute"
-                value: 45
-              - name: "EndHour"
-                value: 16
-              - name: "EndMinute"
-                value: 55
-
-    #issue #18591
-    - label:
-          "Step 4:  TH send Get Week Day Schedule Command to DUT with
-          a)WeekDayIndex as 1 b)UserIndex as 1 "
-      PICS: DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx
-      command: "GetWeekDaySchedule"
-      arguments:
-          values:
-              - name: "WeekDayIndex"
-                value: 1
-              - name: "UserIndex"
-                value: 1
-      response:
-          values:
-              - name: "WeekDayIndex"
-                value: 1
-              - name: "UserIndex"
-                value: 1
-              - name: "Status"
-                value: 0x0
-              - name: "DaysMask"
-                value: 2
-              - name: "StartHour"
-                value: 15
-              - name: "StartMinute"
-                value: 45
-              - name: "EndHour"
-                constraints:
-                    hasValue: true
-                    minValue: 16
-              - name: "EndMinute"
-                constraints:
-                    hasValue: true
-                    minValue: 55
-
-    - label:
-          "Step 5: TH send Set Week Day Schedule Command to DUT with the
-          following values : a)WeekDayIndex as 0 (invalid value) b)UserIndex as
-          1 c)DaysMaskMap as 7 (invalid value) d)StartHour as 15 e)StartMinute
-          as 45 f)EndHour as 16 g)EndMinute as 55"
-      PICS: DRLK.S.F04 && DRLK.S.C0b.Rsp
-      command: "SetWeekDaySchedule"
-      arguments:
-          values:
-              - name: "WeekDayIndex"
-                value: 0
-              - name: "UserIndex"
-                value: 1
-              - name: "DaysMask"
-                value: 7
-              - name: "StartHour"
-                value: 15
-              - name: "StartMinute"
-                value: 45
-              - name: "EndHour"
-                value: 16
-              - name: "EndMinute"
-                value: 55
-      response:
-          error: INVALID_COMMAND
-
-    - label:
-          "Step 6: TH send Get Week Day Schedule Command to DUT : a)WeekDayIndex
-          as 0 b)UserIndex as 1 "
-      PICS: DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx
-      command: "GetWeekDaySchedule"
-      arguments:
-          values:
-              - name: "WeekDayIndex"
-                value: 0
-              - name: "UserIndex"
-                value: 1
-      response:
-          values:
-              - name: "WeekDayIndex"
-                value: 0
-              - name: "UserIndex"
-                value: 1
-              - name: "Status"
-                value: 0x85
-              - name: "DaysMask"
-                constraints:
-                    hasValue: false
-              - name: "StartHour"
-                constraints:
-                    hasValue: false
-              - name: "StartMinute"
-                constraints:
-                    hasValue: false
-              - name: "EndHour"
-                constraints:
-                    hasValue: false
-              - name: "EndMinute"
-                constraints:
-                    hasValue: false
-
-    - label:
-          "Step 7: TH sends Get Week Day Schedule Command to DUT with following
-          values: a)WeekDayIndex as 1 (index of existing Schedule entry)
-          b)UserIndex as 2 (index on non-existent User)"
-      PICS: DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx
-      command: "GetWeekDaySchedule"
-      arguments:
-          values:
-              - name: "WeekDayIndex"
-                value: 1
-              - name: "UserIndex"
-                value: 2
-      response:
-          values:
-              - name: "WeekDayIndex"
-                value: 1
-              - name: "UserIndex"
-                value: 2
-              - name: "Status"
-                value: 0x8B
-              - name: "DaysMask"
-                constraints:
-                    hasValue: false
-              - name: "StartHour"
-                constraints:
-                    hasValue: false
-              - name: "StartMinute"
-                constraints:
-                    hasValue: false
-              - name: "EndHour"
-                constraints:
-                    hasValue: false
-              - name: "EndMinute"
-                constraints:
-                    hasValue: false
-
-    - label:
-          "Step 8: TH sends Clear Week Day Schedule Command to DUT with :
-          a)WeekDayIndex as 1 b)UserIndex as 1"
-      PICS: DRLK.S.F04 && DRLK.S.C0d.Rsp
-      command: "ClearWeekDaySchedule"
-      arguments:
-          values:
-              - name: "WeekDayIndex"
-                value: 1
-              - name: "UserIndex"
-                value: 1
-
-    - label:
-          "Step 9: TH sends Get Week Day Schedule Command to DUT with following
-          values: a)WeekDayIndex as 1 b)UserIndex as 1"
-      PICS: DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx
-      command: "GetWeekDaySchedule"
-      arguments:
-          values:
-              - name: "WeekDayIndex"
-                value: 1
-              - name: "UserIndex"
-                value: 1
-      response:
-          values:
-              - name: "WeekDayIndex"
-                value: 1
-              - name: "UserIndex"
-                value: 1
-              - name: "Status"
-                value: 0x8B
-              - name: "DaysMask"
-                constraints:
-                    hasValue: false
-              - name: "StartHour"
-                constraints:
-                    hasValue: false
-              - name: "StartMinute"
-                constraints:
-                    hasValue: false
-              - name: "EndHour"
-                constraints:
-                    hasValue: false
-              - name: "EndMinute"
-                constraints:
-                    hasValue: false
-
-    - label: "Cleanup the created user"
-      command: "ClearUser"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "UserIndex"
-                value: 1
diff --git a/src/app/tests/suites/certification/Test_TC_DRLK_2_9.yaml b/src/app/tests/suites/certification/Test_TC_DRLK_2_9.yaml
deleted file mode 100644
index 0c0a372..0000000
--- a/src/app/tests/suites/certification/Test_TC_DRLK_2_9.yaml
+++ /dev/null
@@ -1,471 +0,0 @@
-# Copyright (c) 2021 Project CHIP Authors
-#
-# 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.
-
-name:
-    111.2.9. [TC-DRLK-2.9] Verification for the following Commands - Set
-    Credential , Set Credential Response, Get Credential Status, Get Credential
-    Status Response, Clear Credential [DUT-Server]
-
-PICS:
-    - DRLK.S
-
-config:
-    nodeId: 0x12344321
-    cluster: "Door Lock"
-    endpoint: 1
-
-tests:
-    - label: "Wait for the commissioned device to be retrieved"
-      cluster: "DelayCommands"
-      command: "WaitForCommissionee"
-      arguments:
-          values:
-              - name: "nodeId"
-                value: nodeId
-
-    - label: "Precondition: Create new user with default parameters"
-      command: "SetUser"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "UserIndex"
-                value: 1
-              - name: "UserName"
-                value: "xxx"
-              - name: "UserUniqueID"
-                value: 6452
-              - name: "UserStatus"
-                value: 1
-              - name: "UserType"
-                value: 0
-              - name: "CredentialRule"
-                value: 0
-
-    - label: "Precondition: Read the user back and verify its fields"
-      command: "GetUser"
-      arguments:
-          values:
-              - name: "UserIndex"
-                value: 1
-      response:
-          values:
-              - name: "UserIndex"
-                value: 1
-              - name: "UserName"
-                value: "xxx"
-              - name: "UserUniqueID"
-                value: 6452
-              - name: "UserStatus"
-                value: 1
-              - name: "UserType"
-                value: 0
-              - name: "CredentialRule"
-                value: 0
-              - name: "Credentials"
-                value: []
-              - name: "CreatorFabricIndex"
-                value: 1
-              - name: "LastModifiedFabricIndex"
-                value: 1
-              - name: "NextUserIndex"
-                value: null
-
-    - label:
-          "Step 1: TH reads NumberOfTotalUsersSupported attribute and saves for
-          future use."
-      PICS: DRLK.S.F08 && DRLK.S.A0011
-      command: "readAttribute"
-      attribute: "NumberOfTotalUsersSupported"
-      response:
-          saveAs: NumberOfTotalUsersSupportedValue
-          constraints:
-              minValue: 0
-              maxValue: 65534
-
-    - label:
-          "Step 2: TH sends Set Credential Command to DUT with the following
-          fields a)OperationType as 0 b)Credential as 1 1 c)CredentialData as
-          123456 d)UserIndex as 1 e)UserStatus as null f)UserType as null"
-      PICS: DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx
-      command: "SetCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-              - name: "CredentialData"
-                value: "123456"
-              - name: "UserIndex"
-                value: 1
-              - name: "UserStatus"
-                value: null
-              - name: "UserType"
-                value: null
-      response:
-          values:
-              - name: "Status"
-                value: 0
-              - name: "UserIndex"
-                value: null
-              - name: "NextCredentialIndex"
-                value: 2
-
-    - label:
-          "Step 3: TH sends Get Credential Status Command with a)CredentialType
-          as 1 b)CredentialIndex as 1"
-      PICS: DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
-      command: "GetCredentialStatus"
-      arguments:
-          values:
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-      response:
-          values:
-              - name: "CredentialExists"
-                constraints:
-                    type: boolean
-              - name: "UserIndex"
-                value: 1
-              - name: "CreatorFabricIndex"
-                value: 1
-              - name: "LastModifiedFabricIndex"
-                value: 1
-              - name: "NextCredentialIndex"
-                value: null
-
-    - label:
-          "Step 4: TH sends Set Credential Command to DUT with the following
-          fields a)OperationType as 0 b)Credential as 1 2 C)CredentialData as
-          4321 D)UserIndex as null e)UserStatus as 5(Invalid value) f)UserType
-          as 10(Invalid value)"
-      PICS: DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx
-      command: "SetCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 2 }
-              - name: "CredentialData"
-                value: "4321"
-              - name: "UserIndex"
-                value: null
-              - name: "UserStatus"
-                value: UserStatusEnum.UnknownEnumValue(5)
-              - name: "UserType"
-                value: 10
-      response:
-          values:
-              - name: "Status"
-                value: 0x85
-              - name: "UserIndex"
-                value: null
-
-    - label:
-          "Step 5: TH sends Set Credential Command to DUT with the following
-          fields a)OperationType as 0 b)Credential as 1 2 d)CredentialData as
-          123456 (same as step 2) e)UserIndex as null f)UserStatus as null
-          g)UserType as null"
-      PICS: DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx
-      command: "SetCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 2 }
-              - name: "CredentialData"
-                value: "123456"
-              - name: "UserIndex"
-                value: null
-              - name: "UserStatus"
-                value: null
-              - name: "UserType"
-                value: null
-      response:
-          values:
-              - name: "Status"
-                value: 0x02
-              - name: "UserIndex"
-                value: null
-
-    - label:
-          "Step 6a: TH sends Set Credential Command to DUT with the following
-          fields a)OperationType as 0 b)Credential as 1 1 (same as step 2)
-          c)CredentialData as 123456 d)UserIndex as 1 e)UserStatus as null
-          f)UserType as null"
-      PICS: DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx
-      command: "SetCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-              - name: "CredentialData"
-                value: "123456"
-              - name: "UserIndex"
-                value: 1
-              - name: "UserStatus"
-                value: null
-              - name: "UserType"
-                value: null
-      response:
-          values:
-              - name: "Status"
-                constraints:
-                    anyOf: [0x2, 0x3]
-
-    - label:
-          "Step 6b: TH sends Set Credential Command to DUT with the following
-          fields: a)OperationType as 0 b)Credential as 1 1 (same as step 2)
-          c)CredentialData as 123457 d)UserIndex as 1 e)UserStatus as null
-          f)UserType as null"
-      PICS: DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx
-      command: "SetCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-              - name: "CredentialData"
-                value: "123457"
-              - name: "UserIndex"
-                value: 1
-              - name: "UserStatus"
-                value: null
-              - name: "UserType"
-                value: null
-      response:
-          values:
-              - name: "Status"
-                constraints:
-                    anyOf: [0x2, 0x3]
-
-    - label:
-          "Step 7: TH sends Set Credential Command to DUT with the following
-          fields: a)OperationType as 2 b)Credential as 1 3 c)CredentialData as
-          1234567 d)UserIndex as 1 e)UserStatus as null  f)UserType as null"
-      PICS: DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx
-      command: "SetCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 2
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 3 }
-              - name: "CredentialData"
-                value: "1234567"
-              - name: "UserIndex"
-                value: 1
-              - name: "UserStatus"
-                value: null
-              - name: "UserType"
-                value: null
-      response:
-          values:
-              - name: "Status"
-                value: 0x85
-
-    - label:
-          "Step 8: TH sends Clear Credential Command to DUT with the following
-          fields: a)CredentialType as 1 b)CredentialIndex as 1"
-      PICS: DRLK.S.F08 && DRLK.S.C26.Rsp
-      command: "ClearCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-
-    - label:
-          "Step 9: TH sends Get Credential command to DUT with the following
-          fields: a)CredentialType as 1 b)CredentialIndex as 1"
-      PICS: DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
-      command: "GetCredentialStatus"
-      arguments:
-          values:
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-      response:
-          values:
-              - name: "CredentialExists"
-                value: false
-              - name: "UserIndex"
-                value: null
-              - name: "CreatorFabricIndex"
-                value: null
-              - name: "LastModifiedFabricIndex"
-                value: null
-              - name: "NextCredentialIndex"
-                value: null
-
-    - label:
-          "Step 10: TH sends Set User Command to DUT with the following values:
-          a)OperationType as 0 b)UserIndex as 2 c)UserName as xxx d)UserUniqueID
-          as 6452 e)UserStatus as 1 f)UserType as 0 g)CredentialRule as 0"
-      PICS: DRLK.S.F08 && DRLK.S.C1a.Rsp
-      command: "SetUser"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "UserIndex"
-                value: 2
-              - name: "UserName"
-                value: "xxx"
-              - name: "UserUniqueID"
-                value: "6452"
-              - name: "UserStatus"
-                value: 1
-              - name: "UserType"
-                value: 0
-              - name: "CredentialRule"
-                value: 0
-
-    - label:
-          "Step 11: TH sends Set Credential Command to DUT with the following
-          fields: a)OperationType as 0 b)Credential as 1 1 c)CredentialData as
-          123456 d)UserIndex as 2 e)UserStatus as null f)UserType as null"
-      PICS: DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx
-      command: "SetCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "OperationType"
-                value: 0
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-              - name: "CredentialData"
-                value: "123456"
-              - name: "UserIndex"
-                value: 2
-              - name: "UserStatus"
-                value: null
-              - name: "UserType"
-                value: null
-      response:
-          values:
-              - name: "Status"
-                value: 0
-              - name: "UserIndex"
-                value: null
-
-    - label:
-          "Step 12a: TH sends Clear Credential Command to DUT with the following
-          fields: a)CredentialType as 1 b)CredentialIndex as 0xFFFE"
-      PICS: DRLK.S.F08 && DRLK.S.C26.Rsp
-      command: "ClearCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 65534 }
-
-    - label:
-          "Step 12b: TH sends Get Credential command to DUT with the following
-          fields: a)CredentialType as 1 b)CredentialIndex as 0xFFFE"
-      PICS: DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
-      command: "GetCredentialStatus"
-      arguments:
-          values:
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 65534 }
-      response:
-          values:
-              - name: "CredentialExists"
-                value: false
-              - name: "UserIndex"
-                value: null
-              - name: "CreatorFabricIndex"
-                value: null
-              - name: "LastModifiedFabricIndex"
-                value: null
-              - name: "NextCredentialIndex"
-                value: null
-
-    - label:
-          "Step 13: TH sends Get Credential Status Command with a)CredentialType
-          as 1 b)CredentialIndex as 1"
-      PICS: DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
-      command: "GetCredentialStatus"
-      arguments:
-          values:
-              - name: "Credential"
-                value: { CredentialType: 1, CredentialIndex: 1 }
-      response:
-          values:
-              - name: "CredentialExists"
-                value: false
-              - name: "UserIndex"
-                value: null
-              - name: "CreatorFabricIndex"
-                value: null
-              - name: "LastModifiedFabricIndex"
-                value: null
-              - name: "NextCredentialIndex"
-                value: null
-
-    - label:
-          "Step 14: TH sends Clear Credential Command to DUT with the following
-          fields: a)CredentialType as 8(Invalid value) b)CredentialIndex as 2"
-      PICS: DRLK.S.F08 && DRLK.S.C26.Rsp && !DRLK.S.F0d
-      command: "ClearCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "Credential"
-                value: { CredentialType: 8, CredentialIndex: 2 }
-      response:
-          error: INVALID_COMMAND
-
-    - label:
-          "Step 14: TH sends Clear Credential Command to DUT with the following
-          fields: a)CredentialType as 9(Invalid value) b)CredentialIndex as 2"
-      PICS: DRLK.S.F08 && DRLK.S.C26.Rsp && DRLK.S.F0d
-      command: "ClearCredential"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "Credential"
-                value: { CredentialType: 9, CredentialIndex: 2 }
-      response:
-          error: INVALID_COMMAND
-
-    - label: "Cleanup the first created user"
-      command: "ClearUser"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "UserIndex"
-                value: 1
-
-    - label: "Cleanup the second created user"
-      command: "ClearUser"
-      timedInteractionTimeoutMs: 10000
-      arguments:
-          values:
-              - name: "UserIndex"
-                value: 2
diff --git a/src/python_testing/TC_DRLK_2_5.py b/src/python_testing/TC_DRLK_2_5.py
new file mode 100644
index 0000000..a43067b
--- /dev/null
+++ b/src/python_testing/TC_DRLK_2_5.py
@@ -0,0 +1,392 @@
+#
+#    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.interaction_model import InteractionModelError, Status
+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_5(MatterBaseTest):
+
+    def steps_TC_DRLK_2_5(self) -> list[TestStep]:
+        steps = [
+
+
+            TestStep("1", "TH reads NumberOfWeekDaySchedulesSupportedPerUser attribute.",
+                     "Verify that TH is able to read the attribute successfully."),
+            TestStep("2a", "TH sends SetUser Command to DUT.", "Verify that the DUT sends SUCCESS response."),
+            TestStep("2b", "TH sends SetWeekDaySchedule Command to DUT.", "Verify that the DUT sends SUCCESS response."),
+            TestStep("2c", "TH sends SetWeekDaySchedule to DUT with different DaysMaskMap.",
+                     "Verify that the DUT sends SUCCESS response."),
+            TestStep("3", "TH sends GetWeekDaySchedule Command to DUT.",
+                     "Verify that the DUT sends GetWeekDayScheduleResponse command with expected values."),
+            TestStep("4", "TH sends SetWeekDaySchedule Command to DUT.",
+                     "Verify that the DUT responds with INVALID_COMMAND."),
+            TestStep("5", "TH sends SetWeekDaySchedule Command to DUT.",
+                     "Verify that the DUT responds with INVALID_COMMAND."),
+            TestStep("6", "TH sends SetWeekDaySchedule Command to DUT.",
+                     "Verify that the DUT responds with INVALID_COMMAND."),
+            TestStep("7", "TH sends SetWeekDaySchedule Command to DUT.",
+                     "Verify that the DUT responds with INVALID_COMMAND."),
+            TestStep("8", "TH sends GetWeekDaySchedule Command to DUT.",
+                     "Verify that the DUT responds with with INVALID_COMMAND."),
+            TestStep("9", "TH sends GetWeekDaySchedule Command to DUT.",
+                     "Verify that the DUT responds with GetWeekDayScheduleResponse command with Status NOT_FOUND."),
+            TestStep("10a", "TH sends ClearWeekDaySchedule Command to DUT.", "Verify that the DUT sends SUCCESS response."),
+            TestStep("10b", "TH sends ClearWeekDaySchedule Command to DUT.", "Verify that the DUT sends INVALID_COMMAND response."),
+            TestStep("10c", "TH sends ClearWeekDaySchedule Command to DUT.", "Verify that the DUT sends INVALID_COMMAND response."),
+            TestStep("11", "TH sends GetWeekDaySchedule Command to DUT.", "Verify that the DUT sends NOT_FOUND response."),
+            TestStep("12", "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)
+            logging.info("Error reading attributes,%s" % (attribute))
+
+    def pics_TC_DRLK_2_5(self) -> list[str]:
+        return ["DRLK.S", "DRLK.S.F04"]
+
+    async def 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 clear_week_day_schedule_cmd(self, week_day_index, user_index, expected_status):
+        try:
+            await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.ClearWeekDaySchedule(weekDayIndex=week_day_index, userIndex=user_index),
+                                       endpoint=self.app_cluster_endpoint,
+                                       timedRequestTimeoutMs=1000)
+        except InteractionModelError as e:
+            asserts.assert_equal(e.status, expected_status, f"Unexpected error returned: {e}")
+
+    async def get_weekday_schedule_cmd(self,  week_day_index, user_index, days_Mask, start_Hour, start_Minute, end_Hour, end_Minute, expected_status):
+
+        try:
+
+            response = await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.GetWeekDaySchedule(
+                weekDayIndex=week_day_index, userIndex=user_index),
+                endpoint=self.app_cluster_endpoint,
+                timedRequestTimeoutMs=1000)
+            asserts.assert_true(type_matches(response, Clusters.DoorLock.Commands.GetWeekDayScheduleResponse),
+                                "Unexpected return type for GetWeekDayScheduleResponse")
+
+            if (expected_status == Status.Success):
+
+                asserts.assert_true(response.weekDayIndex == week_day_index,
+                                    "Error when executing GetWeekDayScheduleResponse command, weekDayIndex={}".format(
+                                        str(response.weekDayIndex)))
+                asserts.assert_true(response.userIndex == user_index,
+                                    "Error when executing GetWeekDayScheduleResponse command, userIndex={}".format(
+                                        str(response.userIndex)))
+
+                asserts.assert_true(response.daysMask == days_Mask,
+                                    "Error when executing GetWeekDayScheduleResponse command, days_Mask={}".format(
+                                        str(response.daysMask)))
+                asserts.assert_true(response.startHour == start_Hour,
+                                    "Error when executing GetWeekDayScheduleResponse command, startHour={}".format(
+                                        str(response.startHour)))
+                asserts.assert_true(response.startMinute == start_Minute,
+                                    "Error when executing GetWeekDayScheduleResponse command, startMinute={}".format(
+                                        str(response.startMinute)))
+                asserts.assert_true(response.endHour == end_Hour,
+                                    "Error when executing GetWeekDayScheduleResponse command, endHour={}".format(
+                                        str(response.endHour)))
+                asserts.assert_true(response.endMinute == end_Minute,
+                                    "Error when executing GetWeekDayScheduleResponse command, endMinute={}".format(
+                                        str(response.endMinute)))
+
+            return response
+        except InteractionModelError as e:
+            logging.error(e)
+            asserts.assert_equal(e.status, expected_status, f"Unexpected error returned: {e}")
+
+    async def set_week_days_schedule_cmd(self, week_day_index, user_index, day_mask_map_index, start_Hour, start_Minute, end_Hour, end_Minute, expected_status):
+        try:
+
+            await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.SetWeekDaySchedule(
+                weekDayIndex=week_day_index,
+                userIndex=user_index,
+                daysMask=day_mask_map_index,
+                startHour=start_Hour,
+                startMinute=start_Minute,
+                endHour=end_Hour,
+                endMinute=end_Minute),
+                endpoint=self.app_cluster_endpoint,
+                timedRequestTimeoutMs=1000)
+        except InteractionModelError as e:
+            logging.error(e)
+            asserts.assert_equal(e.status, expected_status, 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_5(self):
+
+        self.common_cluster_endpoint = 0
+        self.app_cluster_endpoint = 1
+        user_name = "xxx"
+        user_index = 1
+        user_unique_id = 6452
+        week_day_index = 1
+        day_mask_map_index = 1
+        start_Hour = 15
+        start_Minute = 45
+        end_Hour = 16
+        end_Minute = 55
+
+        self.step("1")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.A0014")):
+            number_week_day_schedules_supported_per_user = await self.read_attributes_from_dut(endpoint=self.app_cluster_endpoint,
+                                                                                               cluster=drlkcluster,
+                                                                                               attribute=Clusters.DoorLock.Attributes.NumberOfWeekDaySchedulesSupportedPerUser)
+            logging.info("NumberOfWeekDaySchedulesSupportedPerUser %s" % (number_week_day_schedules_supported_per_user))
+            asserts.assert_in(number_week_day_schedules_supported_per_user, range(
+                0, 255), "NumberOfWeekDaySchedulesSupportedPerUser value is out of range")
+        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=user_index,
+                    userName=user_name,
+                    userUniqueID=user_unique_id,
+                    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.F04") and self.check_pics("DRLK.S.C0b.Rsp")):
+            try:
+                await self.set_week_days_schedule_cmd(
+                    week_day_index,
+                    user_index,
+                    day_mask_map_index,
+                    start_Hour,
+                    start_Minute,
+                    end_Hour,
+                    end_Minute,
+                    Status.Success)
+
+            except InteractionModelError as e:
+                logging.exception(e)
+        self.step("2c")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0b.Rsp")):
+            try:
+                days_masks_map = [2, 4, 8, 16, 32, 64, 24, 42, 51, 107, 123, 127]
+                for day_mask_map_index in days_masks_map:
+                    await self.set_week_days_schedule_cmd(
+                        week_day_index,
+                        user_index,
+                        day_mask_map_index,
+                        start_Hour,
+                        start_Minute,
+                        end_Hour,
+                        end_Minute,
+                        Status.Success)
+            except InteractionModelError as e:
+                logging.exception(e)
+
+        self.step("3")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0c.Rsp") and self.check_pics("DRLK.S.C0c.Tx")):
+            day_mask_map_index = 127
+            await self.get_weekday_schedule_cmd(
+                week_day_index,
+                user_index,
+                day_mask_map_index,
+                start_Hour,
+                start_Minute,
+                end_Hour,
+                end_Minute,
+                Status.Success)
+        self.step("4")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0b.Rsp")):
+            week_day_index = 0
+            day_mask_map_index = 2
+            await self.set_week_days_schedule_cmd(
+                week_day_index,
+                user_index,
+                day_mask_map_index,
+                start_Hour,
+                start_Minute,
+                end_Hour,
+                end_Minute,
+                Status.InvalidCommand)
+        self.step("5")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0b.Rsp")):
+            week_day_index = 1  # Valid value
+            day_mask_map_index = 0  # invalid value
+            await self.set_week_days_schedule_cmd(
+                week_day_index,
+                user_index,
+                day_mask_map_index,
+                start_Hour,
+                start_Minute,
+                end_Hour,
+                end_Minute,
+                Status.InvalidCommand)
+        self.step("6")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0b.Rsp")):
+            week_day_index = 1  # valid value
+            day_mask_map_index = 128  # invalid value
+            await self.set_week_days_schedule_cmd(
+                week_day_index,
+                user_index,
+                day_mask_map_index,
+                start_Hour,
+                start_Minute,
+                end_Hour,
+                end_Minute,
+                Status.InvalidCommand)
+
+        self.step("7")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0b.Rsp")):
+            week_day_index = 1  # valid value
+            day_mask_map_index = 1  # valid value
+            start_Hour = 18  # inavlid value > end hour
+            await self.set_week_days_schedule_cmd(
+                week_day_index,
+                user_index,
+                day_mask_map_index,
+                start_Hour,
+                start_Minute,
+                end_Hour,
+                end_Minute,
+                Status.InvalidCommand)
+
+        self.step("8")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0c.Rsp") and self.check_pics("DRLK.S.C0c.Tx")):
+            week_day_index = 0
+            user_index = 1
+            await self.get_weekday_schedule_cmd(
+                week_day_index,
+                user_index,
+                day_mask_map_index,
+                start_Hour,
+                start_Minute,
+                end_Hour,
+                end_Minute,
+                Status.InvalidCommand)
+        self.step("9")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0c.Rsp") and self.check_pics("DRLK.S.C0c.Tx")):
+            week_day_index = 1
+            user_index = 2  # invalid value as it does not exist
+            await self.get_weekday_schedule_cmd(
+                week_day_index,
+                user_index,
+                day_mask_map_index,
+                start_Hour,
+                start_Minute,
+                end_Hour,
+                end_Minute,
+                Status.NotFound)
+        self.step("10a")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0d.Rsp")):
+            week_day_index = 1
+            user_index = 1
+            await self.clear_week_day_schedule_cmd(week_day_index,
+                                                   user_index,
+                                                   Status.Success)
+
+        self.step("10b")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0d.Rsp")):
+            week_day_index = 0
+            user_index = 1
+            try:
+                await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.ClearWeekDaySchedule(week_day_index, user_index),
+                                           endpoint=self.app_cluster_endpoint,
+                                           timedRequestTimeoutMs=1000)
+                asserts.fail("Unexpected success in sending ClearWeekDaySchedule Command  with invalid week_day_index")
+
+            except InteractionModelError as e:
+                asserts.assert_equal(e.status, Status.InvalidCommand,
+                                     "Unexpected error sending ClearWeekDaySchedule Command  with invalid week_day_index")
+        self.step("10c")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0d.Rsp")):
+            week_day_index = 1
+            user_index = 0
+
+            try:
+                await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.ClearWeekDaySchedule(week_day_index, user_index),
+                                           endpoint=self.app_cluster_endpoint,
+                                           timedRequestTimeoutMs=1000)
+                asserts.fail("Unexpected success in sending ClearWeekDaySchedule Command  with invalid week_day_index")
+
+            except InteractionModelError as e:
+                asserts.assert_equal(e.status, Status.InvalidCommand,
+                                     "Unexpected error sending ClearWeekDaySchedule Command  with invalid week_day_index")
+
+        self.step("11")
+        if self.pics_guard(self.check_pics("DRLK.S.F04") and self.check_pics("DRLK.S.C0c.Rsp") and self.check_pics("DRLK.S.C0c.Tx")):
+            user_index = 1  # invalid value as it is cleared
+            await self.get_weekday_schedule_cmd(
+                week_day_index,
+                user_index,
+                day_mask_map_index,
+                start_Hour,
+                start_Minute,
+                end_Hour,
+                end_Minute,
+                Status.NotFound)
+        self.step("12")
+        if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C1d.Rsp")):
+            await self.clear_user_cmd(user_index)
+
+
+if __name__ == '__main__':
+    default_matter_test_main()
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 0000000..954ca7d
--- /dev/null
+++ b/src/python_testing/TC_DRLK_2_9.py
@@ -0,0 +1,799 @@
+#
+#    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 random
+import string
+
+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 the DUT sends SUCCESS response"),
+            TestStep("2b", "TH reads MinPINCodeLength attribute .",
+                     "Verify that TH is able to read the attribute successfully and value is within range."),
+            TestStep("2c", "TH reads MaxPINCodeLength attribute.",
+                     "Verify that TH is able to read the attribute successfully and value is within range."),
+            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 and value is within range."),
+            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("14d", "TH reads NumberOfPINUsersSupported attribute.",
+                     "Verify that TH is able to read the attribute successfully and value is within range."),
+            TestStep("15a", "TH reads NumberOfCredentialsSupportedPerUser attribute from DUT.",
+                     "Verify that TH is able to read the attribute successfully and value is within range."),
+            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("15f", "TH sends ClearUser Command to DUT with UserIndex as 0xFFFE to clear all the users.",
+                     "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 to clear all the users.",
+                     "Verify that the DUT sends SUCCESS response."),
+            TestStep("24", "TH sends SetUser Command to DUT.",
+                     "Verify that the DUT sends SUCCESS response."),
+            TestStep("25", "TH sends ClearAliroReaderConfig Command to DUT.",
+                     "Verify that the DUT sends SUCCESS response."),
+            TestStep("26", ",TH sends SetAliroReaderConfig Command to DUT without GroupResolvingKey.",
+                     "Verify that DUT sends success response."),
+            TestStep("27", ",TH sends SetAliroReaderConfig Command to DUT with GroupResolvingKey.",
+                     "Verify that DUT sends success response."),
+            TestStep("28", "TH sends SetCredential Command CredentialType as AliroEvictableEndpointKey.",
+                     "Verify that the DUT responds with SetCredentialResponse commad with status success "),
+            TestStep("29", "TH sends SetCredential Command to DUT with CredentialType.PIN.",
+                     "Verify that the DUT sends SetCredentialResponse command  with Status SUCCESS."),
+            TestStep("30", "TH sends GetUser Command to DUT.",
+                     "Verify that the DUT sends SUCCESS response."),
+            TestStep("31", "TH sends SetCredential Command to modify PIN CredentialType",
+                     "Verify that the DUT responds with SetCredentialResponse command with status success "),
+            TestStep("32", "TH sends GetUser Command to DUT.",
+                     "Verify that the DUT sends SUCCESS response."),
+            TestStep("33", "TH sends SetCredential Command to modify AliroEvictableEndpointKey CredentialType",
+                     "Verify that the DUT responds with SetCredentialResponse command with status success "),
+            TestStep("34", "TH sends GetUser Command to DUT.",
+                     "Verify that the DUT sends SUCCESS response."),
+            TestStep("35", "TH sends ClearUser Command to DUT.",
+                     "Verify that the DUT sends SUCCESS response."),
+            TestStep("36", "TH sends ClearCredential Command to DUT to clear all the credentials.",
+                     "Verify that the DUT sends SUCCESS response."),
+            TestStep("37", "TH sends ClearAliroReaderConfig 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_max_pincode_len(self, maxPincodeLength):
+        return ''.join(random.choices(string.digits, k=maxPincodeLength))
+
+    async def generate_code(self):
+        if (self.maxpincodelength is not None):
+            validpincodestr = await self.generate_max_pincode_len(self.maxpincodelength)
+            self.pin_code = bytes(validpincodestr, 'ascii')
+            validpincodestr = await self.generate_max_pincode_len(self.maxpincodelength)
+            self.pin_code1 = bytes(validpincodestr, 'ascii')
+            validpincodestr = await self.generate_max_pincode_len(self.maxpincodelength)
+            self.pin_code2 = bytes(validpincodestr, 'ascii')
+            inavlidpincodestr = await self.generate_max_pincode_len(self.maxpincodelength+1)
+            self.inavlid_pincode = bytes(inavlidpincodestr, 'ascii')
+        if (self.maxrfidcodelength is not None):
+            validpincodestr = await self.generate_max_pincode_len(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, userIndex={}".format(
+                                    str(response.userIndex)))
+            asserts.assert_true(response.userName == username,
+                                "Error when executing GetUserResponse command, userName={}".format(
+                                    str(response.userName)))
+            asserts.assert_true(response.userUniqueID == useruniqueid,
+                                "Error when executing GetUserResponse command, userUniqueID={}".format(
+                                    str(response.userUniqueID)))
+            logging.info("Credentials value is GetUserResponse Command %s" % (str(response.credentials)))
+
+            asserts.assert_equal(len(credentiallist), len(response.credentials),  "Error mismatch in expected credential from GetUserResponse command = {}".format(
+                str(credentiallist)))
+            # traverse through input credentials and match each value with the resonse credential
+            for input_credential_index in range(len(credentiallist)):
+                match_found = False
+                for response_credential_index in range(len(response.credentials)):
+                    if (response.credentials[response_credential_index] == credentiallist[input_credential_index]):
+                        match_found = True
+                        break
+                asserts.assert_equal(match_found, True,  "Error mismatch in expected credential from GetUserResponse command = {}".format(
+                    str(credentiallist)))
+
+        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, credential_exists, next_credential_index):
+
+        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, userIndex={}".format(
+                                        str(response.userIndex)))
+            asserts.assert_true(response.nextCredentialIndex == next_credential_index,
+                                "Error when executing GetCredentialStatus command, nextCredentialIndex={}".format(
+                                    str(response.nextCredentialIndex)))
+            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_status_code = 149
+
+        credentials = drlkcluster.Structs.CredentialStruct(
+            credentialType=credential_enum,
+            credentialIndex=credentialIndex)
+        try:
+
+            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")
+            asserts.assert_equal(response.userIndex, NullValue)
+            if (statuscode != custom_status_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)))
+            return response.nextCredentialIndex
+        except InteractionModelError as e:
+            logging.exception(e)
+            asserts.assert_equal(e.status, statuscode, f"Unexpected error returned: {e}")
+            return -1
+
+    async def clear_credentials_cmd(self, credential, 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 def send_clear_aliro_reader_config_cmd(self, expected_status: Status = Status.Success):
+        try:
+            await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.ClearAliroReaderConfig(),
+                                       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 send_set_aliro_reader_config_cmd(self, use_group_resolving_key: bool,
+                                               expected_status: Status = Status.Success):
+        try:
+
+            signingKey = bytes.fromhex("89d085fc302ca53e279bfcdecdf3c4adb2f5d9bc9ea6c49e9566d144367df3ff")
+            verificationKey = bytes.fromhex(
+                "047a4c992d753924cdf3779a3c84fec2debaa6f0b3084450878acc7ddcce7856ae57b1ebbe2561015103dd7474c2a183675378ec55f1e465ac3436bf3dd5ca54d4")
+            groupIdentifier = bytes.fromhex("89d085fc302ca53e279bfcdecdf3c4ad")
+            groupResolvingKey = bytes.fromhex("89d0859bfcdecdf3c4adfc302ca53e27")
+
+            # Checks Pics condition
+            if use_group_resolving_key is False:
+                pics_check = self.pics_guard(self.check_pics("DRLK.S.F0d") and not self.check_pics("DRLK.S.F0e") and
+                                             self.check_pics("DRLK.S.C28.Rsp"))
+            else:
+                pics_check = self.pics_guard(self.check_pics("DRLK.S.F0e") and self.check_pics("DRLK.S.C28.Rsp"))
+
+            if not use_group_resolving_key and pics_check:
+                await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.SetAliroReaderConfig(
+                    signingKey=signingKey,
+                    verificationKey=verificationKey,
+                    groupIdentifier=groupIdentifier),
+                    endpoint=self.app_cluster_endpoint,
+                    timedRequestTimeoutMs=1000)
+                asserts.assert_equal(expected_status, Status.Success)
+            elif use_group_resolving_key and pics_check:
+                await self.send_single_cmd(cmd=Clusters.DoorLock.Commands.SetAliroReaderConfig(
+                    signingKey=signingKey,
+                    verificationKey=verificationKey,
+                    groupIdentifier=groupIdentifier,
+                    groupResolvingKey=groupResolvingKey),
+                    endpoint=self.app_cluster_endpoint,
+                    timedRequestTimeoutMs=1000)
+                asserts.assert_equal(expected_status, Status.Success)
+        except InteractionModelError as e:
+            logging.exception(f"Got exception when performing SetAliroReaderConfig {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
+        numberofcredentialsupportedperuser = None
+        self.app_cluster_endpoint = 1
+        invalid_credential_type = 9
+        user_unique_id = 6459
+        user_name = "xxx"
+        credentialIndex_1 = 1
+        credentialIndex_2 = 2
+        credentialIndex_3 = 3
+        userIndex_1 = 1
+        userIndex_2 = 2
+        invalid_user_status = 5
+        invalid_user_type = 10
+
+        self.pin_code = b""
+        self.pin_code1 = b""
+        self.pin_code2 = b""
+        self.inavlid_pincode = b""
+        self.rfid_tag = b""
+
+        self.minpincodelength = None
+        self.maxpincodelength = None
+        self.maxrfidcodelength = None
+        self.minrfidcodelength = None
+
+        self.endpoint = self.user_params.get("endpoint", 1)
+        print("endpoint", self.endpoint)
+
+        # Aliro Keys for setting Aliro configuration and credential
+
+        aliroevictableendpointkey1 = bytes.fromhex(
+            "047a4c772d753924cdf3779a3c84fec2debaa6f0b3084450878acc7ddcce7856ae57b1ebbe2561015103dd7474c2a183675378ec55f1e465ac3436bf3dd5ca54d4")
+
+        aliroevictableendpointkey2 = bytes.fromhex(
+            "047a4c662d753924cdf3779a3c84fec2debaa6f0b3084450878acc7ddcce7856ae57b1ebbe2561015103dd7474c2a183675378ec55f1e465ac3436bf3dd5ca54d4")
+
+        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)
+            asserts.assert_in(self.numberoftotaluserssupported, range(
+                0, 65534), "NumberOfTotalUsersSupported value is out of range")
+        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=userIndex_1,
+                    userName=user_name,
+                    userUniqueID=user_unique_id,
+                    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)
+            asserts.assert_in(self.minpincodelength, range(
+                0, 255), "MinPINCodeLength value is out of range")
+        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)
+            asserts.assert_in(self.maxpincodelength, range(
+                0, 255), "MaxPINCodeLength value is out of range")
+        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)
+            asserts.assert_in(self.minrfidcodelength, range(
+                0, 255), "MinRFIDCodeLength value is out of range")
+        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)
+            asserts.assert_in(self.maxrfidcodelength, range(
+                0, 255), "MaxRFIDCodeLength value is out of range")
+        self.step("2f")
+        await self.generate_code()
+        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")):
+
+            await self.set_credential_cmd(credentialData=self.pin_code,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_1, userIndex=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=credentialIndex_1,
+                                              credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin, credential_exists=True, next_credential_index=NullValue)
+        self.step("4")
+        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")):
+
+            await self.set_credential_cmd(credentialData=self.inavlid_pincode,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_2, userIndex=NullValue, userStatus=invalid_user_status, userType=invalid_user_type, statuscode=Status.InvalidCommand)
+        self.step("5")
+        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")):
+            await self.set_credential_cmd(credentialData=self.pin_code,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_2, userIndex=NullValue, userStatus=NullValue, userType=NullValue, statuscode=2)
+
+        self.step("6a")
+        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")):
+            await self.set_credential_cmd(credentialData=self.pin_code,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_1, userIndex=NullValue, userStatus=NullValue, userType=NullValue, statuscode=149)
+        self.step("6b")
+        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")):
+            await self.set_credential_cmd(credentialData=self.pin_code1,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_1, userIndex=NullValue, userStatus=NullValue, userType=NullValue, statuscode=149)
+        self.step("7")
+        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")):
+            await self.set_credential_cmd(credentialData=self.pin_code2,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kModify,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_3, userIndex=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(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=credentialIndex_1,
+                                              credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin, credential_exists=False, next_credential_index=NullValue)
+        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=userIndex_2,
+                    userName=user_name,
+                    userUniqueID=user_unique_id,
+                    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_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")):
+            await self.set_credential_cmd(credentialData=self.pin_code,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_1, userIndex=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(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=credentialIndex_1,
+                                              credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin, credential_exists=False, next_credential_index=NullValue)
+        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
+            credentials = drlkcluster.Structs.CredentialStruct(credentialIndex=credentialIndex_1,
+                                                               credentialType=drlkcluster.Enums.CredentialTypeEnum.kAliroNonEvictableEndpointKey)
+            if (aliro_enabled):
+
+                await self.clear_credentials_cmd(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=credentialIndex_1,
+                                                               credentialType=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(user_index=int(0xFFFE))
+
+        self.step("14d")
+        if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.A0012")):
+            num_pin_users_supported = await self.read_attributes_from_dut(endpoint=self.app_cluster_endpoint,
+                                                                          cluster=drlkcluster,
+                                                                          attribute=Clusters.DoorLock.Attributes.NumberOfPINUsersSupported)
+            asserts.assert_in(num_pin_users_supported, range(
+                0, 65534), "NumberOfPINUsersSupported value is out of range")
+        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)
+        asserts.assert_in(numberofcredentialsupportedperuser, range(
+            0, 255), "NumberOfCredentialsSupportedPerUser value is out of range")
+        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=userIndex_1,
+                    userName=user_name,
+                    userUniqueID=user_unique_id,
+                    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_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")):
+            if (numberofcredentialsupportedperuser < num_pin_users_supported):
+                logging.info("setting 'start_credential_index' to value 1 ")
+                start_credential_index = 1
+                nextCredentialIndex = 1
+                while 1:
+                    uniquePincodeString = await self.generate_max_pincode_len(self.maxpincodelength)
+                    uniquePincode = bytes(uniquePincodeString, 'ascii')
+                    logging.info("Credential Data value is %s" % (uniquePincode))
+                    if start_credential_index <= (numberofcredentialsupportedperuser):
+                        nextCredentialIndex = await self.set_credential_cmd(credentialData=uniquePincode,
+                                                                            operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                                                            credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+
+                                                                            credentialIndex=start_credential_index, userIndex=userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success)
+                        logging.info(f"The updated value of nextCredentialIndex is {nextCredentialIndex}")
+                        start_credential_index += 1
+                        asserts.assert_true(nextCredentialIndex == start_credential_index,
+                                            "Error mismatch in expected nextCredentialIndex={}".format(str(nextCredentialIndex)))
+                        logging.info(f"The updated value of start_credential_index is {start_credential_index}")
+                    else:
+                        break
+        self.step("15d")
+        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")):
+            if (numberofcredentialsupportedperuser < num_pin_users_supported):
+                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=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(credential=credentials)
+        self.step("15f")
+        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=int(0xFFFE))
+
+        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=userIndex_1,
+                    userName=user_name,
+                    userUniqueID=user_unique_id,
+                    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_guard(self.check_pics("DRLK.S.F01") and self.check_pics("DRLK.S.C22.Rsp")
+                           and self.check_pics("DRLK.S.C23.Tx")):
+            await self.set_credential_cmd(credentialData=self.rfid_tag,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kRfid,
+                                          credentialIndex=credentialIndex_1, userIndex=userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success)
+        self.step("18")
+        if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.C22.Rsp") and self.check_pics("DRLK.S.C23.Tx")):
+            await self.set_credential_cmd(credentialData=self.pin_code,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_1, userIndex=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=credentialIndex_1,
+                                                                   credentialType=drlkcluster.Enums.CredentialTypeEnum.kRfid),
+                              drlkcluster.Structs.CredentialStruct(credentialIndex=credentialIndex_1,
+                                                                   credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin)]
+            await self.get_user(userIndex_1, user_name, user_unique_id, credentiallist, Status.Success)
+
+        self.step("20")
+        if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.C22.Rsp") and self.check_pics("DRLK.S.C23.Tx")):
+            await self.set_credential_cmd(credentialData=self.pin_code1,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kModify,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_1, userIndex=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(userIndex_1, user_name, user_unique_id, 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(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(userIndex_1)
+
+        self.step("24")
+        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=userIndex_1,
+                    userName=user_name,
+                    userUniqueID=user_unique_id,
+                    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("25")
+        if self.check_pics("DRLK.S.C29.Rsp"):
+            await self.send_clear_aliro_reader_config_cmd()
+
+        self.step("26")
+        await self.send_set_aliro_reader_config_cmd(use_group_resolving_key=False, expected_status=Status.Success)
+        self.step("27")
+        await self.send_set_aliro_reader_config_cmd(use_group_resolving_key=True, expected_status=Status.Success)
+
+        self.step("28")
+        if self.pics_guard(self.check_pics("DRLK.S.F0d")
+                           and self.check_pics("DRLK.S.C22.Rsp") and self.check_pics("DRLK.S.C23.Tx")):
+            await self.set_credential_cmd(credentialData=aliroevictableendpointkey1,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kAliroEvictableEndpointKey,
+                                          credentialIndex=credentialIndex_1, userIndex=userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success)
+
+        self.step("29")
+        if self.pics_guard(self.check_pics("DRLK.S.F00")
+                           and self.check_pics("DRLK.S.C22.Rsp") and self.check_pics("DRLK.S.C23.Tx")):
+            await self.set_credential_cmd(credentialData=self.pin_code,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kAdd,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_1, userIndex=userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success)
+        self.step("30")
+        if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F0d") and self.check_pics("DRLK.S.C1b.Rsp")):
+
+            credentiallist: list[drlkcluster.Structs.CredentialStruct]
+            credentiallist = [drlkcluster.Structs.CredentialStruct(credentialIndex=credentialIndex_1,
+                                                                   credentialType=drlkcluster.Enums.CredentialTypeEnum.kAliroEvictableEndpointKey),
+                              drlkcluster.Structs.CredentialStruct(credentialIndex=credentialIndex_1,
+                                                                   credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin)]
+            await self.get_user(userIndex_1, user_name, user_unique_id, credentiallist, Status.Success)
+        self.step("31")
+        if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.C22.Rsp") and self.check_pics("DRLK.S.C23.Tx")):
+            await self.set_credential_cmd(credentialData=self.pin_code2,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kModify,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kPin,
+                                          credentialIndex=credentialIndex_1, userIndex=userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success)
+
+        self.step("32")
+        if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F0d") and self.check_pics("DRLK.S.C1b.Rsp")):
+
+            credentiallist: list[drlkcluster.Structs.CredentialStruct]
+            credentiallist = [drlkcluster.Structs.CredentialStruct(credentialIndex=credentialIndex_1,
+                                                                   credentialType=drlkcluster.Enums.CredentialTypeEnum.kAliroEvictableEndpointKey),
+                              drlkcluster.Structs.CredentialStruct(credentialIndex=credentialIndex_1,
+                                                                   credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin)]
+            await self.get_user(userIndex_1, user_name, user_unique_id, credentiallist, Status.Success)
+        self.step("33")
+        if self.pics_guard(self.check_pics("DRLK.S.F0d") and self.check_pics("DRLK.S.C22.Rsp") and self.check_pics("DRLK.S.C23.Tx")):
+            await self.set_credential_cmd(credentialData=aliroevictableendpointkey2,
+                                          operationType=drlkcluster.Enums.DataOperationTypeEnum.kModify,
+                                          credential_enum=drlkcluster.Enums.CredentialTypeEnum.kAliroEvictableEndpointKey,
+                                          credentialIndex=credentialIndex_1, userIndex=userIndex_1, userStatus=NullValue, userType=NullValue, statuscode=Status.Success)
+        self.step("34")
+        if self.pics_guard(self.check_pics("DRLK.S.F00") and self.check_pics("DRLK.S.F0d") and self.check_pics("DRLK.S.C1b.Rsp")):
+
+            credentiallist: list[drlkcluster.Structs.CredentialStruct]
+            credentiallist = [drlkcluster.Structs.CredentialStruct(credentialIndex=credentialIndex_1,
+                                                                   credentialType=drlkcluster.Enums.CredentialTypeEnum.kAliroEvictableEndpointKey),
+                              drlkcluster.Structs.CredentialStruct(credentialIndex=credentialIndex_1,
+                                                                   credentialType=drlkcluster.Enums.CredentialTypeEnum.kPin)]
+            await self.get_user(userIndex_1, user_name, user_unique_id, credentiallist, Status.Success)
+
+        self.step("35")
+        if self.pics_guard(self.check_pics("DRLK.S.F08") and self.check_pics("DRLK.S.C1d.Rsp")):
+            await self.send_clear_user_cmd(userIndex_1)
+
+        self.step("36")
+        if self.pics_guard(self.check_pics("DRLK.S.C26.Rsp")):
+            await self.clear_credentials_cmd(credential=NullValue)
+
+        self.step("37")
+        if self.pics_guard(self.check_pics("DRLK.S.C29.Rsp")):
+            await self.send_clear_aliro_reader_config_cmd()
+
+
+if __name__ == '__main__':
+    default_matter_test_main()