From f41610c4fcce7ebeac8d3ef32404ca9a5d34ae35 Mon Sep 17 00:00:00 2001 From: Nivedita Sarkar Date: Tue, 7 Mar 2023 10:01:59 -0800 Subject: [PATCH] Reset the wrong code retry attempts if a valid credential is presented - Provide a ResetWrongCodeEntryAttempts for apps to use to reset the wrong entry attempts - Update DL_LockUnlock.yaml to test resetting the wrong code retry attempts --- .../door-lock-server/door-lock-server.cpp | 19 +- .../door-lock-server/door-lock-server.h | 13 +- src/app/tests/suites/DL_LockUnlock.yaml | 78 ++++++- .../chip-tool/zap-generated/test/Commands.h | 208 ++++++++++++------ 4 files changed, 245 insertions(+), 73 deletions(-) diff --git a/src/app/clusters/door-lock-server/door-lock-server.cpp b/src/app/clusters/door-lock-server/door-lock-server.cpp index 2b08ec9c128d63..2fc5e41a9eec84 100644 --- a/src/app/clusters/door-lock-server/door-lock-server.cpp +++ b/src/app/clusters/door-lock-server/door-lock-server.cpp @@ -125,6 +125,9 @@ bool DoorLockServer::SetLockState(chip::EndpointId endpointId, DlLockState newLo // Schedule auto-relocking if (success && LockOperationTypeEnum::kUnlock == opType) { + // Reset code wrong entry attempts (in case there were any incorrect wrong code retries prior) since unlock was a success. + ResetWrongCodeEntryAttempts(endpointId); + // appclusters.pdf 5.3.3.25: // The number of seconds to wait after unlocking a lock before it automatically locks again. 0=disabled. If set, unlock // operations from any source will be timed. For one time unlock with timeout use the specific command. @@ -181,7 +184,13 @@ bool DoorLockServer::SetPrivacyModeButton(chip::EndpointId endpointId, bool isEn return SetAttribute(endpointId, Attributes::EnablePrivacyModeButton::Id, Attributes::EnablePrivacyModeButton::Set, isEnabled); } -bool DoorLockServer::TrackWrongCodeEntry(chip::EndpointId endpointId) +/** + * @brief Handles a wrong code entry attempt. If the number of wrong entry attempts exceeds the max limit, engage lockout. + * Otherwise increment the number of incorrect attempts by 1. + * + * @param endpointId + */ +bool DoorLockServer::HandleWrongCodeEntry(chip::EndpointId endpointId) { auto endpointContext = getContext(endpointId); if (nullptr == endpointContext) @@ -3352,7 +3361,13 @@ bool DoorLockServer::HandleRemoteLockOperation(chip::app::CommandHandler * comma exit: if (!success && reason == OperationErrorEnum::kInvalidCredential) { - TrackWrongCodeEntry(endpoint); + HandleWrongCodeEntry(endpoint); + } + + // Reset the wrong code retry attempts if a valid credential is presented + if (success && pinCode.HasValue()) + { + ResetWrongCodeEntryAttempts(endpoint); } // Send command response diff --git a/src/app/clusters/door-lock-server/door-lock-server.h b/src/app/clusters/door-lock-server/door-lock-server.h index 2d0fa45318890f..7836985d67b776 100644 --- a/src/app/clusters/door-lock-server/door-lock-server.h +++ b/src/app/clusters/door-lock-server/door-lock-server.h @@ -121,7 +121,7 @@ class DoorLockServer bool SetOneTouchLocking(chip::EndpointId endpointId, bool isEnabled); bool SetPrivacyModeButton(chip::EndpointId endpointId, bool isEnabled); - bool TrackWrongCodeEntry(chip::EndpointId endpointId); + bool HandleWrongCodeEntry(chip::EndpointId endpointId); bool GetAutoRelockTime(chip::EndpointId endpointId, uint32_t & autoRelockTime); bool GetNumberOfUserSupported(chip::EndpointId endpointId, uint16_t & numberOfUsersSupported); @@ -180,6 +180,17 @@ class DoorLockServer return GetFeatures(endpointId).Has(DoorLockFeature::kUser) && SupportsAnyCredential(endpointId); } + inline void ResetWrongCodeEntryAttempts(chip::EndpointId endpointId) + { + auto endpointContext = getContext(endpointId); + if (nullptr == endpointContext) + { + ChipLogError(Zcl, "Failed to reset wrong code entry attempts. No context for endpoint %d", endpointId); + return; + } + endpointContext->wrongCodeEntryAttempts = 0; + } + bool OnFabricRemoved(chip::EndpointId endpointId, chip::FabricIndex fabricIndex); static void DoorLockOnAutoRelockCallback(chip::System::Layer *, void * callbackContext); diff --git a/src/app/tests/suites/DL_LockUnlock.yaml b/src/app/tests/suites/DL_LockUnlock.yaml index d9b4f4a300e4b6..d787f4940264d0 100644 --- a/src/app/tests/suites/DL_LockUnlock.yaml +++ b/src/app/tests/suites/DL_LockUnlock.yaml @@ -238,11 +238,10 @@ tests: arguments: value: 0 - - label: "Read the lockout timeout" - command: "readAttribute" - attribute: "UserCodeTemporaryDisableTime" - response: - value: 10 + # Test resetting wrong code entry retry attempts + # Set the retry limit to 3. Try to unlock with incorrect PIN 2 times followed by a third time + # with correct PIN code. The retry attempts should be reset to 0 and we can now retry + # 3 times again before lockout happens. Unlock the door after the lockout timeout. - label: "Set the WrongCodeEntryLimit to small value so we can test lockout" command: "writeAttribute" @@ -270,7 +269,70 @@ tests: response: error: FAILURE - - label: "Try to unlock the door with invalid PIN for the third time" + - label: "Try to unlock the door with valid PIN for the third time" + command: "UnlockDoor" + timedInteractionTimeoutMs: 10000 + arguments: + values: + - name: "PINCode" + value: "123456" + + - label: "Verify that lock state attribute value is set to Unlocked" + command: "readAttribute" + attribute: "LockState" + response: + value: 2 + + - label: "Lock the door back prior to next tests" + command: "LockDoor" + timedInteractionTimeoutMs: 10000 + arguments: + values: + - name: "PINCode" + value: "123456" + + - label: "Verify that lock state attribute value is set to Locked" + command: "readAttribute" + attribute: "LockState" + response: + value: 1 + + # Engage lockout by trying invalid PIN again 3 times after the reset. + # The retry count should have reset to 0 to allow us 3 retry attempts again + + - label: "Read the lockout timeout" + command: "readAttribute" + attribute: "UserCodeTemporaryDisableTime" + response: + value: 10 + + - label: + "Try to unlock the door with invalid PIN for the first time after + reset" + command: "UnlockDoor" + timedInteractionTimeoutMs: 10000 + arguments: + values: + - name: "PINCode" + value: "000000" + response: + error: FAILURE + + - label: + "Try to unlock the door with invalid PIN for the second time after + reset" + command: "UnlockDoor" + timedInteractionTimeoutMs: 10000 + arguments: + values: + - name: "PINCode" + value: "000000" + response: + error: FAILURE + + - label: + "Try to unlock the door with invalid PIN for the third time after + reset" command: "UnlockDoor" timedInteractionTimeoutMs: 10000 arguments: @@ -281,8 +343,8 @@ tests: error: FAILURE - label: - "Try to unlock the door with valid PIN and make sure it fails due to - lockout" + "Try to unlock the door with valid PIN and make sure it fails since we + are in lockout" command: "UnlockDoor" timedInteractionTimeoutMs: 10000 arguments: diff --git a/zzz_generated/chip-tool/zap-generated/test/Commands.h b/zzz_generated/chip-tool/zap-generated/test/Commands.h index dd43f9aaafa5fe..dc4b2afab15c07 100644 --- a/zzz_generated/chip-tool/zap-generated/test/Commands.h +++ b/zzz_generated/chip-tool/zap-generated/test/Commands.h @@ -78270,7 +78270,7 @@ class DL_UsersAndCredentialsSuite : public TestCommand class DL_LockUnlockSuite : public TestCommand { public: - DL_LockUnlockSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("DL_LockUnlock", 41, credsIssuerConfig) + DL_LockUnlockSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("DL_LockUnlock", 47, credsIssuerConfig) { AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); AddArgument("cluster", &mCluster); @@ -78499,35 +78499,65 @@ class DL_LockUnlockSuite : public TestCommand break; case 21: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - { - uint8_t value; - VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); - VerifyOrReturn(CheckValue("userCodeTemporaryDisableTime", value, 10U)); - } break; case 22: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); break; case 23: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); break; case 24: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; case 25: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + chip::app::DataModel::Nullable value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValueNonNull("lockState", value)); + VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U)); + } break; case 26: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; case 27: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; + { + chip::app::DataModel::Nullable value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValueNonNull("lockState", value)); + VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U)); + } break; case 28: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + { + uint8_t value; + VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); + VerifyOrReturn(CheckValue("userCodeTemporaryDisableTime", value, 10U)); + } break; case 29: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); + break; + case 30: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); + break; + case 31: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); + break; + case 32: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); + break; + case 33: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + shouldContinue = true; + break; + case 34: + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + break; + case 35: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::Nullable value; @@ -78536,10 +78566,10 @@ class DL_LockUnlockSuite : public TestCommand VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U)); } break; - case 30: + case 36: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; - case 31: + case 37: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value; @@ -78551,10 +78581,10 @@ class DL_LockUnlockSuite : public TestCommand VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U)); } break; - case 32: + case 38: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); break; - case 33: + case 39: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::Nullable value; @@ -78563,10 +78593,10 @@ class DL_LockUnlockSuite : public TestCommand VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U)); } break; - case 34: + case 40: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; - case 35: + case 41: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::Nullable value; @@ -78575,10 +78605,10 @@ class DL_LockUnlockSuite : public TestCommand VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U)); } break; - case 36: + case 42: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE)); break; - case 37: + case 43: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::Nullable value; @@ -78587,10 +78617,10 @@ class DL_LockUnlockSuite : public TestCommand VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U)); } break; - case 38: + case 44: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; - case 39: + case 45: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::Nullable value; @@ -78599,7 +78629,7 @@ class DL_LockUnlockSuite : public TestCommand VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U)); } break; - case 40: + case 46: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; default: @@ -78802,20 +78832,26 @@ class DL_LockUnlockSuite : public TestCommand chip::NullOptional, chip::NullOptional); } case 21: { - LogStep(21, "Read the lockout timeout"); - return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, - DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, true, chip::NullOptional); - } - case 22: { - LogStep(22, "Set the WrongCodeEntryLimit to small value so we can test lockout"); + LogStep(21, "Set the WrongCodeEntryLimit to small value so we can test lockout"); ListFreer listFreer; uint8_t value; value = 3U; return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id, value, chip::NullOptional, chip::NullOptional); } + case 22: { + LogStep(22, "Try to unlock the door with invalid PIN for the first time"); + ListFreer listFreer; + chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; + value.PINCode.Emplace(); + value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6); + return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value, + chip::Optional(10000), chip::NullOptional + + ); + } case 23: { - LogStep(23, "Try to unlock the door with invalid PIN for the first time"); + LogStep(23, "Try to unlock the door with invalid PIN for the second time"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; value.PINCode.Emplace(); @@ -78826,18 +78862,44 @@ class DL_LockUnlockSuite : public TestCommand ); } case 24: { - LogStep(24, "Try to unlock the door with invalid PIN for the second time"); + LogStep(24, "Try to unlock the door with valid PIN for the third time"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; value.PINCode.Emplace(); - value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6); + value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6); return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value, chip::Optional(10000), chip::NullOptional ); } case 25: { - LogStep(25, "Try to unlock the door with invalid PIN for the third time"); + LogStep(25, "Verify that lock state attribute value is set to Unlocked"); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true, + chip::NullOptional); + } + case 26: { + LogStep(26, "Lock the door back prior to next tests"); + ListFreer listFreer; + chip::app::Clusters::DoorLock::Commands::LockDoor::Type value; + value.PINCode.Emplace(); + value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6); + return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value, + chip::Optional(10000), chip::NullOptional + + ); + } + case 27: { + LogStep(27, "Verify that lock state attribute value is set to Locked"); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true, + chip::NullOptional); + } + case 28: { + LogStep(28, "Read the lockout timeout"); + return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, + DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, true, chip::NullOptional); + } + case 29: { + LogStep(29, "Try to unlock the door with invalid PIN for the first time after reset"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; value.PINCode.Emplace(); @@ -78847,8 +78909,30 @@ class DL_LockUnlockSuite : public TestCommand ); } - case 26: { - LogStep(26, "Try to unlock the door with valid PIN and make sure it fails due to lockout"); + case 30: { + LogStep(30, "Try to unlock the door with invalid PIN for the second time after reset"); + ListFreer listFreer; + chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; + value.PINCode.Emplace(); + value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6); + return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value, + chip::Optional(10000), chip::NullOptional + + ); + } + case 31: { + LogStep(31, "Try to unlock the door with invalid PIN for the third time after reset"); + ListFreer listFreer; + chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; + value.PINCode.Emplace(); + value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6); + return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value, + chip::Optional(10000), chip::NullOptional + + ); + } + case 32: { + LogStep(32, "Try to unlock the door with valid PIN and make sure it fails since we are in lockout"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; value.PINCode.Emplace(); @@ -78858,15 +78942,15 @@ class DL_LockUnlockSuite : public TestCommand ); } - case 27: { - LogStep(27, "Wait for the lockout to end"); + case 33: { + LogStep(33, "Wait for the lockout to end"); ListFreer listFreer; chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; value.ms = 10000UL; return WaitForMs(kIdentityAlpha, value); } - case 28: { - LogStep(28, "Try to unlock the door with valid PIN and make sure it succeeds"); + case 34: { + LogStep(34, "Try to unlock the door with valid PIN and make sure it succeeds"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; value.PINCode.Emplace(); @@ -78876,13 +78960,13 @@ class DL_LockUnlockSuite : public TestCommand ); } - case 29: { - LogStep(29, "Verify that lock state attribute value is set to Unlocked"); + case 35: { + LogStep(35, "Verify that lock state attribute value is set to Unlocked"); return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true, chip::NullOptional); } - case 30: { - LogStep(30, "Lock the door back prior to next tests"); + case 36: { + LogStep(36, "Lock the door back prior to next tests"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::LockDoor::Type value; value.PINCode.Emplace(); @@ -78892,8 +78976,8 @@ class DL_LockUnlockSuite : public TestCommand ); } - case 31: { - LogStep(31, "Create a disabled user and credential"); + case 37: { + LogStep(37, "Create a disabled user and credential"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::SetCredential::Type value; value.operationType = static_cast(0); @@ -78911,8 +78995,8 @@ class DL_LockUnlockSuite : public TestCommand ); } - case 32: { - LogStep(32, "Try to unlock the door with disabled user PIN"); + case 38: { + LogStep(38, "Try to unlock the door with disabled user PIN"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; value.PINCode.Emplace(); @@ -78922,13 +79006,13 @@ class DL_LockUnlockSuite : public TestCommand ); } - case 33: { - LogStep(33, "Verify that lock state attribute value is set to Locked"); + case 39: { + LogStep(39, "Verify that lock state attribute value is set to Locked"); return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true, chip::NullOptional); } - case 34: { - LogStep(34, "Unlock the door with enabled user PIN"); + case 40: { + LogStep(40, "Unlock the door with enabled user PIN"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value; value.PINCode.Emplace(); @@ -78938,13 +79022,13 @@ class DL_LockUnlockSuite : public TestCommand ); } - case 35: { - LogStep(35, "Verify that lock state attribute value is set to Unlocked"); + case 41: { + LogStep(41, "Verify that lock state attribute value is set to Unlocked"); return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true, chip::NullOptional); } - case 36: { - LogStep(36, "Try to lock the door with disabled user PIN"); + case 42: { + LogStep(42, "Try to lock the door with disabled user PIN"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::LockDoor::Type value; value.PINCode.Emplace(); @@ -78954,13 +79038,13 @@ class DL_LockUnlockSuite : public TestCommand ); } - case 37: { - LogStep(37, "Verify that lock state attribute value stays Unlocked"); + case 43: { + LogStep(43, "Verify that lock state attribute value stays Unlocked"); return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true, chip::NullOptional); } - case 38: { - LogStep(38, "Lock the door with enabled user PIN"); + case 44: { + LogStep(44, "Lock the door with enabled user PIN"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::LockDoor::Type value; value.PINCode.Emplace(); @@ -78970,13 +79054,13 @@ class DL_LockUnlockSuite : public TestCommand ); } - case 39: { - LogStep(39, "Verify that lock state attribute value is set to Locked"); + case 45: { + LogStep(45, "Verify that lock state attribute value is set to Locked"); return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true, chip::NullOptional); } - case 40: { - LogStep(40, "Clean all the users and credentials"); + case 46: { + LogStep(46, "Clean all the users and credentials"); ListFreer listFreer; chip::app::Clusters::DoorLock::Commands::ClearUser::Type value; value.userIndex = 65534U;