Add new Door Lock Multi credential management test to CI. (#24671)
* Add new Door Lock Multi credential management test to CI.
* Update to reflect test plan PR changes.
diff --git a/src/app/tests/suites/certification/Test_TC_DRLK_2_11.yaml b/src/app/tests/suites/certification/Test_TC_DRLK_2_11.yaml
new file mode 100644
index 0000000..603f6df
--- /dev/null
+++ b/src/app/tests/suites/certification/Test_TC_DRLK_2_11.yaml
@@ -0,0 +1,387 @@
+# Copyright (c) 2023 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.11. [TC-DRLK-2.11] Verification for multiple credential types
+ [DUT-Server]
+
+PICS:
+ - DRLK.S
+ - DRLK.S.F00
+ - DRLK.S.F02
+ - DRLK.S.F03
+
+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: "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: "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: null
+ - name: "CreatorFabricIndex"
+ value: 1
+ - name: "LastModifiedFabricIndex"
+ value: 1
+ - name: "NextUserIndex"
+ value: null
+
+ - label: "TH sends Set Credential Command to DUT with type PIN"
+ PICS: DRLK.S.F00 && 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: "TH sends Set Credential Command to DUT with type RFID"
+ PICS: DRLK.S.F01 && 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: 2, CredentialIndex: 1 }
+ - name: "CredentialData"
+ value: "RFIDTESTDATA"
+ - 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: "TH sends Set Credential Command to DUT with type FingerVein"
+ PICS: DRLK.S.F02 && 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: 4, 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: "TH sends Get Credential Status Command with type PIN"
+ PICS: DRLK.S.F00 && 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: true
+ constraints:
+ type: boolean
+ - name: "UserIndex"
+ value: 1
+ - name: "CreatorFabricIndex"
+ value: 1
+ - name: "LastModifiedFabricIndex"
+ value: 1
+ - name: "NextCredentialIndex"
+ value: null
+
+ - label: "TH sends Get Credential Status Command with type RFID"
+ PICS: DRLK.S.F01 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
+ command: "GetCredentialStatus"
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 2, CredentialIndex: 1 }
+ response:
+ values:
+ - name: "CredentialExists"
+ value: true
+ constraints:
+ type: boolean
+ - name: "UserIndex"
+ value: 1
+ - name: "CreatorFabricIndex"
+ value: 1
+ - name: "LastModifiedFabricIndex"
+ value: 1
+ - name: "NextCredentialIndex"
+ value: null
+
+ - label: "TH sends Get Credential Status Command with type FingerVein"
+ PICS: DRLK.S.F02 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
+ command: "GetCredentialStatus"
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 4, CredentialIndex: 1 }
+ response:
+ values:
+ - name: "CredentialExists"
+ value: true
+ constraints:
+ type: boolean
+ - name: "UserIndex"
+ value: 1
+ - name: "CreatorFabricIndex"
+ value: 1
+ - name: "LastModifiedFabricIndex"
+ value: 1
+ - name: "NextCredentialIndex"
+ value: null
+
+ - label: "TH sends Clear Credential Command to DUT with type PIN"
+ PICS: DRLK.S.F00 && DRLK.S.F08 && DRLK.S.C26.Rsp
+ command: "ClearCredential"
+ timedInteractionTimeoutMs: 10000
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 1, CredentialIndex: 1 }
+
+ - label: "TH sends Get Credential Status Command with type RFID"
+ PICS: DRLK.S.F01 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
+ command: "GetCredentialStatus"
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 2, CredentialIndex: 1 }
+ response:
+ values:
+ - name: "CredentialExists"
+ value: true
+ constraints:
+ type: boolean
+ - name: "UserIndex"
+ value: 1
+ - name: "CreatorFabricIndex"
+ value: 1
+ - name: "LastModifiedFabricIndex"
+ value: 1
+ - name: "NextCredentialIndex"
+ value: null
+
+ - label: "TH sends Get Credential Status Command with type FingerVein"
+ PICS: DRLK.S.F02 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
+ command: "GetCredentialStatus"
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 4, CredentialIndex: 1 }
+ response:
+ values:
+ - name: "CredentialExists"
+ value: true
+ constraints:
+ type: boolean
+ - name: "UserIndex"
+ value: 1
+ - name: "CreatorFabricIndex"
+ value: 1
+ - name: "LastModifiedFabricIndex"
+ value: 1
+ - name: "NextCredentialIndex"
+ value: null
+
+ - label: "TH sends Clear Credential Command to DUT with type RFID"
+ PICS: DRLK.S.F01 && DRLK.S.F08 && DRLK.S.C26.Rsp
+ command: "ClearCredential"
+ timedInteractionTimeoutMs: 10000
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 2, CredentialIndex: 1 }
+
+ - label: "TH sends Get Credential Status Command with type FingerVein"
+ PICS: DRLK.S.F02 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
+ command: "GetCredentialStatus"
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 4, CredentialIndex: 1 }
+ response:
+ values:
+ - name: "CredentialExists"
+ value: true
+ constraints:
+ type: boolean
+ - name: "UserIndex"
+ value: 1
+ - name: "CreatorFabricIndex"
+ value: 1
+ - name: "LastModifiedFabricIndex"
+ value: 1
+ - name: "NextCredentialIndex"
+ value: null
+
+ - label: "TH sends Clear Credential Command to DUT with type FingerVein"
+ PICS: DRLK.S.F02 && DRLK.S.F08 && DRLK.S.C26.Rsp
+ command: "ClearCredential"
+ timedInteractionTimeoutMs: 10000
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 4, CredentialIndex: 1 }
+
+ - label: "TH sends Get Credential Status Command to DUT with type PIN"
+ PICS: DRLK.S.F00 && 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: "TH sends Get Credential Status Command to DUT with type RFID"
+ PICS: DRLK.S.F01 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
+ command: "GetCredentialStatus"
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 2, 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:
+ "TH sends Get Credential Status Command to DUT with type FingerVein"
+ PICS: DRLK.S.F02 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx
+ command: "GetCredentialStatus"
+ arguments:
+ values:
+ - name: "Credential"
+ value: { CredentialType: 4, CredentialIndex: 1 }
+ response:
+ values:
+ - name: "CredentialExists"
+ value: false
+ - name: "UserIndex"
+ value: null
+ - name: "CreatorFabricIndex"
+ value: null
+ - name: "LastModifiedFabricIndex"
+ value: null
+ - name: "NextCredentialIndex"
+ value: null
diff --git a/src/app/tests/suites/ciTests.json b/src/app/tests/suites/ciTests.json
index b0147a2..59c6fd8 100644
--- a/src/app/tests/suites/ciTests.json
+++ b/src/app/tests/suites/ciTests.json
@@ -261,7 +261,8 @@
"Test_TC_DRLK_2_5",
"Test_TC_DRLK_2_6",
"Test_TC_DRLK_2_7",
- "Test_TC_DRLK_2_9"
+ "Test_TC_DRLK_2_9",
+ "Test_TC_DRLK_2_11"
],
"Groups": [
"TestGroupMessaging",
diff --git a/zzz_generated/chip-tool/zap-generated/test/Commands.h b/zzz_generated/chip-tool/zap-generated/test/Commands.h
index 9b25eb1..7bc6526 100644
--- a/zzz_generated/chip-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/chip-tool/zap-generated/test/Commands.h
@@ -265,6 +265,7 @@
printf("Test_TC_DRLK_2_6\n");
printf("Test_TC_DRLK_2_7\n");
printf("Test_TC_DRLK_2_9\n");
+ printf("Test_TC_DRLK_2_11\n");
printf("TestGroupMessaging\n");
printf("TestGroupsCluster\n");
printf("TestGroupKeyManagementCluster\n");
@@ -84319,6 +84320,563 @@
}
};
+class Test_TC_DRLK_2_11Suite : public TestCommand
+{
+public:
+ Test_TC_DRLK_2_11Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_11", 18, credsIssuerConfig)
+ {
+ AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
+ AddArgument("cluster", &mCluster);
+ AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
+ AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
+ }
+
+ ~Test_TC_DRLK_2_11Suite() {}
+
+ chip::System::Clock::Timeout GetWaitDuration() const override
+ {
+ return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
+ }
+
+private:
+ chip::Optional<chip::NodeId> mNodeId;
+ chip::Optional<chip::CharSpan> mCluster;
+ chip::Optional<chip::EndpointId> mEndpoint;
+ chip::Optional<uint16_t> mTimeout;
+
+ chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }
+
+ //
+ // Tests methods
+ //
+
+ void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override
+ {
+
+ // Allow yaml to access the current commissioner node id.
+ // Default to 0 (undefined node id) so we know if this isn't
+ // set correctly.
+ // Reset on every step in case it changed.
+ chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ (void) commissionerNodeId;
+
+ bool shouldContinue = false;
+
+ switch (mTestIndex - 1)
+ {
+ case 0:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ shouldContinue = true;
+ break;
+ case 1:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 2:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
+ VerifyOrReturn(CheckValueNonNull("userName", value.userName));
+ VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("xxx", 3)));
+ VerifyOrReturn(CheckValueNonNull("userUniqueID", value.userUniqueID));
+ VerifyOrReturn(CheckValue("userUniqueID.Value()", value.userUniqueID.Value(), 6452UL));
+ VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
+ VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("userType", value.userType));
+ VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 0U));
+ VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
+ VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
+ VerifyOrReturn(CheckValueNull("credentials", value.credentials));
+ VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
+ }
+ break;
+ case 3:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("status", value.status, 0U));
+ VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
+ VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
+ }
+ break;
+ case 4:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("status", value.status, 0U));
+ VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
+ VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
+ }
+ break;
+ case 5:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("status", value.status, 0U));
+ VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
+ VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
+ }
+ break;
+ case 6:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
+ VerifyOrReturn(CheckConstraintType("value.credentialExists", "boolean", "boolean"));
+ VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
+ }
+ break;
+ case 7:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
+ VerifyOrReturn(CheckConstraintType("value.credentialExists", "boolean", "boolean"));
+ VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
+ }
+ break;
+ case 8:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
+ VerifyOrReturn(CheckConstraintType("value.credentialExists", "boolean", "boolean"));
+ VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
+ }
+ break;
+ case 9:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 10:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
+ VerifyOrReturn(CheckConstraintType("value.credentialExists", "boolean", "boolean"));
+ VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
+ }
+ break;
+ case 11:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
+ VerifyOrReturn(CheckConstraintType("value.credentialExists", "boolean", "boolean"));
+ VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
+ }
+ break;
+ case 12:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 13:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
+ VerifyOrReturn(CheckConstraintType("value.credentialExists", "boolean", "boolean"));
+ VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValue("creatorFabricIndex.Value()", value.creatorFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNonNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValue("lastModifiedFabricIndex.Value()", value.lastModifiedFabricIndex.Value(), 1U));
+ VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
+ }
+ break;
+ case 14:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 15:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
+ VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
+ }
+ break;
+ case 16:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
+ VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
+ }
+ break;
+ case 17:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ {
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
+ VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
+ VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, false));
+ VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
+ VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
+ VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
+ VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
+ }
+ break;
+ default:
+ LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
+ }
+
+ if (shouldContinue)
+ {
+ ContinueOnChipMainThread(CHIP_NO_ERROR);
+ }
+ }
+
+ CHIP_ERROR DoTestStep(uint16_t testIndex) override
+ {
+ using namespace chip::app::Clusters;
+ // Allow yaml to access the current commissioner node id.
+ // Default to 0 (undefined node id) so we know if this isn't
+ // set correctly.
+ // Reset on every step in case it changed.
+ chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ (void) commissionerNodeId;
+ switch (testIndex)
+ {
+ case 0: {
+ LogStep(0, "Wait for the commissioned device to be retrieved");
+ ListFreer listFreer;
+ chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
+ value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
+ return WaitForCommissionee(kIdentityAlpha, value);
+ }
+ case 1: {
+ LogStep(1, "Create new user with default parameters");
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
+ value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
+ value.userIndex = 1U;
+ value.userName.SetNonNull();
+ value.userName.Value() = chip::Span<const char>("xxxgarbage: not in length on purpose", 3);
+ value.userUniqueID.SetNonNull();
+ value.userUniqueID.Value() = 6452UL;
+ value.userStatus.SetNonNull();
+ value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(1);
+ value.userType.SetNonNull();
+ value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::UserTypeEnum>(0);
+ value.credentialRule.SetNonNull();
+ value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::CredentialRuleEnum>(0);
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
+ chip::Optional<uint16_t>(10000), chip::NullOptional
+
+ );
+ }
+ case 2: {
+ LogStep(2, "Read the user back and verify its fields");
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
+ value.userIndex = 1U;
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ case 3: {
+ LogStep(3, "TH sends Set Credential Command to DUT with type PIN");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
+ value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(1);
+ value.credential.credentialIndex = 1U;
+
+ value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
+ value.userIndex.SetNonNull();
+ value.userIndex.Value() = 1U;
+ value.userStatus.SetNull();
+ value.userType.SetNull();
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
+ chip::Optional<uint16_t>(10000), chip::NullOptional
+
+ );
+ }
+ case 4: {
+ LogStep(4, "TH sends Set Credential Command to DUT with type RFID");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F01 && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
+ value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
+ value.credential.credentialIndex = 1U;
+
+ value.credentialData =
+ chip::ByteSpan(chip::Uint8::from_const_char("RFIDTESTDATAgarbage: not in length on purpose"), 12);
+ value.userIndex.SetNonNull();
+ value.userIndex.Value() = 1U;
+ value.userStatus.SetNull();
+ value.userType.SetNull();
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
+ chip::Optional<uint16_t>(10000), chip::NullOptional
+
+ );
+ }
+ case 5: {
+ LogStep(5, "TH sends Set Credential Command to DUT with type FingerVein");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F02 && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
+ value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(4);
+ value.credential.credentialIndex = 1U;
+
+ value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
+ value.userIndex.SetNonNull();
+ value.userIndex.Value() = 1U;
+ value.userStatus.SetNull();
+ value.userType.SetNull();
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
+ chip::Optional<uint16_t>(10000), chip::NullOptional
+
+ );
+ }
+ case 6: {
+ LogStep(6, "TH sends Get Credential Status Command with type PIN");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(1);
+ value.credential.credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ case 7: {
+ LogStep(7, "TH sends Get Credential Status Command with type RFID");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F01 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
+ value.credential.credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ case 8: {
+ LogStep(8, "TH sends Get Credential Status Command with type FingerVein");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F02 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(4);
+ value.credential.credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ case 9: {
+ LogStep(9, "TH sends Clear Credential Command to DUT with type PIN");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F08 && DRLK.S.C26.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
+ value.credential.SetNonNull();
+
+ value.credential.Value().credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(1);
+ value.credential.Value().credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
+ chip::Optional<uint16_t>(10000), chip::NullOptional
+
+ );
+ }
+ case 10: {
+ LogStep(10, "TH sends Get Credential Status Command with type RFID");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F01 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
+ value.credential.credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ case 11: {
+ LogStep(11, "TH sends Get Credential Status Command with type FingerVein");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F02 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(4);
+ value.credential.credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ case 12: {
+ LogStep(12, "TH sends Clear Credential Command to DUT with type RFID");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F01 && DRLK.S.F08 && DRLK.S.C26.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
+ value.credential.SetNonNull();
+
+ value.credential.Value().credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
+ value.credential.Value().credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
+ chip::Optional<uint16_t>(10000), chip::NullOptional
+
+ );
+ }
+ case 13: {
+ LogStep(13, "TH sends Get Credential Status Command with type FingerVein");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F02 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(4);
+ value.credential.credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ case 14: {
+ LogStep(14, "TH sends Clear Credential Command to DUT with type FingerVein");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F02 && DRLK.S.F08 && DRLK.S.C26.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
+ value.credential.SetNonNull();
+
+ value.credential.Value().credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(4);
+ value.credential.Value().credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
+ chip::Optional<uint16_t>(10000), chip::NullOptional
+
+ );
+ }
+ case 15: {
+ LogStep(15, "TH sends Get Credential Status Command to DUT with type PIN");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(1);
+ value.credential.credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ case 16: {
+ LogStep(16, "TH sends Get Credential Status Command to DUT with type RFID");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F01 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
+ value.credential.credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ case 17: {
+ LogStep(17, "TH sends Get Credential Status Command to DUT with type FingerVein");
+ VerifyOrDo(!ShouldSkip("DRLK.S.F02 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx"),
+ return ContinueOnChipMainThread(CHIP_NO_ERROR));
+ ListFreer listFreer;
+ chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;
+
+ value.credential.credentialType = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(4);
+ value.credential.credentialIndex = 1U;
+
+ return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
+ chip::NullOptional
+
+ );
+ }
+ }
+ return CHIP_NO_ERROR;
+ }
+};
+
class TestGroupMessagingSuite : public TestCommand
{
public:
@@ -112652,6 +113210,7 @@
make_unique<Test_TC_DRLK_2_6Suite>(credsIssuerConfig),
make_unique<Test_TC_DRLK_2_7Suite>(credsIssuerConfig),
make_unique<Test_TC_DRLK_2_9Suite>(credsIssuerConfig),
+ make_unique<Test_TC_DRLK_2_11Suite>(credsIssuerConfig),
make_unique<TestGroupMessagingSuite>(credsIssuerConfig),
make_unique<TestGroupsClusterSuite>(credsIssuerConfig),
make_unique<TestGroupKeyManagementClusterSuite>(credsIssuerConfig),
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
index ebd3826..583b6df 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
@@ -240,6 +240,7 @@
printf("Test_TC_DRLK_2_6\n");
printf("Test_TC_DRLK_2_7\n");
printf("Test_TC_DRLK_2_9\n");
+ printf("Test_TC_DRLK_2_11\n");
printf("TestGroupsCluster\n");
printf("TestGroupKeyManagementCluster\n");
printf("Test_TC_G_1_1\n");
@@ -130677,6 +130678,1083 @@
}
};
+class Test_TC_DRLK_2_11 : public TestCommandBridge {
+public:
+ // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
+ Test_TC_DRLK_2_11()
+ : TestCommandBridge("Test_TC_DRLK_2_11")
+ , mTestIndex(0)
+ {
+ AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
+ AddArgument("cluster", &mCluster);
+ AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
+ AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
+ }
+ // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)
+
+ ~Test_TC_DRLK_2_11() {}
+
+ // Allow yaml to access the current commissioner node id.
+ // Default to 0 (undefined node id) so we know if this isn't
+ // set correctly.
+ // Reset on every step in case it changed.
+ chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+
+ /////////// TestCommand Interface /////////
+ void NextTest() override
+ {
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+
+ if (0 == mTestIndex) {
+ ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_11\n");
+ }
+
+ if (mTestCount == mTestIndex) {
+ ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_11\n");
+ SetCommandExitStatus(CHIP_NO_ERROR);
+ return;
+ }
+
+ Wait();
+
+ // Ensure we increment mTestIndex before we start running the relevant
+ // command. That way if we lose the timeslice after we send the message
+ // but before our function call returns, we won't end up with an
+ // incorrect mTestIndex value observed when we get the response.
+ switch (mTestIndex++) {
+ case 0:
+ ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
+ err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
+ break;
+ case 1:
+ ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user with default parameters\n");
+ err = TestCreateNewUserWithDefaultParameters_1();
+ break;
+ case 2:
+ ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
+ err = TestReadTheUserBackAndVerifyItsFields_2();
+ break;
+ case 3:
+ ChipLogProgress(chipTool, " ***** Test Step 3 : TH sends Set Credential Command to DUT with type PIN\n");
+ if (ShouldSkip("DRLK.S.F00 && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsSetCredentialCommandToDutWithTypePin_3();
+ break;
+ case 4:
+ ChipLogProgress(chipTool, " ***** Test Step 4 : TH sends Set Credential Command to DUT with type RFID\n");
+ if (ShouldSkip("DRLK.S.F01 && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsSetCredentialCommandToDutWithTypeRfid_4();
+ break;
+ case 5:
+ ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Set Credential Command to DUT with type FingerVein\n");
+ if (ShouldSkip("DRLK.S.F02 && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsSetCredentialCommandToDutWithTypeFingerVein_5();
+ break;
+ case 6:
+ ChipLogProgress(chipTool, " ***** Test Step 6 : TH sends Get Credential Status Command with type PIN\n");
+ if (ShouldSkip("DRLK.S.F00 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsGetCredentialStatusCommandWithTypePin_6();
+ break;
+ case 7:
+ ChipLogProgress(chipTool, " ***** Test Step 7 : TH sends Get Credential Status Command with type RFID\n");
+ if (ShouldSkip("DRLK.S.F01 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsGetCredentialStatusCommandWithTypeRfid_7();
+ break;
+ case 8:
+ ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends Get Credential Status Command with type FingerVein\n");
+ if (ShouldSkip("DRLK.S.F02 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsGetCredentialStatusCommandWithTypeFingerVein_8();
+ break;
+ case 9:
+ ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends Clear Credential Command to DUT with type PIN\n");
+ if (ShouldSkip("DRLK.S.F00 && DRLK.S.F08 && DRLK.S.C26.Rsp")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsClearCredentialCommandToDutWithTypePin_9();
+ break;
+ case 10:
+ ChipLogProgress(chipTool, " ***** Test Step 10 : TH sends Get Credential Status Command with type RFID\n");
+ if (ShouldSkip("DRLK.S.F01 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsGetCredentialStatusCommandWithTypeRfid_10();
+ break;
+ case 11:
+ ChipLogProgress(chipTool, " ***** Test Step 11 : TH sends Get Credential Status Command with type FingerVein\n");
+ if (ShouldSkip("DRLK.S.F02 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsGetCredentialStatusCommandWithTypeFingerVein_11();
+ break;
+ case 12:
+ ChipLogProgress(chipTool, " ***** Test Step 12 : TH sends Clear Credential Command to DUT with type RFID\n");
+ if (ShouldSkip("DRLK.S.F01 && DRLK.S.F08 && DRLK.S.C26.Rsp")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsClearCredentialCommandToDutWithTypeRfid_12();
+ break;
+ case 13:
+ ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends Get Credential Status Command with type FingerVein\n");
+ if (ShouldSkip("DRLK.S.F02 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsGetCredentialStatusCommandWithTypeFingerVein_13();
+ break;
+ case 14:
+ ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends Clear Credential Command to DUT with type FingerVein\n");
+ if (ShouldSkip("DRLK.S.F02 && DRLK.S.F08 && DRLK.S.C26.Rsp")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsClearCredentialCommandToDutWithTypeFingerVein_14();
+ break;
+ case 15:
+ ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends Get Credential Status Command to DUT with type PIN\n");
+ if (ShouldSkip("DRLK.S.F00 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsGetCredentialStatusCommandToDutWithTypePin_15();
+ break;
+ case 16:
+ ChipLogProgress(chipTool, " ***** Test Step 16 : TH sends Get Credential Status Command to DUT with type RFID\n");
+ if (ShouldSkip("DRLK.S.F01 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsGetCredentialStatusCommandToDutWithTypeRfid_16();
+ break;
+ case 17:
+ ChipLogProgress(chipTool, " ***** Test Step 17 : TH sends Get Credential Status Command to DUT with type FingerVein\n");
+ if (ShouldSkip("DRLK.S.F02 && DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
+ NextTest();
+ return;
+ }
+ err = TestThSendsGetCredentialStatusCommandToDutWithTypeFingerVein_17();
+ break;
+ }
+
+ if (CHIP_NO_ERROR != err) {
+ ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
+ SetCommandExitStatus(err);
+ }
+ }
+
+ void OnStatusUpdate(const chip::app::StatusIB & status) override
+ {
+ switch (mTestIndex - 1) {
+ case 0:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 1:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 2:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 3:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 4:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 5:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 6:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 7:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 8:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 9:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 10:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 11:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 12:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 13:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 14:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 15:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 16:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ case 17:
+ VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
+ break;
+ }
+
+ // Go on to the next test.
+ ContinueOnChipMainThread(CHIP_NO_ERROR);
+ }
+
+ chip::System::Clock::Timeout GetWaitDuration() const override
+ {
+ return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
+ }
+
+private:
+ std::atomic_uint16_t mTestIndex;
+ const uint16_t mTestCount = 18;
+
+ chip::Optional<chip::NodeId> mNodeId;
+ chip::Optional<chip::CharSpan> mCluster;
+ chip::Optional<chip::EndpointId> mEndpoint;
+ chip::Optional<uint16_t> mTimeout;
+
+ CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
+ {
+
+ chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
+ value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
+ return WaitForCommissionee("alpha", value);
+ }
+
+ CHIP_ERROR TestCreateNewUserWithDefaultParameters_1()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
+ params.operationType = [NSNumber numberWithUnsignedChar:0U];
+ params.userIndex = [NSNumber numberWithUnsignedShort:1U];
+ params.userName = @"xxx";
+ params.userUniqueID = [NSNumber numberWithUnsignedInt:6452UL];
+ params.userStatus = [NSNumber numberWithUnsignedChar:1U];
+ params.userType = [NSNumber numberWithUnsignedChar:0U];
+ params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
+ [cluster setUserWithParams:params
+ completion:^(NSError * _Nullable err) {
+ NSLog(@"Create new user with default parameters Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
+ params.userIndex = [NSNumber numberWithUnsignedShort:1U];
+ [cluster getUserWithParams:params
+ completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
+ NSLog(@"Read the user back and verify its fields Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.userName;
+ VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
+ VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"xxx"));
+ }
+
+ {
+ id actualValue = values.userUniqueID;
+ VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
+ VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 6452UL));
+ }
+
+ {
+ id actualValue = values.userStatus;
+ VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
+ VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.userType;
+ VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
+ VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
+ }
+
+ {
+ id actualValue = values.credentialRule;
+ VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
+ VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
+ }
+
+ {
+ id actualValue = values.credentials;
+ VerifyOrReturn(CheckValueNull("Credentials", actualValue));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.nextUserIndex;
+ VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsSetCredentialCommandToDutWithTypePin_3()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
+ params.operationType = [NSNumber numberWithUnsignedChar:0U];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
+ params.userIndex = [NSNumber numberWithUnsignedShort:1U];
+ params.userStatus = nil;
+ params.userType = nil;
+ [cluster
+ setCredentialWithParams:params
+ completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
+ NSLog(@"TH sends Set Credential Command to DUT with type PIN Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.status;
+ VerifyOrReturn(CheckValue("Status", actualValue, 0U));
+ }
+
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
+ VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsSetCredentialCommandToDutWithTypeRfid_4()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
+ params.operationType = [NSNumber numberWithUnsignedChar:0U];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ params.credentialData = [[NSData alloc] initWithBytes:"RFIDTESTDATA" length:12];
+ params.userIndex = [NSNumber numberWithUnsignedShort:1U];
+ params.userStatus = nil;
+ params.userType = nil;
+ [cluster
+ setCredentialWithParams:params
+ completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
+ NSLog(@"TH sends Set Credential Command to DUT with type RFID Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.status;
+ VerifyOrReturn(CheckValue("Status", actualValue, 0U));
+ }
+
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
+ VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsSetCredentialCommandToDutWithTypeFingerVein_5()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
+ params.operationType = [NSNumber numberWithUnsignedChar:0U];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:4U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
+ params.userIndex = [NSNumber numberWithUnsignedShort:1U];
+ params.userStatus = nil;
+ params.userType = nil;
+ [cluster
+ setCredentialWithParams:params
+ completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
+ NSLog(@"TH sends Set Credential Command to DUT with type FingerVein Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.status;
+ VerifyOrReturn(CheckValue("Status", actualValue, 0U));
+ }
+
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
+ VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsGetCredentialStatusCommandWithTypePin_6()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster getCredentialStatusWithParams:params
+ completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
+ NSError * _Nullable err) {
+ NSLog(@"TH sends Get Credential Status Command with type PIN Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.credentialExists;
+ VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
+ }
+
+ VerifyOrReturn(CheckConstraintType("credentialExists", "boolean", "boolean"));
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
+ VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsGetCredentialStatusCommandWithTypeRfid_7()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster getCredentialStatusWithParams:params
+ completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
+ NSError * _Nullable err) {
+ NSLog(@"TH sends Get Credential Status Command with type RFID Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.credentialExists;
+ VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
+ }
+
+ VerifyOrReturn(CheckConstraintType("credentialExists", "boolean", "boolean"));
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
+ VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsGetCredentialStatusCommandWithTypeFingerVein_8()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:4U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster getCredentialStatusWithParams:params
+ completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
+ NSError * _Nullable err) {
+ NSLog(@"TH sends Get Credential Status Command with type FingerVein Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.credentialExists;
+ VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
+ }
+
+ VerifyOrReturn(CheckConstraintType("credentialExists", "boolean", "boolean"));
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
+ VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsClearCredentialCommandToDutWithTypePin_9()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster clearCredentialWithParams:params
+ completion:^(NSError * _Nullable err) {
+ NSLog(@"TH sends Clear Credential Command to DUT with type PIN Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsGetCredentialStatusCommandWithTypeRfid_10()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster getCredentialStatusWithParams:params
+ completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
+ NSError * _Nullable err) {
+ NSLog(@"TH sends Get Credential Status Command with type RFID Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.credentialExists;
+ VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
+ }
+
+ VerifyOrReturn(CheckConstraintType("credentialExists", "boolean", "boolean"));
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
+ VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsGetCredentialStatusCommandWithTypeFingerVein_11()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:4U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster getCredentialStatusWithParams:params
+ completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
+ NSError * _Nullable err) {
+ NSLog(@"TH sends Get Credential Status Command with type FingerVein Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.credentialExists;
+ VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
+ }
+
+ VerifyOrReturn(CheckConstraintType("credentialExists", "boolean", "boolean"));
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
+ VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsClearCredentialCommandToDutWithTypeRfid_12()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster clearCredentialWithParams:params
+ completion:^(NSError * _Nullable err) {
+ NSLog(@"TH sends Clear Credential Command to DUT with type RFID Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsGetCredentialStatusCommandWithTypeFingerVein_13()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:4U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster getCredentialStatusWithParams:params
+ completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
+ NSError * _Nullable err) {
+ NSLog(@"TH sends Get Credential Status Command with type FingerVein Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.credentialExists;
+ VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
+ }
+
+ VerifyOrReturn(CheckConstraintType("credentialExists", "boolean", "boolean"));
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
+ VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
+ VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsClearCredentialCommandToDutWithTypeFingerVein_14()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:4U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster clearCredentialWithParams:params
+ completion:^(NSError * _Nullable err) {
+ NSLog(@"TH sends Clear Credential Command to DUT with type FingerVein Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsGetCredentialStatusCommandToDutWithTypePin_15()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster getCredentialStatusWithParams:params
+ completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
+ NSError * _Nullable err) {
+ NSLog(@"TH sends Get Credential Status Command to DUT with type PIN Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.credentialExists;
+ VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
+ }
+
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsGetCredentialStatusCommandToDutWithTypeRfid_16()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster getCredentialStatusWithParams:params
+ completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
+ NSError * _Nullable err) {
+ NSLog(@"TH sends Get Credential Status Command to DUT with type RFID Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.credentialExists;
+ VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
+ }
+
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+
+ CHIP_ERROR TestThSendsGetCredentialStatusCommandToDutWithTypeFingerVein_17()
+ {
+
+ MTRBaseDevice * device = GetDevice("alpha");
+ commissionerNodeId = mCommissionerNodeId.ValueOr(0);
+ __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+ VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
+
+ __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
+ params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:4U];
+ ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];
+
+ [cluster getCredentialStatusWithParams:params
+ completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
+ NSError * _Nullable err) {
+ NSLog(@"TH sends Get Credential Status Command to DUT with type FingerVein Error: %@", err);
+
+ VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
+
+ {
+ id actualValue = values.credentialExists;
+ VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
+ }
+
+ {
+ id actualValue = values.userIndex;
+ VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.creatorFabricIndex;
+ VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.lastModifiedFabricIndex;
+ VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
+ }
+
+ {
+ id actualValue = values.nextCredentialIndex;
+ VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
+ }
+
+ NextTest();
+ }];
+
+ return CHIP_NO_ERROR;
+ }
+};
+
class TestGroupsCluster : public TestCommandBridge {
public:
// NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
@@ -133730,6 +134808,7 @@
make_unique<Test_TC_DRLK_2_6>(),
make_unique<Test_TC_DRLK_2_7>(),
make_unique<Test_TC_DRLK_2_9>(),
+ make_unique<Test_TC_DRLK_2_11>(),
make_unique<TestGroupsCluster>(),
make_unique<TestGroupKeyManagementCluster>(),
make_unique<Test_TC_G_1_1>(),