/*
 *
 *    Copyright (c) 2022 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.
 */

// THIS FILE IS GENERATED BY ZAP

#pragma once

#if CONFIG_ENABLE_YAML_TESTS

#include <commands/common/Commands.h>
#include <commands/tests/TestCommand.h>
#include <lib/core/Optional.h>
#include <lib/support/CHIPListUtils.h>
#include <system/SystemClock.h>

#include <math.h> // For INFINITY

class TestList : public Command
{
public:
    TestList() : Command("list"){};
    CHIP_ERROR Run() override
    {
        printf("TestAccessControlCluster\n");
        printf("Test_TC_ACL_1_1\n");
        printf("Test_TC_ACL_2_1\n");
        printf("Test_TC_ACL_2_2\n");
        printf("Test_TC_ACL_2_3\n");
        printf("Test_TC_ACL_2_4\n");
        printf("Test_TC_ACL_2_7\n");
        printf("Test_TC_ACL_2_8\n");
        printf("Test_TC_ACL_2_9\n");
        printf("Test_TC_ACL_2_10\n");
        printf("Test_TC_ACE_1_1\n");
        printf("Test_TC_ACE_1_5\n");
        printf("Test_TC_BOOL_1_1\n");
        printf("Test_TC_BOOL_2_1\n");
        printf("Test_TC_BRBINFO_1_1\n");
        printf("Test_TC_BRBINFO_2_1\n");
        printf("Test_TC_ACT_1_1\n");
        printf("Test_TC_BIND_1_1\n");
        printf("Test_TC_CC_1_1\n");
        printf("Test_TC_CC_2_1\n");
        printf("Test_TC_CC_3_2\n");
        printf("Test_TC_CC_3_3\n");
        printf("Test_TC_CC_4_1\n");
        printf("Test_TC_CC_4_2\n");
        printf("Test_TC_CC_4_3\n");
        printf("Test_TC_CC_4_4\n");
        printf("Test_TC_CC_5_1\n");
        printf("Test_TC_CC_5_2\n");
        printf("Test_TC_CC_5_3\n");
        printf("Test_TC_CC_6_1\n");
        printf("Test_TC_CC_6_2\n");
        printf("Test_TC_CC_6_3\n");
        printf("Test_TC_CC_7_2\n");
        printf("Test_TC_CC_7_3\n");
        printf("Test_TC_CC_7_4\n");
        printf("Test_TC_CC_8_1\n");
        printf("TestColorControl_9_1\n");
        printf("TestColorControl_9_2\n");
        printf("Test_TC_OPCREDS_1_2\n");
        printf("Test_TC_BINFO_1_1\n");
        printf("Test_TC_BINFO_2_1\n");
        printf("Test_TC_CNET_1_3\n");
        printf("Test_TC_DESC_1_1\n");
        printf("Test_TC_DLOG_1_1\n");
        printf("Test_TC_DGETH_1_1\n");
        printf("Test_TC_DGETH_2_1\n");
        printf("Test_TC_DGETH_2_2\n");
        printf("Test_TC_FLW_1_1\n");
        printf("Test_TC_FLW_2_1\n");
        printf("Test_TC_FLABEL_1_1\n");
        printf("Test_TC_FLABEL_2_1\n");
        printf("Test_TC_CGEN_1_1\n");
        printf("Test_TC_CGEN_2_1\n");
        printf("Test_TC_DGGEN_1_1\n");
        printf("Test_TC_DGGEN_2_1\n");
        printf("Test_TC_I_1_1\n");
        printf("Test_TC_I_2_1\n");
        printf("Test_TC_I_2_2\n");
        printf("Test_TC_I_2_3\n");
        printf("Test_TC_ILL_1_1\n");
        printf("Test_TC_ILL_2_1\n");
        printf("Test_TC_ILL_2_2\n");
        printf("Test_TC_LVL_1_1\n");
        printf("Test_TC_LVL_2_1\n");
        printf("Test_TC_LVL_2_2\n");
        printf("Test_TC_LVL_3_1\n");
        printf("Test_TC_LVL_4_1\n");
        printf("Test_TC_LVL_5_1\n");
        printf("Test_TC_LVL_6_1\n");
        printf("Test_TC_LCFG_1_1\n");
        printf("Test_TC_LUNIT_1_2\n");
        printf("Test_TC_LUNIT_3_1\n");
        printf("Test_TC_LTIME_1_2\n");
        printf("Test_TC_LOWPOWER_1_1\n");
        printf("Test_TC_KEYPADINPUT_1_2\n");
        printf("Test_TC_APPLAUNCHER_1_3\n");
        printf("Test_TC_MEDIAINPUT_1_4\n");
        printf("Test_TC_WAKEONLAN_1_5\n");
        printf("Test_TC_CHANNEL_1_6\n");
        printf("Test_TC_MEDIAPLAYBACK_1_7\n");
        printf("Test_TC_AUDIOOUTPUT_1_8\n");
        printf("Test_TC_TGTNAV_1_9\n");
        printf("Test_TC_TGTNAV_8_2\n");
        printf("Test_TC_APBSC_1_10\n");
        printf("Test_TC_CONTENTLAUNCHER_1_11\n");
        printf("Test_TC_ALOGIN_1_12\n");
        printf("Test_TC_LOWPOWER_2_1\n");
        printf("Test_TC_KEYPADINPUT_3_2\n");
        printf("Test_TC_KEYPADINPUT_3_3\n");
        printf("Test_TC_APPLAUNCHER_3_5\n");
        printf("Test_TC_APPLAUNCHER_3_6\n");
        printf("Test_TC_APPLAUNCHER_3_7\n");
        printf("Test_TC_APPLAUNCHER_3_8\n");
        printf("Test_TC_APPLAUNCHER_3_9\n");
        printf("Test_TC_MEDIAINPUT_3_10\n");
        printf("Test_TC_MEDIAINPUT_3_11\n");
        printf("Test_TC_MEDIAINPUT_3_12\n");
        printf("Test_TC_MEDIAINPUT_3_13\n");
        printf("Test_TC_CHANNEL_5_1\n");
        printf("Test_TC_CHANNEL_5_2\n");
        printf("Test_TC_CHANNEL_5_3\n");
        printf("Test_TC_MEDIAPLAYBACK_6_1\n");
        printf("Test_TC_MEDIAPLAYBACK_6_2\n");
        printf("Test_TC_MEDIAPLAYBACK_6_3\n");
        printf("Test_TC_MEDIAPLAYBACK_6_4\n");
        printf("Test_TC_AUDIOOUTPUT_7_1\n");
        printf("Test_TC_AUDIOOUTPUT_7_2\n");
        printf("Test_TC_TGTNAV_8_1\n");
        printf("Test_TC_APBSC_9_1\n");
        printf("Test_TC_CONTENTLAUNCHER_10_1\n");
        printf("Test_TC_WAKEONLAN_4_1\n");
        printf("Test_TC_ALOGIN_12_1\n");
        printf("Test_TC_MOD_1_1\n");
        printf("OTA_SuccessfulTransfer\n");
        printf("Test_TC_OCC_1_1\n");
        printf("Test_TC_OCC_2_1\n");
        printf("Test_TC_OCC_2_3\n");
        printf("Test_TC_OO_1_1\n");
        printf("Test_TC_OO_2_1\n");
        printf("Test_TC_OO_2_2\n");
        printf("Test_TC_OO_2_4\n");
        printf("Test_TC_PS_1_1\n");
        printf("Test_TC_PS_2_1\n");
        printf("Test_TC_PRS_1_1\n");
        printf("Test_TC_PRS_2_1\n");
        printf("Test_TC_PRS_2_2\n");
        printf("Test_TC_PCC_1_1\n");
        printf("Test_TC_PCC_2_1\n");
        printf("Test_TC_PCC_2_2\n");
        printf("Test_TC_PCC_2_3\n");
        printf("Test_TC_PCC_2_4\n");
        printf("Test_TC_PSCFG_1_1\n");
        printf("Test_TC_PSCFG_2_1\n");
        printf("Test_TC_RH_1_1\n");
        printf("Test_TC_RH_2_1\n");
        printf("Test_TC_SC_5_1\n");
        printf("Test_TC_SC_5_2\n");
        printf("Test_TC_SWTCH_1_1\n");
        printf("Test_TC_SWTCH_2_1\n");
        printf("Test_TC_TMP_1_1\n");
        printf("Test_TC_TMP_2_1\n");
        printf("Test_TC_TSTAT_1_1\n");
        printf("Test_TC_TSTAT_2_1\n");
        printf("Test_TC_TSTAT_2_2\n");
        printf("Test_TC_TSUIC_1_1\n");
        printf("Test_TC_TSUIC_2_1\n");
        printf("Test_TC_TSUIC_2_2\n");
        printf("Test_TC_DGTHREAD_1_1\n");
        printf("Test_TC_DGTHREAD_2_1\n");
        printf("Test_TC_DGTHREAD_2_2\n");
        printf("Test_TC_DGTHREAD_2_3\n");
        printf("Test_TC_DGTHREAD_2_4\n");
        printf("Test_TC_ULABEL_1_1\n");
        printf("Test_TC_ULABEL_2_1\n");
        printf("Test_TC_ULABEL_2_2\n");
        printf("Test_TC_ULABEL_2_3\n");
        printf("Test_TC_ULABEL_2_4\n");
        printf("Test_TC_DGWIFI_1_1\n");
        printf("Test_TC_DGWIFI_2_1\n");
        printf("Test_TC_DGWIFI_2_3\n");
        printf("Test_TC_WNCV_1_1\n");
        printf("Test_TC_WNCV_2_1\n");
        printf("Test_TC_WNCV_2_2\n");
        printf("Test_TC_WNCV_2_3\n");
        printf("Test_TC_WNCV_2_4\n");
        printf("Test_TC_WNCV_2_5\n");
        printf("Test_TC_WNCV_3_1\n");
        printf("Test_TC_WNCV_3_2\n");
        printf("Test_TC_WNCV_3_3\n");
        printf("Test_TC_WNCV_3_4\n");
        printf("Test_TC_WNCV_3_5\n");
        printf("Test_TC_WNCV_4_1\n");
        printf("Test_TC_WNCV_4_2\n");
        printf("Test_TC_WNCV_4_3\n");
        printf("Test_TC_WNCV_4_4\n");
        printf("Test_TC_WNCV_4_5\n");
        printf("TV_TargetNavigatorCluster\n");
        printf("TV_AudioOutputCluster\n");
        printf("TV_ApplicationLauncherCluster\n");
        printf("TV_KeypadInputCluster\n");
        printf("TV_AccountLoginCluster\n");
        printf("TV_WakeOnLanCluster\n");
        printf("TV_ApplicationBasicCluster\n");
        printf("TV_MediaPlaybackCluster\n");
        printf("TV_ChannelCluster\n");
        printf("TV_LowPowerCluster\n");
        printf("TV_ContentLauncherCluster\n");
        printf("TV_MediaInputCluster\n");
        printf("TestCASERecovery\n");
        printf("TestCluster\n");
        printf("TestClusterComplexTypes\n");
        printf("TestConstraints\n");
        printf("TestDelayCommands\n");
        printf("TestEvents\n");
        printf("TestDiscovery\n");
        printf("TestLogCommands\n");
        printf("TestSaveAs\n");
        printf("TestConfigVariables\n");
        printf("TestDescriptorCluster\n");
        printf("TestBasicInformation\n");
        printf("TestFabricRemovalWhileSubscribed\n");
        printf("TestGeneralCommissioning\n");
        printf("TestIdentifyCluster\n");
        printf("TestOperationalCredentialsCluster\n");
        printf("TestModeSelectCluster\n");
        printf("TestSelfFabricRemoval\n");
        printf("TestSystemCommands\n");
        printf("TestBinding\n");
        printf("TestUserLabelCluster\n");
        printf("TestUserLabelClusterConstraints\n");
        printf("TestArmFailSafe\n");
        printf("TestFanControl\n");
        printf("TestAccessControlConstraints\n");
        printf("TestLevelControlWithOnOffDependency\n");
        printf("TestCommissioningWindow\n");
        printf("TestCommissionerNodeId\n");
        printf("TestMultiAdmin\n");
        printf("Test_TC_DGSW_1_1\n");
        printf("TestSubscribe_OnOff\n");
        printf("TestSubscribe_AdministratorCommissioning\n");
        printf("DL_UsersAndCredentials\n");
        printf("DL_LockUnlock\n");
        printf("DL_Schedules\n");
        printf("Test_TC_DRLK_1_1\n");
        printf("Test_TC_DRLK_2_2\n");
        printf("Test_TC_DRLK_2_3\n");
        printf("Test_TC_DRLK_2_4\n");
        printf("Test_TC_DRLK_2_5\n");
        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");
        printf("Test_TC_G_1_1\n");
        printf("Test_TC_G_2_1\n");

        return CHIP_NO_ERROR;
    }
};

class ManualTestList : public Command
{
public:
    ManualTestList() : Command("list-manual"){};
    CHIP_ERROR Run() override
    {
        printf("Test_TC_DD_1_5\n");
        printf("Test_TC_DD_1_6\n");
        printf("Test_TC_DD_1_7\n");
        printf("Test_TC_DD_1_8\n");
        printf("Test_TC_DD_1_9\n");
        printf("Test_TC_DD_1_10\n");
        printf("Test_TC_DD_1_11\n");
        printf("Test_TC_DD_1_12\n");
        printf("Test_TC_DD_1_13\n");
        printf("Test_TC_DD_1_14\n");
        printf("Test_TC_DD_1_15\n");
        printf("Test_TC_DD_2_1\n");
        printf("Test_TC_DD_2_2\n");
        printf("Test_TC_DD_3_1\n");
        printf("Test_TC_DD_3_2\n");
        printf("Test_TC_DD_3_3\n");
        printf("Test_TC_DD_3_4\n");
        printf("Test_TC_DD_3_5\n");
        printf("Test_TC_DD_3_6\n");
        printf("Test_TC_DD_3_7\n");
        printf("Test_TC_DD_3_8\n");
        printf("Test_TC_DD_3_9\n");
        printf("Test_TC_DD_3_10\n");
        printf("Test_TC_DD_3_11\n");
        printf("Test_TC_DD_3_12\n");
        printf("Test_TC_DD_3_13\n");
        printf("Test_TC_DD_3_14\n");
        printf("Test_TC_DD_3_15\n");
        printf("Test_TC_DD_3_16\n");
        printf("Test_TC_DD_3_17\n");
        printf("Test_TC_DD_3_18\n");
        printf("Test_TC_DD_3_19\n");
        printf("Test_TC_DD_3_20\n");
        printf("Test_TC_DD_3_21\n");
        printf("TestGroupDemoCommand\n");
        printf("TestGroupDemoConfig\n");
        printf("Test_TC_G_2_2\n");
        printf("Test_TC_G_2_3\n");
        printf("Test_TC_G_3_2\n");
        printf("Test_TC_BDX_1_1\n");
        printf("Test_TC_BDX_1_2\n");
        printf("Test_TC_BDX_1_3\n");
        printf("Test_TC_BDX_1_4\n");
        printf("Test_TC_BDX_1_5\n");
        printf("Test_TC_BDX_1_6\n");
        printf("Test_TC_BDX_2_1\n");
        printf("Test_TC_BDX_2_2\n");
        printf("Test_TC_BDX_2_3\n");
        printf("Test_TC_BDX_2_4\n");
        printf("Test_TC_BDX_2_5\n");
        printf("Test_TC_BR_1\n");
        printf("Test_TC_BR_2\n");
        printf("Test_TC_BR_3\n");
        printf("Test_TC_BR_4\n");
        printf("Test_TC_DA_1_1\n");
        printf("Test_TC_DA_1_2\n");
        printf("Test_TC_DA_1_3\n");
        printf("Test_TC_DA_1_4\n");
        printf("Test_TC_DA_1_5\n");
        printf("Test_TC_DA_1_6\n");
        printf("Test_TC_BINFO_2_2\n");
        printf("Test_TC_BINFO_2_4\n");
        printf("Test_TC_OPCREDS_3_1\n");
        printf("Test_TC_OPCREDS_3_2\n");
        printf("Test_TC_OPCREDS_3_3\n");
        printf("Test_TC_OPCREDS_3_4\n");
        printf("Test_TC_OPCREDS_3_5\n");
        printf("Test_TC_OPCREDS_3_6\n");
        printf("Test_TC_CNET_4_1\n");
        printf("Test_TC_CNET_4_2\n");
        printf("Test_TC_CNET_4_3\n");
        printf("Test_TC_CNET_4_4\n");
        printf("Test_TC_CNET_4_5\n");
        printf("Test_TC_CNET_4_6\n");
        printf("Test_TC_CNET_4_9\n");
        printf("Test_TC_CNET_4_10\n");
        printf("Test_TC_CNET_4_11\n");
        printf("Test_TC_CNET_4_12\n");
        printf("Test_TC_CNET_4_13\n");
        printf("Test_TC_CNET_4_14\n");
        printf("Test_TC_CNET_4_15\n");
        printf("Test_TC_CNET_4_16\n");
        printf("Test_TC_CNET_4_17\n");
        printf("Test_TC_CNET_4_18\n");
        printf("Test_TC_CNET_4_19\n");
        printf("Test_TC_CNET_4_20\n");
        printf("Test_TC_CNET_4_21\n");
        printf("Test_TC_CNET_4_22\n");
        printf("Test_TC_DLOG_2_1\n");
        printf("Test_TC_DLOG_2_2\n");
        printf("Test_TC_DLOG_3_1\n");
        printf("Test_TC_DESC_2_1\n");
        printf("Test_TC_DGETH_3_2\n");
        printf("Test_TC_CGEN_2_2\n");
        printf("Test_TC_DGGEN_2_2\n");
        printf("Test_TC_DGGEN_2_3\n");
        printf("Test_TC_DGGEN_3_1\n");
        printf("Test_TC_I_3_2\n");
        printf("Test_TC_ILL_3_1\n");
        printf("Test_TC_IDM_1_1\n");
        printf("Test_TC_IDM_1_2\n");
        printf("Test_TC_IDM_2_1\n");
        printf("Test_TC_IDM_2_2\n");
        printf("Test_TC_IDM_3_1\n");
        printf("Test_TC_IDM_3_2\n");
        printf("Test_TC_IDM_4_1\n");
        printf("Test_TC_IDM_4_2\n");
        printf("Test_TC_IDM_4_3\n");
        printf("Test_TC_IDM_4_4\n");
        printf("Test_TC_IDM_5_1\n");
        printf("Test_TC_IDM_5_2\n");
        printf("Test_TC_IDM_6_1\n");
        printf("Test_TC_IDM_6_2\n");
        printf("Test_TC_IDM_6_3\n");
        printf("Test_TC_IDM_6_4\n");
        printf("Test_TC_IDM_7_1\n");
        printf("Test_TC_IDM_8_1\n");
        printf("Test_TC_LOWPOWER_2_2\n");
        printf("Test_TC_APPLAUNCHER_3_7_1\n");
        printf("Test_TC_APPLAUNCHER_3_8_1\n");
        printf("Test_TC_APPLAUNCHER_3_9_1\n");
        printf("Test_TC_MEDIAINPUT_3_14\n");
        printf("Test_TC_MEDIAINPUT_3_15\n");
        printf("Test_TC_MEDIAINPUT_3_16\n");
        printf("Test_TC_MEDIAINPUT_3_17\n");
        printf("Test_TC_CHANNEL_5_4\n");
        printf("Test_TC_CHANNEL_5_5\n");
        printf("Test_TC_CHANNEL_5_6\n");
        printf("Test_TC_KEYPADINPUT_3_1\n");
        printf("Test_TC_MEDIAPLAYBACK_6_5\n");
        printf("Test_TC_MEDIAPLAYBACK_6_7\n");
        printf("Test_TC_AUDIOOUTPUT_7_3\n");
        printf("Test_TC_AUDIOOUTPUT_7_4\n");
        printf("Test_TC_CONTENTLAUNCHER_10_3\n");
        printf("Test_TC_CONTENTLAUNCHER_10_4\n");
        printf("Test_TC_CONTENTLAUNCHER_10_5\n");
        printf("Test_TC_CONTENTLAUNCHER_10_7\n");
        printf("Test_TC_MC_11_1\n");
        printf("Test_TC_MC_11_2\n");
        printf("Test_TC_ALOGIN_12_2\n");
        printf("Test_TC_CADMIN_1_1\n");
        printf("Test_TC_CADMIN_1_2\n");
        printf("Test_TC_CADMIN_1_7\n");
        printf("Test_TC_CADMIN_1_8\n");
        printf("Test_TC_CADMIN_1_11\n");
        printf("Test_TC_CADMIN_1_12\n");
        printf("Test_TC_CADMIN_1_14\n");
        printf("Test_TC_CADMIN_1_15\n");
        printf("Test_TC_CADMIN_1_16\n");
        printf("Test_TC_CADMIN_1_17\n");
        printf("Test_TC_CADMIN_1_18\n");
        printf("Test_TC_CADMIN_1_19\n");
        printf("Test_TC_CADMIN_1_20\n");
        printf("Test_TC_CADMIN_1_21\n");
        printf("Test_TC_CADMIN_1_22\n");
        printf("Test_TC_CADMIN_1_3\n");
        printf("Test_TC_CADMIN_1_4\n");
        printf("Test_TC_CADMIN_1_5\n");
        printf("Test_TC_CADMIN_1_6\n");
        printf("Test_TC_CADMIN_1_9\n");
        printf("Test_TC_CADMIN_1_10\n");
        printf("Test_TC_CADMIN_1_13\n");
        printf("Test_TC_CADMIN_1_23\n");
        printf("Test_TC_CADMIN_1_24\n");
        printf("Test_TC_MOD_1_2\n");
        printf("Test_TC_MOD_1_3\n");
        printf("Test_TC_MOD_2_1\n");
        printf("Test_TC_MOD_2_2\n");
        printf("Test_TC_MOD_3_1\n");
        printf("Test_TC_MOD_3_2\n");
        printf("Test_TC_MOD_3_3\n");
        printf("Test_TC_MOD_3_4\n");
        printf("Test_TC_SU_1_1\n");
        printf("Test_TC_SU_2_1\n");
        printf("Test_TC_SU_2_2\n");
        printf("Test_TC_SU_2_3\n");
        printf("Test_TC_SU_2_4\n");
        printf("Test_TC_SU_2_5\n");
        printf("Test_TC_SU_2_6\n");
        printf("Test_TC_SU_2_7\n");
        printf("Test_TC_SU_2_8\n");
        printf("Test_TC_SU_3_1\n");
        printf("Test_TC_SU_3_2\n");
        printf("Test_TC_SU_3_3\n");
        printf("Test_TC_SU_3_4\n");
        printf("Test_TC_SU_4_1\n");
        printf("Test_TC_SU_4_2\n");
        printf("Test_TC_PSCFG_2_2\n");
        printf("Test_TC_SC_1_1\n");
        printf("Test_TC_SC_1_2\n");
        printf("Test_TC_SC_1_3\n");
        printf("Test_TC_SC_1_4\n");
        printf("Test_TC_SC_2_1\n");
        printf("Test_TC_SC_2_2\n");
        printf("Test_TC_SC_2_3\n");
        printf("Test_TC_SC_2_4\n");
        printf("Test_TC_SC_3_1\n");
        printf("Test_TC_SC_3_2\n");
        printf("Test_TC_SC_3_3\n");
        printf("Test_TC_SC_3_4\n");
        printf("Test_TC_SC_4_1\n");
        printf("Test_TC_SC_4_2\n");
        printf("Test_TC_SC_4_3\n");
        printf("Test_TC_SC_4_4\n");
        printf("Test_TC_SC_4_5\n");
        printf("Test_TC_SC_4_6\n");
        printf("Test_TC_SC_4_7\n");
        printf("Test_TC_SC_4_8\n");
        printf("Test_TC_SC_4_9\n");
        printf("Test_TC_SC_4_10\n");
        printf("Test_TC_SC_5_3\n");
        printf("Test_TC_SC_6_1\n");
        printf("Test_TC_DGSW_2_1\n");
        printf("Test_TC_DGSW_2_2\n");
        printf("Test_TC_DGSW_2_3\n");
        printf("Test_TC_DGSW_3_2\n");
        printf("Test_TC_DGWIFI_2_2\n");
        printf("Test_TC_DGWIFI_3_2\n");
        printf("Test_TC_WNCV_6_1\n");
        printf("Test_TC_WNCV_7_1\n");
        printf("Test_TC_FLW_2_2\n");
        printf("Test_TC_OCC_3_1\n");
        printf("Test_TC_PS_2_2\n");
        printf("Test_TC_BOOL_2_2\n");
        printf("Test_TC_CC_2_2\n");
        printf("Test_TC_CC_3_4\n");
        printf("Test_TC_CC_4_5\n");
        printf("Test_TC_CC_5_4\n");
        printf("Test_TC_CC_6_4\n");
        printf("Test_TC_CC_7_5\n");
        printf("Test_TC_CC_9_4\n");
        printf("Test_TC_CC_3_1\n");
        printf("Test_TC_CC_7_1\n");
        printf("Test_TC_CC_9_1\n");
        printf("Test_TC_CC_9_2\n");
        printf("Test_TC_CC_9_3\n");
        printf("Test_TC_DRLK_2_1\n");
        printf("Test_TC_DRLK_2_8\n");
        printf("Test_TC_DRLK_2_10\n");
        printf("Test_TC_DRLK_3_1\n");
        printf("Test_TC_DRLK_3_2\n");
        printf("Test_TC_DRLK_3_3\n");
        printf("Test_TC_LCFG_2_1\n");
        printf("Test_TC_LVL_2_3\n");
        printf("Test_TC_LVL_7_1\n");
        printf("Test_TC_LVL_8_1\n");
        printf("Test_TC_OO_2_3\n");
        printf("Test_TC_OO_3_1\n");
        printf("Test_TC_OO_3_2\n");
        printf("Test_TC_RH_2_2\n");
        printf("Test_TC_SWTCH_2_2\n");
        printf("Test_TC_SWTCH_3_2\n");
        printf("Test_TC_TMP_2_2\n");
        printf("Test_TC_TMP_3_1\n");
        printf("Test_TC_TSTAT_3_1\n");
        printf("Test_TC_TSTAT_3_2\n");
        printf("Test_TC_TSUIC_3_1\n");
        printf("Test_TC_DGTHREAD_2_5\n");
        printf("Test_TC_DGTHREAD_3_1\n");
        printf("Test_TC_DGTHREAD_3_2\n");
        printf("Test_TC_DGTHREAD_3_3\n");
        printf("Test_TC_DGTHREAD_3_4\n");
        printf("Test_TC_ACT_2_1\n");
        printf("Test_TC_ACT_2_2\n");
        printf("Test_TC_ACT_3_2\n");
        printf("Test_TC_LTIME_2_1\n");
        printf("Test_TC_LTIME_3_1\n");
        printf("Test_TC_BIND_2_1\n");
        printf("Test_TC_BIND_2_2\n");
        printf("Test_TC_BIND_2_3\n");
        printf("Test_TC_S_1_1\n");
        printf("Test_TC_S_2_1\n");
        printf("Test_TC_S_2_2\n");
        printf("Test_TC_S_2_3\n");
        printf("Test_TC_S_3_1\n");
        printf("Test_TC_PCC_3_1\n");
        printf("Test_TC_ACL_2_5\n");
        printf("Test_TC_ACL_2_6\n");
        printf("Test_TC_BRBINFO_2_2\n");
        printf("Test_TC_BRBINFO_2_3\n");
        printf("Test_TC_ACE_1_2\n");

        return CHIP_NO_ERROR;
    }
};

class TestAccessControlClusterSuite : public TestCommand
{
public:
    TestAccessControlClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestAccessControlCluster", 24, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestAccessControlClusterSuite() {}

    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
    {
        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::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNonNull("acl[0].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 0U));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 1UL));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 2UL));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 3U));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[0].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(), 4ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[1]", iter_3.GetValue(), 5ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[2]", iter_3.GetValue(), 6ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[3]", iter_3.GetValue(), 7ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[1].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 8U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 9UL));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 10UL));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 11U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[1].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[2].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[0]", iter_3.GetValue(), 12ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[1]", iter_3.GetValue(), 13ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[2]", iter_3.GetValue(), 14ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[3]", iter_3.GetValue(), 15ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[2].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[2].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 16U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 17UL));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 18UL));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 19U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[2].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 3));
                    VerifyOrReturn(CheckValue("acl[3].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[3].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[3].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[3].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[3].subjects.Value()[0]", iter_3.GetValue(), 20ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[3].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[3].subjects.Value()[1]", iter_3.GetValue(), 21ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[3].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[3].subjects.Value()[2]", iter_3.GetValue(), 22ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[3].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[3].subjects.Value()[3]", iter_3.GetValue(), 23ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[3].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[3].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[3].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[3].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[3].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 24U));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[3].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[3].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[3].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 25UL));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[3].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[3].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[3].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 26UL));
                        VerifyOrReturn(CheckValueNonNull("acl[3].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[3].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 27U));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[3].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 4));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[1].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[1].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 2));
                }
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNonNull("acl[0].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 0U));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 1UL));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[0].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 2UL));
                        VerifyOrReturn(CheckValueNonNull("acl[0].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[0].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 3U));
                        VerifyOrReturn(CheckValueNull("acl[0].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[0].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(), 4ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[1]", iter_3.GetValue(), 5ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[2]", iter_3.GetValue(), 6ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[3]", iter_3.GetValue(), 7ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[1].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 8U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 9UL));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 10UL));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 11U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[1].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[2].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[0]", iter_3.GetValue(), 12ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[1]", iter_3.GetValue(), 13ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[2]", iter_3.GetValue(), 14ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[3]", iter_3.GetValue(), 15ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[2].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[2].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 16U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 17UL));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 18UL));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 19U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[2].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 3));
                    VerifyOrReturn(CheckValue("acl[3].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[3].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[3].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[3].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[3].subjects.Value()[0]", iter_3.GetValue(), 20ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[3].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[3].subjects.Value()[1]", iter_3.GetValue(), 21ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[3].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[3].subjects.Value()[2]", iter_3.GetValue(), 22ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[3].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[3].subjects.Value()[3]", iter_3.GetValue(), 23ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[3].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[3].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[3].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(CheckValueNonNull("acl[3].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[3].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 24U));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[3].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[3].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[3].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 25UL));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[3].targets.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValueNonNull("acl[3].targets.Value()[2].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[3].targets.Value()[2].cluster.Value()", iter_3.GetValue().cluster.Value(), 26UL));
                        VerifyOrReturn(CheckValueNonNull("acl[3].targets.Value()[2].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[3].targets.Value()[2].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 27U));
                        VerifyOrReturn(CheckValueNull("acl[3].targets.Value()[2].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[3].targets.Value()", iter_3, 3));
                    }
                    VerifyOrReturn(CheckValue("acl[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 4));
                }
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[0].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for commissionee");
            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, "Write entries");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 1UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 2UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 3U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 4ULL;
                    listHolder_3->mList[1]                  = 5ULL;
                    listHolder_3->mList[2]                  = 6ULL;
                    listHolder_3->mList[3]                  = 7ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 8U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 9UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 10UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 11U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[1].fabricIndex = 0U;

                listHolder_0->mList[2].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[2].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[2].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 12ULL;
                    listHolder_3->mList[1]                  = 13ULL;
                    listHolder_3->mList[2]                  = 14ULL;
                    listHolder_3->mList[3]                  = 15ULL;
                    listHolder_0->mList[2].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[2].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 16U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 17UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 18UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 19U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[2].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[2].fabricIndex = 0U;

                listHolder_0->mList[3].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[3].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[3].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 20ULL;
                    listHolder_3->mList[1]                  = 21ULL;
                    listHolder_3->mList[2]                  = 22ULL;
                    listHolder_3->mList[3]                  = 23ULL;
                    listHolder_0->mList[3].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[3].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 24U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 25UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 26UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 27U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[3].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[3].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write entries empty lists");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>();
                listHolder_0->mList[1].targets.SetNonNull();

                listHolder_0->mList[1].targets.Value() =
                    chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write entry invalid privilege");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write entry invalid auth mode");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(1);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write entry invalid subject");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 0ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write entry invalid target");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNull();
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Write entry too many subjects");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(20);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 1ULL;
                    listHolder_3->mList[1]                  = 2ULL;
                    listHolder_3->mList[2]                  = 3ULL;
                    listHolder_3->mList[3]                  = 4ULL;
                    listHolder_3->mList[4]                  = 5ULL;
                    listHolder_3->mList[5]                  = 6ULL;
                    listHolder_3->mList[6]                  = 7ULL;
                    listHolder_3->mList[7]                  = 8ULL;
                    listHolder_3->mList[8]                  = 9ULL;
                    listHolder_3->mList[9]                  = 10ULL;
                    listHolder_3->mList[10]                 = 11ULL;
                    listHolder_3->mList[11]                 = 12ULL;
                    listHolder_3->mList[12]                 = 13ULL;
                    listHolder_3->mList[13]                 = 14ULL;
                    listHolder_3->mList[14]                 = 15ULL;
                    listHolder_3->mList[15]                 = 16ULL;
                    listHolder_3->mList[16]                 = 17ULL;
                    listHolder_3->mList[17]                 = 18ULL;
                    listHolder_3->mList[18]                 = 19ULL;
                    listHolder_3->mList[19]                 = 20ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 20);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Write entry too many targets");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(20);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 1U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNull();
                    listHolder_3->mList[1].endpoint.SetNonNull();
                    listHolder_3->mList[1].endpoint.Value() = 2U;
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNull();
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 3U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_3->mList[3].cluster.SetNull();
                    listHolder_3->mList[3].endpoint.SetNonNull();
                    listHolder_3->mList[3].endpoint.Value() = 4U;
                    listHolder_3->mList[3].deviceType.SetNull();

                    listHolder_3->mList[4].cluster.SetNull();
                    listHolder_3->mList[4].endpoint.SetNonNull();
                    listHolder_3->mList[4].endpoint.Value() = 5U;
                    listHolder_3->mList[4].deviceType.SetNull();

                    listHolder_3->mList[5].cluster.SetNull();
                    listHolder_3->mList[5].endpoint.SetNonNull();
                    listHolder_3->mList[5].endpoint.Value() = 6U;
                    listHolder_3->mList[5].deviceType.SetNull();

                    listHolder_3->mList[6].cluster.SetNull();
                    listHolder_3->mList[6].endpoint.SetNonNull();
                    listHolder_3->mList[6].endpoint.Value() = 7U;
                    listHolder_3->mList[6].deviceType.SetNull();

                    listHolder_3->mList[7].cluster.SetNull();
                    listHolder_3->mList[7].endpoint.SetNonNull();
                    listHolder_3->mList[7].endpoint.Value() = 8U;
                    listHolder_3->mList[7].deviceType.SetNull();

                    listHolder_3->mList[8].cluster.SetNull();
                    listHolder_3->mList[8].endpoint.SetNonNull();
                    listHolder_3->mList[8].endpoint.Value() = 9U;
                    listHolder_3->mList[8].deviceType.SetNull();

                    listHolder_3->mList[9].cluster.SetNull();
                    listHolder_3->mList[9].endpoint.SetNonNull();
                    listHolder_3->mList[9].endpoint.Value() = 10U;
                    listHolder_3->mList[9].deviceType.SetNull();

                    listHolder_3->mList[10].cluster.SetNull();
                    listHolder_3->mList[10].endpoint.SetNonNull();
                    listHolder_3->mList[10].endpoint.Value() = 11U;
                    listHolder_3->mList[10].deviceType.SetNull();

                    listHolder_3->mList[11].cluster.SetNull();
                    listHolder_3->mList[11].endpoint.SetNonNull();
                    listHolder_3->mList[11].endpoint.Value() = 12U;
                    listHolder_3->mList[11].deviceType.SetNull();

                    listHolder_3->mList[12].cluster.SetNull();
                    listHolder_3->mList[12].endpoint.SetNonNull();
                    listHolder_3->mList[12].endpoint.Value() = 13U;
                    listHolder_3->mList[12].deviceType.SetNull();

                    listHolder_3->mList[13].cluster.SetNull();
                    listHolder_3->mList[13].endpoint.SetNonNull();
                    listHolder_3->mList[13].endpoint.Value() = 14U;
                    listHolder_3->mList[13].deviceType.SetNull();

                    listHolder_3->mList[14].cluster.SetNull();
                    listHolder_3->mList[14].endpoint.SetNonNull();
                    listHolder_3->mList[14].endpoint.Value() = 15U;
                    listHolder_3->mList[14].deviceType.SetNull();

                    listHolder_3->mList[15].cluster.SetNull();
                    listHolder_3->mList[15].endpoint.SetNonNull();
                    listHolder_3->mList[15].endpoint.Value() = 16U;
                    listHolder_3->mList[15].deviceType.SetNull();

                    listHolder_3->mList[16].cluster.SetNull();
                    listHolder_3->mList[16].endpoint.SetNonNull();
                    listHolder_3->mList[16].endpoint.Value() = 17U;
                    listHolder_3->mList[16].deviceType.SetNull();

                    listHolder_3->mList[17].cluster.SetNull();
                    listHolder_3->mList[17].endpoint.SetNonNull();
                    listHolder_3->mList[17].endpoint.Value() = 18U;
                    listHolder_3->mList[17].deviceType.SetNull();

                    listHolder_3->mList[18].cluster.SetNull();
                    listHolder_3->mList[18].endpoint.SetNonNull();
                    listHolder_3->mList[18].endpoint.Value() = 19U;
                    listHolder_3->mList[18].deviceType.SetNull();

                    listHolder_3->mList[19].cluster.SetNull();
                    listHolder_3->mList[19].endpoint.SetNonNull();
                    listHolder_3->mList[19].endpoint.Value() = 20U;
                    listHolder_3->mList[19].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              20);
                }
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write too many entries");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(5);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 1UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 2UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 3U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 4ULL;
                    listHolder_3->mList[1]                  = 5ULL;
                    listHolder_3->mList[2]                  = 6ULL;
                    listHolder_3->mList[3]                  = 7ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 8U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 9UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 10UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 11U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[1].fabricIndex = 0U;

                listHolder_0->mList[2].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[2].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[2].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 12ULL;
                    listHolder_3->mList[1]                  = 13ULL;
                    listHolder_3->mList[2]                  = 14ULL;
                    listHolder_3->mList[3]                  = 15ULL;
                    listHolder_0->mList[2].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[2].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 16U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 17UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 18UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 19U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[2].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[2].fabricIndex = 0U;

                listHolder_0->mList[3].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[3].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[3].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 20ULL;
                    listHolder_3->mList[1]                  = 21ULL;
                    listHolder_3->mList[2]                  = 22ULL;
                    listHolder_3->mList[3]                  = 23ULL;
                    listHolder_0->mList[3].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[3].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 24U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 25UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 26UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 27U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[3].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[3].fabricIndex = 0U;

                listHolder_0->mList[4].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[4].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[4].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 28ULL;
                    listHolder_3->mList[1]                  = 29ULL;
                    listHolder_3->mList[2]                  = 30ULL;
                    listHolder_3->mList[3]                  = 31ULL;
                    listHolder_0->mList[4].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[4].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(3);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 32U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 33UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNull();

                    listHolder_3->mList[2].cluster.SetNonNull();
                    listHolder_3->mList[2].cluster.Value() = 34UL;
                    listHolder_3->mList[2].endpoint.SetNonNull();
                    listHolder_3->mList[2].endpoint.Value() = 35U;
                    listHolder_3->mList[2].deviceType.SetNull();

                    listHolder_0->mList[4].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              3);
                }
                listHolder_0->mList[4].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 5);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Restore ACL");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Verify");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Validate resource minima (SubjectsPerAccessControlEntry)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::SubjectsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Validate resource minima (TargetsPerAccessControlEntry)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::TargetsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Validate resource minima (AccessControlEntriesPerFabric)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::AccessControlEntriesPerFabric::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_1_1Suite : public TestCommand
{
public:
    Test_TC_ACL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads ClusterRevision attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads FeatureMap attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads optional attribute (Extension) in AttributeList");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads AcceptedCommandList attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads GeneratedCommandList attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_1Suite : public TestCommand
{
public:
    Test_TC_ACL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            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;
        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, "TH reads SubjectsPerAccessControlEntry attribute from DUT");
            VerifyOrDo(!ShouldSkip("ACL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::SubjectsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads TargetsPerAccessControlEntry attribute from DUT");
            VerifyOrDo(!ShouldSkip("ACL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::TargetsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AccessControlEntriesPerFabric attribute from DUT");
            VerifyOrDo(!ShouldSkip("ACL.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::AccessControlEntriesPerFabric::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_2Suite : public TestCommand
{
public:
    Test_TC_ACL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_2", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_2Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::ClusterId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 31UL));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "TH1 reads DUT Descriptor cluster ServerList attribute from Endpoint 0");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::ServerList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH1 reads DUT Descriptor cluster ServerList attribute from every Endpoint except 0");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_3Suite : public TestCommand
{
public:
    Test_TC_ACL_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_3", 20, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("D_OK_EMPTY", &mDOkEmpty);
        AddArgument("D_OK_SINGLE", &mDOkSingle);
        AddArgument("D_OK_FULL", &mDOkFull);
        AddArgument("D_BAD_LENGTH", &mDBadLength);
        AddArgument("D_BAD_STRUCT", &mDBadStruct);
        AddArgument("D_BAD_LIST", &mDBadList);
        AddArgument("D_BAD_ELEM", &mDBadElem);
        AddArgument("D_BAD_OVERFLOW", &mDBadOverflow);
        AddArgument("D_BAD_UNDERFLOW", &mDBadUnderflow);
        AddArgument("D_BAD_NONE", &mDBadNone);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_3Suite() {}

    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<chip::ByteSpan> mDOkEmpty;
    chip::Optional<chip::ByteSpan> mDOkSingle;
    chip::Optional<chip::ByteSpan> mDOkFull;
    chip::Optional<chip::ByteSpan> mDBadLength;
    chip::Optional<chip::ByteSpan> mDBadStruct;
    chip::Optional<chip::ByteSpan> mDBadList;
    chip::Optional<chip::ByteSpan> mDBadElem;
    chip::Optional<chip::ByteSpan> mDBadOverflow;
    chip::Optional<chip::ByteSpan> mDBadUnderflow;
    chip::Optional<chip::ByteSpan> mDBadNone;
    chip::Optional<uint16_t> mTimeout;

    uint8_t CurrentFabricIndex;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                CurrentFabricIndex = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 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));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("extension", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "extension[0].data", iter_0.GetValue().data,
                        mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2)));
                    VerifyOrReturn(CheckValue("extension[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 1));
                }
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("extension", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "extension[0].data", iter_0.GetValue().data,
                        mDOkSingle.HasValue()
                            ? mDOkSingle.Value()
                            : chip::ByteSpan(chip::Uint8::from_const_char(
                                                 "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64"
                                                 "\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65"
                                                 "\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63"
                                                 "\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                                             71)));
                    VerifyOrReturn(CheckValue("extension[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 1));
                }
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("extension", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "extension[0].data", iter_0.GetValue().data,
                        mDOkFull.HasValue()
                            ? mDOkFull.Value()
                            : chip::ByteSpan(
                                  chip::Uint8::from_const_char(
                                      "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54"
                                      "\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74"
                                      "\x20\x6C\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67"
                                      "\x00\xD0\x00\x00\xF1\xFF\x02\x00\x31\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54"
                                      "\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74"
                                      "\x20\x61\x67\x61\x69\x6E\x2E\x2E\x2E\x2E\x2E\x00\x18"),
                                  128)));
                    VerifyOrReturn(CheckValue("extension[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 1));
                }
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("extension", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "extension[0].data", iter_0.GetValue().data,
                        mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2)));
                    VerifyOrReturn(CheckValue("extension[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 1));
                }
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 0));
                }
            }
            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;
        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, "TH1 reads DUT Endpoint 0 OperationalCredentials cluster CurrentFabricIndex attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1. struct: Data field: D_OK_EMPTY : 1718");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data =
                    mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1.struct Data field: D_OK_SINGLE "
                    ":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E67206"
                    "17320612063686172737472696E670018");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDOkSingle.HasValue()
                           ? mDOkSingle.Value()
                           : chip::ByteSpan(
                          chip::Uint8::from_const_char(
                              "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69"
                                     "\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76"
                                     "\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                          71);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1.struct Data field: D_OK_FULL "
                    ":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E67206"
                    "17320612063686172737472696E6700D00000F1FF02003148656C6C6F20576F726C642E205468697320697320612073696E676C6520656"
                    "C656D656E7420616761696E2E2E2E2E2E0018");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDOkFull.HasValue()
                           ? mDOkFull.Value()
                           : chip::ByteSpan(chip::Uint8::from_const_char(
                                         "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20"
                                                "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65"
                                                "\x6E\x74\x20\x6C\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72"
                                                "\x69\x6E\x67\x00\xD0\x00\x00\xF1\xFF\x02\x00\x31\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C"
                                                "\x64\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C"
                                                "\x65\x6D\x65\x6E\x74\x20\x61\x67\x61\x69\x6E\x2E\x2E\x2E\x2E\x2E\x00\x18"),
                                            128);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1 .struct Data field: D_BAD_LENGTH "
                    ":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E67206"
                    "17320612063686172737472696E6700D00000F1FF02003248656C6C6F20576F726C642E205468697320697320612073696E676C6520656"
                    "C656D656E7420616761696E2E2E2E2E2E2E0018");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDBadLength.HasValue()
                           ? mDBadLength.Value()
                           : chip::ByteSpan(chip::Uint8::from_const_char(
                                         "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20"
                                                "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65"
                                                "\x6E\x74\x20\x6C\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72"
                                                "\x69\x6E\x67\x00\xD0\x00\x00\xF1\xFF\x02\x00\x32\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C"
                                                "\x64\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C"
                                                "\x65\x6D\x65\x6E\x74\x20\x61\x67\x61\x69\x6E\x2E\x2E\x2E\x2E\x2E\x2E\x00\x18"),
                                            129);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_STRUCT : 1518");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data =
                    mDBadStruct.HasValue() ? mDBadStruct.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x15\x18"), 2);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_LIST "
                    ":3701D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E672"
                    "0617320612063686172737472696E670018");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDBadList.HasValue()
                           ? mDBadList.Value()
                           : chip::ByteSpan(
                          chip::Uint8::from_const_char(
                              "\x37\x01\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68"
                                     "\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69"
                                     "\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                          72);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_ELEM "
                    ":17103D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E67206173206120636"
                    "86172737472696E670018");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDBadElem.HasValue()
                           ? mDBadElem.Value()
                           : chip::ByteSpan(chip::Uint8::from_const_char(
                                         "\x17\x10\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69\x73\x20\x69"
                                                "\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76"
                                                "\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                                            65);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1 .struct Data field: D_BAD_OVERFLOW : "
                    "17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E672061"
                    "7320612063686172737472696E670018FF");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDBadOverflow.HasValue()
                           ? mDBadOverflow.Value()
                           : chip::ByteSpan(
                          chip::Uint8::from_const_char(
                              "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69"
                                     "\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76"
                                     "\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18\xFF"),
                          72);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_UNDERFLOW "
                    ":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E67206"
                    "17320612063686172737472696E6700");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDBadUnderflow.HasValue()
                           ? mDBadUnderflow.Value()
                           : chip::ByteSpan(
                          chip::Uint8::from_const_char(
                              "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69"
                                     "\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76"
                                     "\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00"),
                          70);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15,
                    "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1.struct Data field: D_BAD_NONE");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data =
                    mDBadNone.HasValue() ? mDBadNone.Value() : chip::ByteSpan(chip::Uint8::from_const_char(""), 0);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(
                16,
                "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 2 elements . value is list of AccessControlExtensionStruct containing 2 "
                "elements . first element contains Data field: D_OK_EMPTY 1718 . second element contains Data field: D_OK_SINGLE "
                "17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E6720617320"
                "612063686172737472696E670018");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data =
                    mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2);
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].data        = mDOkSingle.HasValue()
                           ? mDOkSingle.Value()
                           : chip::ByteSpan(
                          chip::Uint8::from_const_char(
                              "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69"
                                     "\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76"
                                     "\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                          71);
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is an empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_4Suite : public TestCommand
{
public:
    Test_TC_ACL_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_4", 45, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("CAT1", 0, UINT64_MAX, &mCat1);
        AddArgument("CAT2", 0, UINT64_MAX, &mCat2);
        AddArgument("CAT3", 0, UINT64_MAX, &mCat3);
        AddArgument("CAT4", 0, UINT64_MAX, &mCat4);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_4Suite() {}

    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<uint64_t> mCat1;
    chip::Optional<uint64_t> mCat2;
    chip::Optional<uint64_t> mCat3;
    chip::Optional<uint64_t> mCat4;
    chip::Optional<uint16_t> mTimeout;

    chip::NodeId CommissionerNodeId;
    uint8_t CurrentFabricIndex;
    uint16_t MAXSUBJECTS;
    uint16_t TargetsPerAccessControlEntry;
    uint16_t MAXENTRIES;

    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
    {
        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));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                CommissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                CurrentFabricIndex = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(), 111ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[1]", iter_3.GetValue(), 222ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[2]", iter_3.GetValue(), 333ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[3]", iter_3.GetValue(), 444ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[1].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].cluster.Value()", iter_3.GetValue().cluster.Value(), 11UL));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 22U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[1].targets.Value()", iter_3, 1));
                    }
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[2].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[0]", iter_3.GetValue(), 555ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[1]", iter_3.GetValue(), 666ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[2]", iter_3.GetValue(), 777ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[3]", iter_3.GetValue(), 888ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[2].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[2].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].cluster.Value()", iter_3.GetValue().cluster.Value(), 55UL));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 66U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[2].targets.Value()", iter_3, 1));
                    }
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 3));
                }
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 4U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(), 444ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[1]", iter_3.GetValue(), 333ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[2]", iter_3.GetValue(), 222ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[3]", iter_3.GetValue(), 111ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[1].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].cluster.Value()", iter_3.GetValue().cluster.Value(), 44UL));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 33U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[1].targets.Value()", iter_3, 1));
                    }
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[2].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[0]", iter_3.GetValue(), 888ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[1]", iter_3.GetValue(), 777ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[2]", iter_3.GetValue(), 666ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[3]", iter_3.GetValue(), 555ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[2].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[2].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].cluster.Value()", iter_3.GetValue().cluster.Value(), 88UL));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 77U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[2].targets.Value()", iter_3, 1));
                    }
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 3));
                }
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(), 111ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[1]", iter_3.GetValue(), 222ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[2]", iter_3.GetValue(), 333ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[3]", iter_3.GetValue(), 444ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[1].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].cluster.Value()", iter_3.GetValue().cluster.Value(), 11UL));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 22U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 33UL));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[1].deviceType.Value()", iter_3.GetValue().deviceType.Value(), 44UL));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[1].targets.Value()", iter_3, 2));
                    }
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[2].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[0]", iter_3.GetValue(), 555ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[1]", iter_3.GetValue(), 666ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[2]", iter_3.GetValue(), 777ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[3]", iter_3.GetValue(), 888ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[2].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNonNull("acl[2].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].cluster.Value()", iter_3.GetValue().cluster.Value(), 55UL));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 66U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 77UL));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[1].deviceType.Value()", iter_3.GetValue().deviceType.Value(), 88UL));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[2].targets.Value()", iter_3, 2));
                    }
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 3));
                }
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[1].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNonNull("acl[1].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].cluster.Value()", iter_3.GetValue().cluster.Value(), 11UL));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 22U));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[1].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 33UL));
                        VerifyOrReturn(CheckValueNull("acl[1].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNonNull("acl[1].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckValue("acl[1].targets.Value()[1].deviceType.Value()", iter_3.GetValue().deviceType.Value(), 44UL));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[1].targets.Value()", iter_3, 2));
                    }
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNull("acl[2].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNonNull("acl[2].targets", iter_0.GetValue().targets));
                    {
                        auto iter_3 = iter_0.GetValue().targets.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].cluster.Value()", iter_3.GetValue().cluster.Value(), 55UL));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[0].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[0].endpoint.Value()", iter_3.GetValue().endpoint.Value(), 66U));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[0].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().targets.Value())>(
                            "acl[2].targets.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[1].cluster", iter_3.GetValue().cluster));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[1].cluster.Value()", iter_3.GetValue().cluster.Value(), 77UL));
                        VerifyOrReturn(CheckValueNull("acl[2].targets.Value()[1].endpoint", iter_3.GetValue().endpoint));
                        VerifyOrReturn(CheckValueNonNull("acl[2].targets.Value()[1].deviceType", iter_3.GetValue().deviceType));
                        VerifyOrReturn(
                            CheckValue("acl[2].targets.Value()[1].deviceType.Value()", iter_3.GetValue().deviceType.Value(), 88UL));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().targets.Value())>("acl[2].targets.Value()", iter_3, 2));
                    }
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 3));
                }
            }
            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::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 1U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(), 111ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[1]", iter_3.GetValue(), 222ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[2]", iter_3.GetValue(), 333ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[3]", iter_3.GetValue(), 444ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNull("acl[1].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[2].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[0]", iter_3.GetValue(), 555ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[1]", iter_3.GetValue(), 666ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[2]", iter_3.GetValue(), 777ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[2].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[2].subjects.Value()[3]", iter_3.GetValue(), 888ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[2].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNull("acl[2].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 3));
                }
            }
            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::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNull("acl[1].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[1].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 2));
                }
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 2U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[1].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[1].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 2));
                }
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MAXSUBJECTS = value;
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(),
                                                  mCat1.HasValue() ? mCat1.Value() : 65520ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[1]", iter_3.GetValue(),
                                                  mCat2.HasValue() ? mCat2.Value() : 65521ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 2));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[2]", iter_3.GetValue(),
                                                  mCat3.HasValue() ? mCat3.Value() : 65522ULL));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 3));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[3]", iter_3.GetValue(),
                                                  mCat4.HasValue() ? mCat4.Value() : 65523ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 4));
                    }
                    VerifyOrReturn(CheckValueNull("acl[1].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 2));
                }
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TargetsPerAccessControlEntry = value;
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MAXENTRIES = value;
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[1].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[1].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 2));
                    VerifyOrReturn(CheckValue("acl[2].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[2].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNull("acl[2].subjects", iter_0.GetValue().subjects));
                    VerifyOrReturn(CheckValueNull("acl[2].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 3));
                }
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, CurrentFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Step 1: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, "Read the commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Step 2:TH1 reads DUT Endpoint 0 OperationalCredentials cluster CurrentFabricIndex attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Step 3:TH1 reads DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(
                4,
                "Step 4:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of AccessControlEntryStruct "
                "containing 3 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE (2) Subjects field: [N1] "
                "Targets field: null 2 . struct Privilege field: View (1) AuthMode field: CASE (3) Subjects field: [111, 222, 333, "
                "444] Targets field: [{Cluster: 11}, {Endpoint: 22}] 3..struct Privilege field: Operate (3) AuthMode field: Group "
                "(3) Subjects field: [555, 666, 777, 888] Targets field: [{Cluster: 55}, {Endpoint: 66}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 111ULL;
                    listHolder_3->mList[1]                  = 222ULL;
                    listHolder_3->mList[2]                  = 333ULL;
                    listHolder_3->mList[3]                  = 444ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 11UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 22U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[2].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[2].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[2].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 555ULL;
                    listHolder_3->mList[1]                  = 666ULL;
                    listHolder_3->mList[2]                  = 777ULL;
                    listHolder_3->mList[3]                  = 888ULL;
                    listHolder_0->mList[2].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[2].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 55UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 66U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[2].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[2].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Step 5:TH1 reads DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(
                6,
                "Step 6:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of AccessControlEntryStruct "
                "containing 3 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE (2) Subjects field: [N1] "
                "Targets field: null 2.struct Privilege field: Manage (4) AuthMode field: Group (3) Subjects field: [444, 333, "
                "222, 111] Targets field: [{Cluster: 44}, {Endpoint: 33}] 3.struct Privilege field: Administer (5) AuthMode field: "
                "CASE (2) Subjects field: [888, 777, 666, 555] Targets field: [{Cluster: 88}, {Endpoint: 77}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(4);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 444ULL;
                    listHolder_3->mList[1]                  = 333ULL;
                    listHolder_3->mList[2]                  = 222ULL;
                    listHolder_3->mList[3]                  = 111ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 44UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 33U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[2].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[2].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[2].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 888ULL;
                    listHolder_3->mList[1]                  = 777ULL;
                    listHolder_3->mList[2]                  = 666ULL;
                    listHolder_3->mList[3]                  = 555ULL;
                    listHolder_0->mList[2].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[2].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 88UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 77U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[2].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[2].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Step 7:TH1 reads DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8,
                    "Step 8:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 3 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: View (1) AuthMode field: CASE (2) "
                    "Subjects field: [111, 222, 333, 444] Targets field: [{Cluster: 11, Endpoint: 22}, {Cluster: 33, DeviceType: "
                    "44}] 3.struct Privilege field: Operate (3) AuthMode field: Group (3) Subjects field: [555, 666, 777, 888] "
                    "Targets field: [{Cluster: 55, Endpoint: 66}, {Cluster: 77, DeviceType: 88}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 111ULL;
                    listHolder_3->mList[1]                  = 222ULL;
                    listHolder_3->mList[2]                  = 333ULL;
                    listHolder_3->mList[3]                  = 444ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(2);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 11UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 22U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 33UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNonNull();
                    listHolder_3->mList[1].deviceType.Value() = 44UL;

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              2);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[2].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[2].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[2].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 555ULL;
                    listHolder_3->mList[1]                  = 666ULL;
                    listHolder_3->mList[2]                  = 777ULL;
                    listHolder_3->mList[3]                  = 888ULL;
                    listHolder_0->mList[2].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[2].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(2);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 55UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 66U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 77UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNonNull();
                    listHolder_3->mList[1].deviceType.Value() = 88UL;

                    listHolder_0->mList[2].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              2);
                }
                listHolder_0->mList[2].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Step 9:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "Step 10:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 3 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: View (1) AuthMode field: CASE (2) "
                    "Subjects field: null Targets field: [{Cluster: 11, Endpoint: 22}, {Cluster: 33, DeviceType: 44}] 3.struct "
                    "Privilege field: Operate (3) AuthMode field: Group (3) Subjects field: null Targets field: [{Cluster: 55, "
                    "Endpoint: 66}, {Cluster: 77, DeviceType: 88}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(2);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 11UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 22U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 33UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNonNull();
                    listHolder_3->mList[1].deviceType.Value() = 44UL;

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              2);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[2].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[2].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[2].subjects.SetNull();
                listHolder_0->mList[2].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(2);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 55UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 66U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_3->mList[1].cluster.SetNonNull();
                    listHolder_3->mList[1].cluster.Value() = 77UL;
                    listHolder_3->mList[1].endpoint.SetNull();
                    listHolder_3->mList[1].deviceType.SetNonNull();
                    listHolder_3->mList[1].deviceType.Value() = 88UL;

                    listHolder_0->mList[2].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              2);
                }
                listHolder_0->mList[2].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Step 11:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12,
                    "Step 12:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 3 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: View (1) AuthMode field: CASE (2) "
                    "Subjects field: [111, 222, 333, 444] Targets field: null 3.struct Privilege field: Operate (3) AuthMode "
                    "field: Group (3) Subjects field: [555, 666, 777, 888] Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 111ULL;
                    listHolder_3->mList[1]                  = 222ULL;
                    listHolder_3->mList[2]                  = 333ULL;
                    listHolder_3->mList[3]                  = 444ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[2].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[2].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[2].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 555ULL;
                    listHolder_3->mList[1]                  = 666ULL;
                    listHolder_3->mList[2]                  = 777ULL;
                    listHolder_3->mList[3]                  = 888ULL;
                    listHolder_0->mList[2].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[2].targets.SetNull();
                listHolder_0->mList[2].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Step 13:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "Step 14:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: Group (3) "
                    "Subjects field: null Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Step 15:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16,
                    "Step 16:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: ProxyView (2) AuthMode field: CASE (2) "
                    "Subjects field: null Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(2);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Step 17:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Step 18:TH1 reads DUT AccessControl cluster SubjectsPerAccessControlEntry attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::SubjectsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19,
                    "Step 19:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: list of MAXSUBJECTS random node IDs (stored as SUBJECTS) Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Step 20:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21,
                    "Step 21:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: [CAT1, CAT2, CAT3, CAT4] Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(4);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = mCat1.HasValue() ? mCat1.Value() : 65520ULL;
                    listHolder_3->mList[1]                  = mCat2.HasValue() ? mCat2.Value() : 65521ULL;
                    listHolder_3->mList[2]                  = mCat3.HasValue() ? mCat3.Value() : 65522ULL;
                    listHolder_3->mList[3]                  = mCat4.HasValue() ? mCat4.Value() : 65523ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 4);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Step 22:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Step 23:TH1 reads AccessControl cluster TargetsPerAccessControlEntry attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::TargetsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24,
                    "Step 24:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field:null Targets field: list of MAXTARGETS targets {Cluster: random} (stored as TARGETS)");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "Step 25:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "Step 26:TH1 reads AccessControl cluster AccessControlEntriesPerFabric attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::AccessControlEntriesPerFabric::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27,
                    "Step 27:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing MAXENTRIES elements 1.struct Privilege field: Administer (5) AuthMode "
                    "field: CASE (2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode "
                    "field: CASE (2) Subjects field: null Targets field: null subsequent elements same as second element");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[2].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[2].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[2].subjects.SetNull();
                listHolder_0->mList[2].targets.SetNull();
                listHolder_0->mList[2].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Step 28:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29,
                    "Step 29:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: PASE (1) "
                    "Subjects field: null Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(1);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Step 30:TH1 reads AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31,
                    "Step 31:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Administer (5) AuthMode field: Group "
                    "(3) Subjects field: null Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 32: {
            LogStep(32,
                    "Step 32:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute, value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: invalid value (not 1-5) AuthMode "
                    "field: CASE (2) Subjects field: null Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(6);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33,
                    "Step 33:TH1 writes AccessControl cluster ACL attribute, value is list of AccessControlEntryStruct containing "
                    "2 elements");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(6);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(4);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 34: {
            LogStep(34,
                    "Step 34:TH1 writes AccessControl cluster ACL attribute, value is list of AccessControlEntryStruct containing "
                    "2 elements");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 0ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 35: {
            LogStep(35,
                    "Step 35:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: [0xFFFFFFFFFFFFFFFF] Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 18446744073709551615ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 36: {
            LogStep(36,
                    "Step 36:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: [0xFFFFFFFD00000000] Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 18446744060824649728ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 37: {
            LogStep(37,
                    "Step 37:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is list of "
                    "AccessControlEntryStruct containing 2 elements struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: [0xFFFFFFFFFFFF0000] Targets field: null");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 18446744073709486080ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 38: {
            LogStep(38,
                    "Step 38:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: null Targets field: [{}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNull();
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 39: {
            LogStep(39,
                    "Step 39:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: null Targets field: [{Cluster: 0xFFFFFFFF}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 4294967295UL;
                    listHolder_3->mList[0].endpoint.SetNull();
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 40: {
            LogStep(40,
                    "Step 40:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is list of "
                    "AccessControlEntryStruct containing 2 elements 1. struct  Privilege field: Administer (5)  AuthMode field: "
                    "CASE (2)  Subjects field: [N1]  Targets field: null 2. struct  Privilege field: Operate (3)  AuthMode field: "
                    "CASE (2)  Subjects field: null  Targets field: [{Endpoint: 65535}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 65535U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 41: {
            LogStep(41,
                    "Step 41:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: null Targets field: [{DeviceType: 0xFFFFFFFF}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNull();
                    listHolder_3->mList[0].deviceType.SetNonNull();
                    listHolder_3->mList[0].deviceType.Value() = 4294967295UL;

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 42: {
            LogStep(42,
                    "Step 42:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: null Targets field: [{Endpoint: 22, DeviceType: 33}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 22U;
                    listHolder_3->mList[0].deviceType.SetNonNull();
                    listHolder_3->mList[0].deviceType.Value() = 33UL;

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 43: {
            LogStep(43,
                    "Step 43:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is list of "
                    "AccessControlEntryStruct containing 2 elements 1.struct Privilege field: Administer (5) AuthMode field: CASE "
                    "(2) Subjects field: [N1] Targets field: null 2.struct Privilege field: Operate (3) AuthMode field: CASE (2) "
                    "Subjects field: null Targets field: [{Cluster: 11, Endpoint: 22, DeviceType: 33}]");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 11UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 22U;
                    listHolder_3->mList[0].deviceType.SetNonNull();
                    listHolder_3->mList[0].deviceType.Value() = 33UL;

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Step 44:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute value is an empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_7Suite : public TestCommand
{
public:
    Test_TC_ACL_2_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_7", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("payload", &mPayload);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("waitAfterCommissioning", 0, UINT16_MAX, &mWaitAfterCommissioning);
        AddArgument("PakeVerifier", &mPakeVerifier);
        AddArgument("D_OK_EMPTY", &mDOkEmpty);
        AddArgument("D_OK_SINGLE", &mDOkSingle);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_7Suite() {}

    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<chip::NodeId> mNodeId2;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<uint16_t> mWaitAfterCommissioning;
    chip::Optional<chip::ByteSpan> mPakeVerifier;
    chip::Optional<chip::ByteSpan> mDOkEmpty;
    chip::Optional<chip::ByteSpan> mDOkSingle;
    chip::Optional<uint16_t> mTimeout;

    chip::NodeId TH1CommissionerNodeId;
    uint8_t TH1FabricIndex;
    chip::NodeId TH2CommissionerNodeId;
    uint8_t TH2FabricIndex;

    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
    {
        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));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH1CommissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH1FabricIndex = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH2CommissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH2FabricIndex = value;
            }
            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));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("extension", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "extension[0].data", iter_0.GetValue().data,
                        mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2)));
                    VerifyOrReturn(CheckValue("extension[0].fabricIndex", iter_0.GetValue().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 1));
                }
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("extension", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "extension[0].data", iter_0.GetValue().data,
                        mDOkSingle.HasValue()
                            ? mDOkSingle.Value()
                            : chip::ByteSpan(chip::Uint8::from_const_char(
                                                 "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64"
                                                 "\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65"
                                                 "\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63"
                                                 "\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                                             71)));
                    VerifyOrReturn(CheckValue("extension[0].fabricIndex", iter_0.GetValue().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 1));
                }
            }
            break;
        case 14:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::AccessControl::Events::AccessControlExtensionChanged::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValueNonNull("accessControlExtensionChanged.adminNodeID", value.adminNodeID));
                    VerifyOrReturn(CheckValue("accessControlExtensionChanged.adminNodeID.Value()", value.adminNodeID.Value(),
                                              TH1CommissionerNodeId));
                    VerifyOrReturn(CheckValueNull("accessControlExtensionChanged.adminPasscodeID", value.adminPasscodeID));
                    VerifyOrReturn(CheckValue("accessControlExtensionChanged.changeType", value.changeType, 1U));
                    VerifyOrReturn(CheckValueNonNull("accessControlExtensionChanged.latestValue", value.latestValue));
                    VerifyOrReturn(CheckValueAsString(
                        "accessControlExtensionChanged.latestValue.Value().data", value.latestValue.Value().data,
                        mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2)));
                    VerifyOrReturn(CheckValue("accessControlExtensionChanged.latestValue.Value().fabricIndex",
                                              value.latestValue.Value().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckValue("accessControlExtensionChanged.fabricIndex", value.fabricIndex, TH1FabricIndex));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 15:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::AccessControl::Events::AccessControlExtensionChanged::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValueNonNull("accessControlExtensionChanged.adminNodeID", value.adminNodeID));
                    VerifyOrReturn(CheckValue("accessControlExtensionChanged.adminNodeID.Value()", value.adminNodeID.Value(),
                                              TH2CommissionerNodeId));
                    VerifyOrReturn(CheckValueNull("accessControlExtensionChanged.adminPasscodeID", value.adminPasscodeID));
                    VerifyOrReturn(CheckValue("accessControlExtensionChanged.changeType", value.changeType, 1U));
                    VerifyOrReturn(CheckValueNonNull("accessControlExtensionChanged.latestValue", value.latestValue));
                    VerifyOrReturn(CheckValueAsString(
                        "accessControlExtensionChanged.latestValue.Value().data", value.latestValue.Value().data,
                        mDOkSingle.HasValue()
                            ? mDOkSingle.Value()
                            : chip::ByteSpan(chip::Uint8::from_const_char(
                                                 "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64"
                                                 "\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65"
                                                 "\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63"
                                                 "\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                                             71)));
                    VerifyOrReturn(CheckValue("accessControlExtensionChanged.latestValue.Value().fabricIndex",
                                              value.latestValue.Value().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckValue("accessControlExtensionChanged.fabricIndex", value.fabricIndex, TH2FabricIndex));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            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;
        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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Step 1: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, "Read the TH1 commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Step 2:TH1 reads OperationalCredentials cluster CurrentFabricIndex attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Step 3:TH1 puts DUT into commissioning mode");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEPasscodeVerifier = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator        = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations           = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Step 3 & 4: TH1 puts DUT into commissioning mode, TH2 commissions DUT using admin node ID N2");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Waiting after opening commissioning window");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Step 4:TH2 starts a commissioning process with DUT");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "DUT is commissioned by TH2 on Fabric ID2 ");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 8: {
            LogStep(8, "Read the TH2 commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityBeta, value);
        }
        case 9: {
            LogStep(9, "Step 5:TH2 reads OperationalCredentials cluster CurrentFabricIndex attribute");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "Step 6:TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data =
                    mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2);
                listHolder_0->mList[0].fabricIndex = TH1FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "Step 7:TH2 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDOkSingle.HasValue()
                           ? mDOkSingle.Value()
                           : chip::ByteSpan(
                          chip::Uint8::from_const_char(
                              "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69"
                                     "\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76"
                                     "\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                          71);
                listHolder_0->mList[0].fabricIndex = TH2FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Step 8:TH1 reads AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Step 9:TH2 reads AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Step 10:TH1 reads DUT Endpoint 0 AccessControl cluster AccessControlExtensionChanged event");
            VerifyOrDo(!ShouldSkip("ACL.S.E01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                             AccessControl::Events::AccessControlExtensionChanged::Id, false, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Step 11:TH2 reads DUT Endpoint 0 AccessControl cluster AccessControlExtensionChanged event");
            VerifyOrDo(!ShouldSkip("ACL.S.E01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityBeta, GetEndpoint(0), AccessControl::Id,
                             AccessControl::Events::AccessControlExtensionChanged::Id, false, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH1 writes Extension attribute value as empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH2 writes Extension attribute value as empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>();
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_8Suite : public TestCommand
{
public:
    Test_TC_ACL_2_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_8", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("waitAfterCommissioning", 0, UINT16_MAX, &mWaitAfterCommissioning);
        AddArgument("payload", &mPayload);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("PakeVerifier", &mPakeVerifier);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_8Suite() {}

    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<chip::NodeId> mNodeId2;
    chip::Optional<uint16_t> mWaitAfterCommissioning;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::ByteSpan> mPakeVerifier;
    chip::Optional<uint16_t> mTimeout;

    chip::NodeId TH1CommissionerNodeId;
    uint8_t TH1FabricIndex;
    chip::NodeId TH2CommissionerNodeId;
    uint8_t TH2FabricIndex;

    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
    {
        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));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH1CommissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH1FabricIndex = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH2CommissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH2FabricIndex = value;
            }
            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));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), TH1CommissionerNodeId));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[1]", iter_3.GetValue(), 1111ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 2));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), TH2CommissionerNodeId));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[1]", iter_3.GetValue(), 2222ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 2));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 14:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::AccessControl::Events::AccessControlEntryChanged::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValueNull("accessControlEntryChanged.adminNodeID", value.adminNodeID));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.adminPasscodeID", value.adminPasscodeID));
                    VerifyOrReturn(
                        CheckValue("accessControlEntryChanged.adminPasscodeID.Value()", value.adminPasscodeID.Value(), 0U));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.changeType", value.changeType, 1U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue", value.latestValue));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().privilege",
                                              value.latestValue.Value().privilege, 5U));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().authMode",
                                              value.latestValue.Value().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue.Value().subjects",
                                                     value.latestValue.Value().subjects));
                    {
                        auto iter_4 = value.latestValue.Value().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 0));
                        VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().subjects.Value()[0]",
                                                  iter_4.GetValue(), TH1CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 1));
                    }
                    VerifyOrReturn(
                        CheckValueNull("accessControlEntryChanged.latestValue.Value().targets", value.latestValue.Value().targets));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().fabricIndex",
                                              value.latestValue.Value().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.fabricIndex", value.fabricIndex, TH1FabricIndex));
                }
                mTestSubStepIndex++;
                break;
            case 1:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::AccessControl::Events::AccessControlEntryChanged::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.adminNodeID", value.adminNodeID));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.adminNodeID.Value()", value.adminNodeID.Value(),
                                              TH1CommissionerNodeId));
                    VerifyOrReturn(CheckValueNull("accessControlEntryChanged.adminPasscodeID", value.adminPasscodeID));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.changeType", value.changeType, 2U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue", value.latestValue));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().privilege",
                                              value.latestValue.Value().privilege, 5U));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().authMode",
                                              value.latestValue.Value().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue.Value().subjects",
                                                     value.latestValue.Value().subjects));
                    {
                        auto iter_4 = value.latestValue.Value().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 0));
                        VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().subjects.Value()[0]",
                                                  iter_4.GetValue(), TH1CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 1));
                    }
                    VerifyOrReturn(
                        CheckValueNull("accessControlEntryChanged.latestValue.Value().targets", value.latestValue.Value().targets));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().fabricIndex",
                                              value.latestValue.Value().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.fabricIndex", value.fabricIndex, TH1FabricIndex));
                }
                mTestSubStepIndex++;
                break;
            case 2:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::AccessControl::Events::AccessControlEntryChanged::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.adminNodeID", value.adminNodeID));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.adminNodeID.Value()", value.adminNodeID.Value(),
                                              TH1CommissionerNodeId));
                    VerifyOrReturn(CheckValueNull("accessControlEntryChanged.adminPasscodeID", value.adminPasscodeID));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.changeType", value.changeType, 1U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue", value.latestValue));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().privilege",
                                              value.latestValue.Value().privilege, 5U));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().authMode",
                                              value.latestValue.Value().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue.Value().subjects",
                                                     value.latestValue.Value().subjects));
                    {
                        auto iter_4 = value.latestValue.Value().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 0));
                        VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().subjects.Value()[0]",
                                                  iter_4.GetValue(), TH1CommissionerNodeId));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 1));
                        VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().subjects.Value()[1]",
                                                  iter_4.GetValue(), 1111ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 2));
                    }
                    VerifyOrReturn(
                        CheckValueNull("accessControlEntryChanged.latestValue.Value().targets", value.latestValue.Value().targets));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().fabricIndex",
                                              value.latestValue.Value().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.fabricIndex", value.fabricIndex, TH1FabricIndex));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 15:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::AccessControl::Events::AccessControlEntryChanged::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValueNull("accessControlEntryChanged.adminNodeID", value.adminNodeID));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.adminPasscodeID", value.adminPasscodeID));
                    VerifyOrReturn(
                        CheckValue("accessControlEntryChanged.adminPasscodeID.Value()", value.adminPasscodeID.Value(), 0U));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.changeType", value.changeType, 1U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue", value.latestValue));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().privilege",
                                              value.latestValue.Value().privilege, 5U));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().authMode",
                                              value.latestValue.Value().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue.Value().subjects",
                                                     value.latestValue.Value().subjects));
                    {
                        auto iter_4 = value.latestValue.Value().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 0));
                        VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().subjects.Value()[0]",
                                                  iter_4.GetValue(), TH2CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 1));
                    }
                    VerifyOrReturn(
                        CheckValueNull("accessControlEntryChanged.latestValue.Value().targets", value.latestValue.Value().targets));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().fabricIndex",
                                              value.latestValue.Value().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.fabricIndex", value.fabricIndex, TH2FabricIndex));
                }
                mTestSubStepIndex++;
                break;
            case 1:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::AccessControl::Events::AccessControlEntryChanged::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.adminNodeID", value.adminNodeID));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.adminNodeID.Value()", value.adminNodeID.Value(),
                                              TH2CommissionerNodeId));
                    VerifyOrReturn(CheckValueNull("accessControlEntryChanged.adminPasscodeID", value.adminPasscodeID));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.changeType", value.changeType, 2U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue", value.latestValue));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().privilege",
                                              value.latestValue.Value().privilege, 5U));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().authMode",
                                              value.latestValue.Value().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue.Value().subjects",
                                                     value.latestValue.Value().subjects));
                    {
                        auto iter_4 = value.latestValue.Value().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 0));
                        VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().subjects.Value()[0]",
                                                  iter_4.GetValue(), TH2CommissionerNodeId));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 1));
                    }
                    VerifyOrReturn(
                        CheckValueNull("accessControlEntryChanged.latestValue.Value().targets", value.latestValue.Value().targets));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().fabricIndex",
                                              value.latestValue.Value().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.fabricIndex", value.fabricIndex, TH2FabricIndex));
                }
                mTestSubStepIndex++;
                break;
            case 2:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::AccessControl::Events::AccessControlEntryChanged::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.adminNodeID", value.adminNodeID));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.adminNodeID.Value()", value.adminNodeID.Value(),
                                              TH2CommissionerNodeId));
                    VerifyOrReturn(CheckValueNull("accessControlEntryChanged.adminPasscodeID", value.adminPasscodeID));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.changeType", value.changeType, 1U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue", value.latestValue));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().privilege",
                                              value.latestValue.Value().privilege, 5U));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().authMode",
                                              value.latestValue.Value().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("accessControlEntryChanged.latestValue.Value().subjects",
                                                     value.latestValue.Value().subjects));
                    {
                        auto iter_4 = value.latestValue.Value().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 0));
                        VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().subjects.Value()[0]",
                                                  iter_4.GetValue(), TH2CommissionerNodeId));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 1));
                        VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().subjects.Value()[1]",
                                                  iter_4.GetValue(), 2222ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(value.latestValue.Value().subjects.Value())>(
                            "accessControlEntryChanged.latestValue.Value().subjects.Value()", iter_4, 2));
                    }
                    VerifyOrReturn(
                        CheckValueNull("accessControlEntryChanged.latestValue.Value().targets", value.latestValue.Value().targets));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.latestValue.Value().fabricIndex",
                                              value.latestValue.Value().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckValue("accessControlEntryChanged.fabricIndex", value.fabricIndex, TH2FabricIndex));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            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;
        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;
        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, "Read the TH1 commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH1 reads OperationalCredentials cluster CurrentFabricIndex attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH1 puts DUT into commissioning mode");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEPasscodeVerifier = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator        = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations           = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Waiting after opening commissioning window");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH1 puts DUT into commissioning mode, TH2 commissions DUT using admin node ID N2");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH2 starts a commissioning process with DUT");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "DUT is commissioned by TH2 on Fabric ID2 ");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 8: {
            LogStep(8, "Read the TH2 commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityBeta, value);
        }
        case 9: {
            LogStep(9, "TH2 reads OperationalCredentials cluster CurrentFabricIndex attribute");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(2);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = TH1CommissionerNodeId;
                    listHolder_3->mList[1]                  = 1111ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 2);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = TH1FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH2 writes DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(2);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = TH2CommissionerNodeId;
                    listHolder_3->mList[1]                  = 2222ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 2);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = TH2FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH1 reads DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH2 reads DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH1 reads DUT Endpoint 0 AccessControl cluster AccessControlEntryChanged event");
            VerifyOrDo(!ShouldSkip("ACL.S.E00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            mTestSubStepCount = 3;
            return ReadEvent(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                             AccessControl::Events::AccessControlEntryChanged::Id, false, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH2 reads DUT Endpoint 0 AccessControl cluster AccessControlEntryChanged event");
            VerifyOrDo(!ShouldSkip("ACL.S.E00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            mTestSubStepCount = 3;
            return ReadEvent(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Events::AccessControlEntryChanged::Id,
                             false, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH1 writes ACL attribute value is an empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH2 writes ACL attribute value is an empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>();
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_9Suite : public TestCommand
{
public:
    Test_TC_ACL_2_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_9", 15, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_9Suite() {}

    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<chip::NodeId> mNodeId2;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    chip::NodeId CommissionerNodeId;
    uint8_t CurrentFabricIndex;

    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
    {
        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));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                CommissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                CurrentFabricIndex = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
            }
            break;
        case 11:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 12:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Step 1: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, "Read the commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH1 reads OperationalCredentials cluster CurrentFabricIndex attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Step 2:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(4);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Step 3:TH1 reads DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Step 4:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = CurrentFabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Step 5:TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Step 6:TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Step 7:TH1 reads DUT Endpoint 0 AccessControl cluster SubjectsPerAccessControlEntry attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::SubjectsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Step 8:TH1 reads DUT Endpoint 0 AccessControl cluster TargetsPerAccessControlEntry attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::TargetsPerAccessControlEntry::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Step 9:TH1 reads DUT Endpoint 0 AccessControl cluster AccessControlEntriesPerFabric attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                                 AccessControl::Attributes::AccessControlEntriesPerFabric::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH1 reads DUT Endpoint 0 AccessControl cluster AccessControlEntryChanged event");
            VerifyOrDo(!ShouldSkip("ACL.S.E00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                             AccessControl::Events::AccessControlEntryChanged::Id, false, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH1 reads DUT Endpoint 0 AccessControl cluster AccessControlExtensionChanged event");
            VerifyOrDo(!ShouldSkip("ACL.S.E01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityAlpha, GetEndpoint(0), AccessControl::Id,
                             AccessControl::Events::AccessControlExtensionChanged::Id, false, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Test cleanup: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Test cleanup: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_10Suite : public TestCommand
{
public:
    Test_TC_ACL_2_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_10", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("waitAfterCommissioning", 0, UINT16_MAX, &mWaitAfterCommissioning);
        AddArgument("payload", &mPayload);
        AddArgument("PakeVerifier", &mPakeVerifier);
        AddArgument("D_OK_EMPTY", &mDOkEmpty);
        AddArgument("D_OK_SINGLE", &mDOkSingle);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_10Suite() {}

    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<chip::NodeId> mNodeId2;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<uint16_t> mWaitAfterCommissioning;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<chip::ByteSpan> mPakeVerifier;
    chip::Optional<chip::ByteSpan> mDOkEmpty;
    chip::Optional<chip::ByteSpan> mDOkSingle;
    chip::Optional<uint16_t> mTimeout;

    chip::NodeId TH1CommissionerNodeId;
    uint8_t TH1FabricIndex;
    chip::NodeId TH2CommissionerNodeId;
    uint8_t TH2FabricIndex;

    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
    {
        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));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH1CommissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH1FabricIndex = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH2CommissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH2FabricIndex = value;
            }
            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));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("extension", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "extension[0].data", iter_0.GetValue().data,
                        mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2)));
                    VerifyOrReturn(CheckValue("extension[0].fabricIndex", iter_0.GetValue().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 1));
                }
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), TH2CommissionerNodeId));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 1));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[1]", iter_3.GetValue(), 2222ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 2));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 1));
                    VerifyOrReturn(CheckValue("acl[1].privilege", iter_0.GetValue().privilege, 3U));
                    VerifyOrReturn(CheckValue("acl[1].authMode", iter_0.GetValue().authMode, 3U));
                    VerifyOrReturn(CheckValueNonNull("acl[1].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[1].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[1].subjects.Value()[0]", iter_3.GetValue(), 4444ULL));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[1].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[1].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[1].fabricIndex", iter_0.GetValue().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 2));
                }
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("extension", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "extension[0].data", iter_0.GetValue().data,
                        mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2)));
                    VerifyOrReturn(CheckValue("extension[0].fabricIndex", iter_0.GetValue().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("extension", iter_0, 1));
                }
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Step 1: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, "Read the TH1 commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Step 2:TH1 reads OperationalCredentials cluster CurrentFabricIndex attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Step 3:TH1 puts DUT into commissioning mode");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY && CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEPasscodeVerifier = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator        = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations           = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Waiting after opening commissioning window");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY && CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH1 puts DUT into commissioning mode, TH2 commissions DUT using admin node ID N2");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH2 starts a commissioning process with DUT");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "DUT is commissioned by TH2 on Fabric ID2");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 8: {
            LogStep(8, "Read the TH2 commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityBeta, value);
        }
        case 9: {
            LogStep(9, "Step 4:TH2 reads OperationalCredentials cluster CurrentFabricIndex attribute");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Step 5:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(2);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = TH1CommissionerNodeId;
                    listHolder_3->mList[1]                  = 1111ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 2);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = TH1FabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 3333ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = TH1FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Step 6:TH2 writes DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(2);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = TH2CommissionerNodeId;
                    listHolder_3->mList[1]                  = 2222ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 2);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = TH2FabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 4444ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = TH2FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12,
                    "Step 7:TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1.struct, Data field: D_OK_EMPTY");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data =
                    mDOkEmpty.HasValue() ? mDOkEmpty.Value() : chip::ByteSpan(chip::Uint8::from_const_char("\x17\x18"), 2);
                listHolder_0->mList[0].fabricIndex = TH1FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13,
                    "Step 8:TH2 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element 1.struct, Data field: D_OK_SINGLE");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDOkSingle.HasValue()
                           ? mDOkSingle.Value()
                           : chip::ByteSpan(
                          chip::Uint8::from_const_char(
                              "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69"
                                     "\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76"
                                     "\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                          71);
                listHolder_0->mList[0].fabricIndex = TH2FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Step 9: Reboot DUT");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Step 9: Reboot DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Reboot the DUT and enter 'y' after successgarbage: not in length on purpose", 42);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH1 Connects to the device again");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH2 Connects to the device again");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 18: {
            LogStep(18, "Step 10:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(2);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = TH1CommissionerNodeId;
                    listHolder_3->mList[1]                  = 1111ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 2);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = TH1FabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 3333ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = TH1FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 19: {
            LogStep(19,
                    "Step 11:TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Step 12:TH2 reads DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Step 13:TH2 reads DUT Endpoint 0 AccessControl cluster Extension attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].data        = mDOkSingle.HasValue()
                           ? mDOkSingle.Value()
                           : chip::ByteSpan(
                          chip::Uint8::from_const_char(
                              "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69"
                                     "\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76"
                                     "\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"),
                          71);
                listHolder_0->mList[0].fabricIndex = TH2FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Step 14: If DUT is an app on host, examine persistent storage in /tmp/chip_kvs text file");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH2 writes Extension attibute value as empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>();
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH2 writes ACL attribute value is an empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>();
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Step 15:TH1 removes fabric F2 from DUT");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = TH2FabricIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::Optional<uint16_t>(10000),
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Step 16:TH1 writes DUT Endpoint 0 AccessControl cluster ACL attribute");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(2);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = TH1CommissionerNodeId;
                    listHolder_3->mList[1]                  = 1111ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 2);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = TH1FabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 3333ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = TH1FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 27: {
            LogStep(27,
                    "Step 17:TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                    "AccessControlExtensionStruct containing 1 element");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Step 18: If DUT is an app on host, examine persistent storage in /tmp/chip_kvs text file");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "TH1 writes Extension attribute value as empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::Type>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Extension::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH1 writes ACL attribute value is an empty list");
            VerifyOrDo(!ShouldSkip("ACL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = TH1CommissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACE_1_1Suite : public TestCommand
{
public:
    Test_TC_ACE_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACE_1_1", 38, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACE_1_1Suite() {}

    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::NodeId commissionerNodeId;

    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
    {
        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));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                commissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::OperationalCredentials::Structs::NOCStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 1));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 1));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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, "Read the commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TP2 - Write ACL giving admin privilege on all EP0");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[0].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TP3 - Read the NOC attribute (Node operational credentials - requires administer)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::NOCs::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TP4 - Write the location attribute (Basic - requires administer)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("XXgarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TP5 - Send the UpdateFabricLabel command (Node operational credentials - requires administer)");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::UpdateFabricLabel::Type value;
            value.label = chip::Span<const char>("TestFabricgarbage: not in length on purpose", 10);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::UpdateFabricLabel::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "TP6 - Write NodeLabel attribute (Basic - requires manage)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("TestNodegarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TP7 - Send TestEventTrigger (General Diagnostics - requires manage)");
            ListFreer listFreer;
            chip::app::Clusters::GeneralDiagnostics::Commands::TestEventTrigger::Type value;
            value.enableKey    = chip::ByteSpan(chip::Uint8::from_const_char("0garbage: not in length on purpose"), 1);
            value.eventTrigger = 0ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                               GeneralDiagnostics::Commands::TestEventTrigger::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TP8 - Tead the VendorID attribute (Basic - requires view)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TP9 - Write ACL giving admin privilege ACL, manage for rest of EP0");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 31UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(4);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TP10 - Read the NOC attribute (Node operational credentials - requires administer)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::NOCs::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TP11 - Write the location attribute (Basic - requires administer)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("XXgarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TP12 - Send the UpdateFabricLabel command (Node operational credentials - requires administer)");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::UpdateFabricLabel::Type value;
            value.label = chip::Span<const char>("TestFabricgarbage: not in length on purpose", 10);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::UpdateFabricLabel::Id, value, chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "TP13(6) - Write NodeLabel attribute (Basic - requires manage)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("TestNodegarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TP13(7) - Send TestEventTrigger (General Diagnostics - requires manage)");
            ListFreer listFreer;
            chip::app::Clusters::GeneralDiagnostics::Commands::TestEventTrigger::Type value;
            value.enableKey    = chip::ByteSpan(chip::Uint8::from_const_char("0garbage: not in length on purpose"), 1);
            value.eventTrigger = 0ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                               GeneralDiagnostics::Commands::TestEventTrigger::Id, value, chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TP13(8) - Tead the VendorID attribute (Basic - requires view)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TP14 - Write ACL giving admin privilege ACL, operate for rest of EP0");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 31UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TP15(10) - Read the NOC attribute (Node operational credentials - requires administer)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::NOCs::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TP15(11) - Write the location attribute (Basic - requires administer)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("XXgarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TP15(12) - Send the UpdateFabricLabel command (Node operational credentials - requires administer)");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::UpdateFabricLabel::Type value;
            value.label = chip::Span<const char>("TestFabricgarbage: not in length on purpose", 10);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::UpdateFabricLabel::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "TP16 - Write NodeLabel attribute (Basic - requires manage)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("TestNodegarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TP17 - Send TestEventTrigger (General Diagnostics - requires manage)");
            ListFreer listFreer;
            chip::app::Clusters::GeneralDiagnostics::Commands::TestEventTrigger::Type value;
            value.enableKey    = chip::ByteSpan(chip::Uint8::from_const_char("0garbage: not in length on purpose"), 1);
            value.eventTrigger = 0ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                               GeneralDiagnostics::Commands::TestEventTrigger::Id, value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "TP18(8) - Tead the VendorID attribute (Basic - requires view)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TP19 - Write ACL giving admin privilege ACL, operate for rest of EP0");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 31UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TP20(10) - Read the NOC attribute (Node operational credentials - requires administer)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::NOCs::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TP20(11) - Write the location attribute (Basic - requires administer)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("XXgarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TP20(12) - Send the UpdateFabricLabel command (Node operational credentials - requires administer)");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::UpdateFabricLabel::Type value;
            value.label = chip::Span<const char>("TestFabricgarbage: not in length on purpose", 10);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::UpdateFabricLabel::Id, value, chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "TP21(16) - Write NodeLabel attribute (Basic - requires manage)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("TestNodegarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TP21(17) - Send TestEventTrigger (General Diagnostics - requires manage)");
            ListFreer listFreer;
            chip::app::Clusters::GeneralDiagnostics::Commands::TestEventTrigger::Type value;
            value.enableKey    = chip::ByteSpan(chip::Uint8::from_const_char("0garbage: not in length on purpose"), 1);
            value.eventTrigger = 0ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                               GeneralDiagnostics::Commands::TestEventTrigger::Id, value, chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "TP22(8) - Tead the VendorID attribute (Basic - requires view)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TP23 - Write ACL giving only admin privilege ACL cluster");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 31UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[0].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TP24(10) - Read the NOC attribute (Node operational credentials - requires administer)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::NOCs::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "TP24(11) - Write the location attribute (Basic - requires administer)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("XXgarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "TP24(12) - Send the UpdateFabricLabel command (Node operational credentials - requires administer)");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::UpdateFabricLabel::Type value;
            value.label = chip::Span<const char>("TestFabricgarbage: not in length on purpose", 10);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::UpdateFabricLabel::Id, value, chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "TP25(16) - Write NodeLabel attribute (Basic - requires manage)");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("TestNodegarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "TP25(17) - Send TestEventTrigger (General Diagnostics - requires manage)");
            ListFreer listFreer;
            chip::app::Clusters::GeneralDiagnostics::Commands::TestEventTrigger::Type value;
            value.enableKey    = chip::ByteSpan(chip::Uint8::from_const_char("0garbage: not in length on purpose"), 1);
            value.eventTrigger = 0ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                               GeneralDiagnostics::Commands::TestEventTrigger::Id, value, chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "TP26 - Tead the VendorID attribute (Basic - requires view)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TP27 - Write ACL to restore full access");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACE_1_5Suite : public TestCommand
{
public:
    Test_TC_ACE_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACE_1_5", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("payload", &mPayload);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("waitAfterCommissioning", 0, UINT16_MAX, &mWaitAfterCommissioning);
        AddArgument("PakeVerifier", &mPakeVerifier);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACE_1_5Suite() {}

    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<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<uint16_t> mWaitAfterCommissioning;
    chip::Optional<chip::ByteSpan> mPakeVerifier;
    chip::Optional<uint16_t> mTimeout;

    uint8_t th1FabricIndex;
    uint8_t th2FabricIndex;
    chip::NodeId commissionerNodeIdAlpha;
    chip::NodeId commissionerNodeIdBeta;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                th1FabricIndex = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                th2FabricIndex = value;
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                commissionerNodeIdAlpha = value.nodeId;
            }
            shouldContinue = true;
            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::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                commissionerNodeIdBeta = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Descriptor::Structs::DeviceTypeStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved for TH1");
            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, "TH1 reads the fabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Step 3 & 4: TH1 puts DUT into commissioning mode, TH2 commissions DUT using admin node ID N2");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Open Commissioning Window from alpha");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEPasscodeVerifier = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator        = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations           = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Waiting after opening commissioning window");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Commission from TH2");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 6: {
            LogStep(6, "Wait for the commissioned device to be retrieved for TH2");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "TH2 reads the fabric index");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the commissioner node ID from the alpha fabric");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH1 writes ACL giving view privilege for descriptor cluster");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeIdAlpha;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 31UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[0].fabricIndex = th1FabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 29UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = th1FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the commissioner node ID from the beta fabric");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityBeta, value);
        }
        case 11: {
            LogStep(11, "TH2 writes ACL giving view privilge for basic cluster");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeIdBeta;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 31UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[0].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[0].fabricIndex = th2FabricIndex;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(1);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 40UL;
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 0U;
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = th2FabricIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH1 reads descriptor cluster - expect SUCCESS");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::DeviceTypeList::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH1 reads basic cluster - expect UNSUPPORTED_ACCESS");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH2 reads descriptor cluster - expect UNSUPPORTED_ACCESS");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::DeviceTypeList::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH2 reads basic cluster - expect SUCCESS");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH1 resets ACL to default");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeIdAlpha;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH1 sends RemoveFabric command for TH2");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = th2FabricIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BOOL_1_1Suite : public TestCommand
{
public:
    Test_TC_BOOL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BOOL_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BOOL_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id, BooleanState::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id, BooleanState::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id, BooleanState::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id,
                                 BooleanState::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id,
                                 BooleanState::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BOOL_2_1Suite : public TestCommand
{
public:
    Test_TC_BOOL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BOOL_2_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BOOL_2_1Suite() {}

    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
    {
        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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            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;
        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, "Read mandatory non-global attribute: StateValue");
            VerifyOrDo(!ShouldSkip("BOOL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), BooleanState::Id, BooleanState::Attributes::StateValue::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BRBINFO_1_1Suite : public TestCommand
{
public:
    Test_TC_BRBINFO_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_BRBINFO_1_1", 20, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BRBINFO_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 13UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads optional attribute(VendorName) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads optional attribute(VendorID) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads optional attribute(ProductName) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads optional attribute(NodeLabel) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads optional attribute(HardwareVersion) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads optional attribute(HardwareVersionString) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads optional attribute(SoftwareVersion) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads optional attribute(SoftwareVersionString) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads optional attribute(ManufacturingDate) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads optional attribute(PartNumber) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads optional attribute(ProductURL) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads optional attribute(ProductLabel) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads optional attribute(SerialNumber) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads optional attribute(UniqueID) in AttributeList");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH1 reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH1 reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BRBINFO_2_1Suite : public TestCommand
{
public:
    Test_TC_BRBINFO_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_BRBINFO_2_1", 50, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BRBINFO_2_1Suite()
    {
        if (VendorNameValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(VendorNameValueBuffer);
            VendorNameValueBuffer = nullptr;
        }
        if (ProductNameValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ProductNameValueBuffer);
            ProductNameValueBuffer = nullptr;
        }
        if (NodeLabelValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(NodeLabelValueBuffer);
            NodeLabelValueBuffer = nullptr;
        }
        if (HardwareVersionStringValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(HardwareVersionStringValueBuffer);
            HardwareVersionStringValueBuffer = nullptr;
        }
        if (SoftwareVersionStringValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(SoftwareVersionStringValueBuffer);
            SoftwareVersionStringValueBuffer = nullptr;
        }
        if (ManufacturingDateValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ManufacturingDateValueBuffer);
            ManufacturingDateValueBuffer = nullptr;
        }
        if (PartNumberValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(PartNumberValueBuffer);
            PartNumberValueBuffer = nullptr;
        }
        if (ProductURLValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ProductURLValueBuffer);
            ProductURLValueBuffer = nullptr;
        }
        if (ProductLabelValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ProductLabelValueBuffer);
            ProductLabelValueBuffer = nullptr;
        }
        if (SerialNumberValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(SerialNumberValueBuffer);
            SerialNumberValueBuffer = nullptr;
        }
        if (UniqueIDValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(UniqueIDValueBuffer);
            UniqueIDValueBuffer = nullptr;
        }
    }

    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;

    char * VendorNameValueBuffer = nullptr;
    chip::CharSpan VendorNameValue;
    chip::VendorId VendorIDValue;
    char * ProductNameValueBuffer = nullptr;
    chip::CharSpan ProductNameValue;
    char * NodeLabelValueBuffer = nullptr;
    chip::CharSpan NodeLabelValue;
    uint16_t HardwareVersionValue;
    char * HardwareVersionStringValueBuffer = nullptr;
    chip::CharSpan HardwareVersionStringValue;
    uint32_t SoftwareVersionValue;
    char * SoftwareVersionStringValueBuffer = nullptr;
    chip::CharSpan SoftwareVersionStringValue;
    char * ManufacturingDateValueBuffer = nullptr;
    chip::CharSpan ManufacturingDateValue;
    char * PartNumberValueBuffer = nullptr;
    chip::CharSpan PartNumberValue;
    char * ProductURLValueBuffer = nullptr;
    chip::CharSpan ProductURLValue;
    char * ProductLabelValueBuffer = nullptr;
    chip::CharSpan ProductLabelValue;
    char * SerialNumberValueBuffer = nullptr;
    chip::CharSpan SerialNumberValue;
    char * UniqueIDValueBuffer = nullptr;
    chip::CharSpan UniqueIDValue;

    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
    {
        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));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (VendorNameValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(VendorNameValueBuffer);
                }
                VendorNameValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(VendorNameValueBuffer, value.data(), value.size());
                VendorNameValue = chip::CharSpan(VendorNameValueBuffer, value.size());
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("vendorName", value, VendorNameValue));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "vendor_id", "vendor_id"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65521U));
                VendorIDValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorID", value, VendorIDValue));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (ProductNameValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ProductNameValueBuffer);
                }
                ProductNameValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ProductNameValueBuffer, value.data(), value.size());
                ProductNameValue = chip::CharSpan(ProductNameValueBuffer, value.size());
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("productName", value, ProductNameValue));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (NodeLabelValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(NodeLabelValueBuffer);
                }
                NodeLabelValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(NodeLabelValueBuffer, value.data(), value.size());
                NodeLabelValue = chip::CharSpan(NodeLabelValueBuffer, value.size());
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                HardwareVersionValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("hardwareVersion", value, HardwareVersionValue));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 1));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 64));
                if (HardwareVersionStringValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(HardwareVersionStringValueBuffer);
                }
                HardwareVersionStringValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(HardwareVersionStringValueBuffer, value.data(), value.size());
                HardwareVersionStringValue = chip::CharSpan(HardwareVersionStringValueBuffer, value.size());
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("hardwareVersionString", value, HardwareVersionStringValue));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967294UL));
                SoftwareVersionValue = value;
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("softwareVersion", value, SoftwareVersionValue));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 1));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 64));
                if (SoftwareVersionStringValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(SoftwareVersionStringValueBuffer);
                }
                SoftwareVersionStringValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(SoftwareVersionStringValueBuffer, value.data(), value.size());
                SoftwareVersionStringValue = chip::CharSpan(SoftwareVersionStringValueBuffer, value.size());
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("softwareVersionString", value, SoftwareVersionStringValue));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 8));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 16));
                if (ManufacturingDateValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ManufacturingDateValueBuffer);
                }
                ManufacturingDateValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ManufacturingDateValueBuffer, value.data(), value.size());
                ManufacturingDateValue = chip::CharSpan(ManufacturingDateValueBuffer, value.size());
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("manufacturingDate", value, ManufacturingDateValue));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (PartNumberValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(PartNumberValueBuffer);
                }
                PartNumberValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(PartNumberValueBuffer, value.data(), value.size());
                PartNumberValue = chip::CharSpan(PartNumberValueBuffer, value.size());
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("partNumber", value, PartNumberValue));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "long_char_string", "long_char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 256));
                if (ProductURLValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ProductURLValueBuffer);
                }
                ProductURLValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ProductURLValueBuffer, value.data(), value.size());
                ProductURLValue = chip::CharSpan(ProductURLValueBuffer, value.size());
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("productURL", value, ProductURLValue));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 64));
                if (ProductLabelValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ProductLabelValueBuffer);
                }
                ProductLabelValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ProductLabelValueBuffer, value.data(), value.size());
                ProductLabelValue = chip::CharSpan(ProductLabelValueBuffer, value.size());
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("productLabel", value, ProductLabelValue));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (SerialNumberValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(SerialNumberValueBuffer);
                }
                SerialNumberValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(SerialNumberValueBuffer, value.data(), value.size());
                SerialNumberValue = chip::CharSpan(SerialNumberValueBuffer, value.size());
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("serialNumber", value, SerialNumberValue));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("reachable", value, true));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("reachable", value, true));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (UniqueIDValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(UniqueIDValueBuffer);
                }
                UniqueIDValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(UniqueIDValueBuffer, value.data(), value.size());
                UniqueIDValue = chip::CharSpan(UniqueIDValueBuffer, value.size());
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("uniqueID", value, UniqueIDValue));
            }
            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;
        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, "TH reads VendorName from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::VendorName::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH writes VendorName from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("samplegarbage: not in length on purpose", 6);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::VendorName::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads VendorName from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::VendorName::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads VendorID from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::VendorID::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Verify that VendorID matches the value assigned to this manufacturer");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BRBINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH writes VendorID from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::VendorId value;
            value = static_cast<chip::VendorId>(17);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::VendorID::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads VendorID from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::VendorID::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads ProductName from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::ProductName::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH writes ProductName from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newproductgarbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::ProductName::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads ProductName from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::ProductName::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads NodeLabel from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::NodeLabel::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH writes NodeLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0005 && PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads NodeLabel from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0005 && PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads HardwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::HardwareVersion::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH writes HardwareVersion from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 17713U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::HardwareVersion::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads HardwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::HardwareVersion::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads HardwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::HardwareVersionString::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH writes HardwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newhardwareversiongarbage: not in length on purpose", 18);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::HardwareVersionString::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads HardwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::HardwareVersionString::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads SoftwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::SoftwareVersion::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH writes SoftwareVersion from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 33299UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::SoftwareVersion::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads SoftwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::SoftwareVersion::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads SoftwareVersionString from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::SoftwareVersionString::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH writes SoftwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("1.0garbage: not in length on purpose", 3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::SoftwareVersionString::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads SoftwareVersionString from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::SoftwareVersionString::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH reads ManufacturingDate from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::ManufacturingDate::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Verify if the first 8 characters specify date according to ISO 8601, i.e, YYYYMMDD.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BRBINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28, "TH writes ManufacturingDate from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("20210814789452INgarbage: not in length on purpose", 16);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::ManufacturingDate::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH reads ManufacturingDate from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::ManufacturingDate::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH reads PartNumber from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::PartNumber::Id, true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH writes PartNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newpartgarbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::PartNumber::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 32: {
            LogStep(32, "TH reads PartNumber from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::PartNumber::Id, true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "TH reads ProductURL from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::ProductURL::Id, true, chip::NullOptional);
        }
        case 34: {
            LogStep(34,
                    "Verify that it specifies a link to a specific web page, Verify that it follows the syntax rules specified in "
                    "RFC 3986.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BRBINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35, "TH writes ProductURL from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("https://www.example.comgarbage: not in length on purpose", 23);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::ProductURL::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH reads ProductURL from the DUT");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::ProductURL::Id, true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TH reads ProductLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::ProductLabel::Id, true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Verify that it does not include the name of the vendor as defined within the VendorName attribute");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BRBINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 39: {
            LogStep(39, "TH writes ProductLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newproductlabelgarbage: not in length on purpose", 15);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::ProductLabel::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 40: {
            LogStep(40, "TH reads ProductLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::ProductLabel::Id, true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "TH reads SerialNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::SerialNumber::Id, true, chip::NullOptional);
        }
        case 42: {
            LogStep(42, "TH writes SerialNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newserialnumbergarbage: not in length on purpose", 15);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::SerialNumber::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 43: {
            LogStep(43, "TH reads SerialNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::SerialNumber::Id, true, chip::NullOptional);
        }
        case 44: {
            LogStep(44, "TH reads Reachable from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::Reachable::Id, true, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "TH sends Write request message to DUT to change value of Reachable to false");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::Reachable::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 46: {
            LogStep(46, "TH reads Reachable from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::Reachable::Id, true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "TH reads UniqueID from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::UniqueID::Id, true, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH writes UniqueID from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newidgarbage: not in length on purpose", 5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                  BridgedDeviceBasicInformation::Attributes::UniqueID::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 49: {
            LogStep(49, "TH reads UniqueID from the DUT.");
            VerifyOrDo(!ShouldSkip("BRBINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), BridgedDeviceBasicInformation::Id,
                                 BridgedDeviceBasicInformation::Attributes::UniqueID::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_1_1Suite : public TestCommand
{
public:
    Test_TC_ACT_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACT_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACT_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 11));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(SetupURL) in AttributeList");
            VerifyOrDo(!ShouldSkip("ACT.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Actions::Id, Actions::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BIND_1_1Suite : public TestCommand
{
public:
    Test_TC_BIND_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BIND_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BIND_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_1_1Suite : public TestCommand
{
public:
    Test_TC_CC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_1_1", 47, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16385UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16394UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16384UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16386UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16387UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16388UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16389UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16390UL));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16395UL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16396UL));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16397UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16400UL));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 64UL));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65UL));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 66UL));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 67UL));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 68UL));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 71UL));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 75UL));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 76UL));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("( !CC.S.F00 && !CC.S.F01 && !CC.S.F02 && !CC.S.F03 && !CC.S.F04 )"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given CC.S.F00(HS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given CC.S.F01(EHue) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given CC.S.F02(CL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given CC.S.F03(XY) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given CC.S.F04(CT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute(CurrentHue) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute(CurrentSaturation) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional attribute(RemainingTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the optional attribute(CurrentX) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the optional attribute(CurrentY) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the optional attribute(DriftCompensation) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the optional attribute(CompensationText) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read the optional attribute(ColorTemperatureMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read the optional attribute(EnhancedCurrentHue) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the optional attribute(ColorLoopActive) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read the optional attribute(ColorLoopDirection) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read the optional attribute(ColorLoopTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read the optional attribute(ColorLoopStartEnhancedHue) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read the optional attribute(ColorLoopStoredEnhancedHue) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read the optional attribute(ColorTempPhysicalMinMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read the optional attribute(ColorTempPhysicalMaxMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Read the optional attribute(CoupleColorTempToLevelMinMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A400d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read the optional attribute(StartUpColorTemperatureMireds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CC.S.A4010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Read the optional command(MoveToHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read the optional command(MoveHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read the optional command(StepHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read the optional command(MoveToSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Read the optional command(MoveSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Read the optional command(StepSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read the optional command(MoveToHueAndSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Read the optional command(MoveToColor) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Read the optional command(MoveColor) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read the optional command(StepColor) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Read the optional command(MoveToColorTemperature) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read the optional command(EnhancedMoveToHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Read the optional command(EnhancedMoveHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Read the optional command(EnhancedStepHue) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read the optional command(EnhancedMoveToHueAndSaturation) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C43.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Read the optional command(ColorLoopSet) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Read the optional command(StopMoveStep) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Read the optional command(MoveColorTemperature) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Read the optional command(StepColorTemperature) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_2_1Suite : public TestCommand
{
public:
    Test_TC_CC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_2_1", 54, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_2_1Suite() {}

    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;

    uint32_t FeatureMapValue;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 254));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                FeatureMapValue = value;
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorCapabilities", value, FeatureMapValue));
                VerifyOrReturn(CheckConstraintType("value", "bitmap16", "bitmap16"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 31U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            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;
        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, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads RemainingTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::RemainingTime::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads DriftCompensation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::DriftCompensation::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads CompensationText attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CompensationText::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads ColorTemperatureMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads Options attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads ColorLoopTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Saving for comparision in step 19 reads FeatureMap attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads ColorCapabilities attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorCapabilities::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads ColorTempPhysicalMaxMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads CoupleColorTempToLevelMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::CoupleColorTempToLevelMinMireds::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads StartUpColorTemperatureMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::StartUpColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads NumberOfPrimaries attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::NumberOfPrimaries::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH reads Primary1X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 1 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26,
                    "TH reads Primary1Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 1 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27,
                    "TH reads Primary1Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 1 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28,
                    "TH reads Primary2X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 2 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29,
                    "TH reads Primary2Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 2 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 30: {
            LogStep(30,
                    "TH reads Primary2Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 2 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31,
                    "TH reads Primary3X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 3 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 32: {
            LogStep(32,
                    "TH reads Primary3Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 3 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33,
                    "TH reads Primary3Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 3 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A001b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34,
                    "TH reads Primary4X attribute from DUT Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] if "
                    "NumberOfPrimaries is 4 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35,
                    "TH reads Primary4Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 4 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 36: {
            LogStep(36,
                    "TH reads Primary4Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 4 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0022"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 37: {
            LogStep(37,
                    "TH reads Primary5X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 5 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0024"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 38: {
            LogStep(38,
                    "TH reads Primary5Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 5 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0025"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 39: {
            LogStep(39,
                    "TH reads Primary5Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 5 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0026"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40,
                    "TH reads Primary6X attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 6 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0028"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41,
                    "TH reads Primary6Y attribute from DUT and Verify that the DUT response contains an uint16 [Min:0 Max:0xfeff] "
                    "if NumberOfPrimaries is 6 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A0029"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 42: {
            LogStep(42,
                    "TH reads Primary6Intensity attribute from DUT and Verify that the DUT response contains an uint8 if "
                    "NumberOfPrimaries is 6 or more");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CC.S.A002a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 43: {
            LogStep(43, "TH reads WhitePointX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::WhitePointX::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "TH reads WhitePointY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::WhitePointY::Id, true,
                                 chip::NullOptional);
        }
        case 45: {
            LogStep(45, "TH reads ColorPointRX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0032"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointRX::Id, true,
                                 chip::NullOptional);
        }
        case 46: {
            LogStep(46, "TH reads ColorPointRY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointRY::Id, true,
                                 chip::NullOptional);
        }
        case 47: {
            LogStep(47, "TH reads ColorPointRIntensity attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0034"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorPointRIntensity::Id, true, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads ColorPointGX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0036"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointGX::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "TH reads ColorPointGY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0037"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointGY::Id, true,
                                 chip::NullOptional);
        }
        case 50: {
            LogStep(50, "TH reads ColorPointGIntensity attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0038"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorPointGIntensity::Id, true, chip::NullOptional);
        }
        case 51: {
            LogStep(51, "TH reads ColorPointBX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A003a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointBX::Id, true,
                                 chip::NullOptional);
        }
        case 52: {
            LogStep(52, "TH reads ColorPointBY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A003b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorPointBY::Id, true,
                                 chip::NullOptional);
        }
        case 53: {
            LogStep(53, "TH reads ColorPointBIntensity attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A003c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorPointBIntensity::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_2Suite : public TestCommand
{
public:
    Test_TC_CC_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_3_2", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_3_2Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 215U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 38U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 52U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 80U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 110U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 80U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 110U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 183U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 247U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 140U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 190U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 140U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 190U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            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("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 200U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveHue command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 2s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15,
                    "TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH sends MoveHue command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(3);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Wait 2s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_3Suite : public TestCommand
{
public:
    Test_TC_CC_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_3_3", 25, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_3_3Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 195U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 17U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 208U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 208U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            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("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 200U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends StepHue command to DUT with StepMode=0x01 (up), StepSize=60 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepHue::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(1);
            value.stepSize        = 60U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12,
                    "TH sends MoveToHue command to DUT with Hue=50, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 50U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH sends StepHue command to DUT with StepMode=0x03 (down), StepSize=60 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepHue::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(3);
            value.stepSize        = 60U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepHue::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_1Suite : public TestCommand
{
public:
    Test_TC_CC_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_1", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("SaturationConfigValue", 0, UINT8_MAX, &mSaturationConfigValue);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_1Suite() {}

    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<uint8_t> mSaturationConfigValue;
    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 80U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToSaturation command to DUT with Saturation=60 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 60U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 120U;
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_2Suite : public TestCommand
{
public:
    Test_TC_CC_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_2", 34, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_2Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 59U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 81U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 35U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 150U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 120U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH sends MoveSaturation command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(3);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 150U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH sends MoveSaturation command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Wait 2s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 33: {
            LogStep(33, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_3Suite : public TestCommand
{
public:
    Test_TC_CC_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_3", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_3Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 187U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 253U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 204U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 204U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 25U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 35U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentSaturation", value, 0U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            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("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToSaturation command to DUT with Saturation=200 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 200U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=40 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepSaturation::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::SaturationStepMode>(1);
            value.stepSize        = 40U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=20 and TransitionTime=100 (10s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepSaturation::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::SaturationStepMode>(1);
            value.stepSize        = 20U;
            value.transitionTime  = 100U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH sends MoveToSaturation command to DUT with Saturation=50 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 50U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17,
                    "TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=40 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepSaturation::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::SaturationStepMode>(3);
            value.stepSize        = 40U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24,
                    "TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=20 and TransitionTime=100 (10 s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepSaturation::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::SaturationStepMode>(3);
            value.stepSize        = 20U;
            value.transitionTime  = 100U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_4Suite : public TestCommand
{
public:
    Test_TC_CC_4_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_4", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_4Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 42U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 58U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 160U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 50U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 80U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 135U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 185U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 135U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 185U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(
                3, "TH sends MoveToHueAndSaturation command to DUT with Hue=200, Saturation=50 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHueAndSaturation::Type value;
            value.hue             = 200U;
            value.saturation      = 50U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHueAndSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH reads CurrentHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000 && CC.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH sends MoveToHueAndSaturation command to DUT with Hue=160, Saturation=80 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHueAndSaturation::Type value;
            value.hue             = 160U;
            value.saturation      = 80U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHueAndSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_1Suite : public TestCommand
{
public:
    Test_TC_CC_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_5_1", 61, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_5_1Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 16711U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 22609U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 13107U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32768U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 13107U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 19660U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("options", value, 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 16711U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 22609U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 32768U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentY", value, 19660U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 32768U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentY", value, 19660U));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 22282U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 30146U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("options", value, 1U));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 16711U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 22609U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11141U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15073U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 13107U));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentY", value, 13107U));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 22282U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 30146U));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27853U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 37683U));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 32768U;
            value.colorY          = 19660U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(
                7,
                "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 TransitionTime = 200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 13107U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH read Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20,
                    "TH sends a MoveToColor command to the DUT with ColorX = 32768/0x8000 (x=0.5) (purple) ColorY = 19660/0x4CCC "
                    "(y=0.3) TransitionTime = 0 (immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 32768U;
            value.colorY          = 19660U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25,
                    "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 13107U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29,
                    "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 32768U;
            value.transitionTime  = 0U;
            value.optionsMask     = 1U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33,
                    "TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 26214U;
            value.colorY          = 32768U;
            value.transitionTime  = 0U;
            value.optionsMask     = 1U;
            value.optionsOverride = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TH writes 1 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "TH read Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 40: {
            LogStep(40,
                    "TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 32768U;
            value.colorY          = 19660U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 41: {
            LogStep(41, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 42: {
            LogStep(42, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 43: {
            LogStep(43, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 45: {
            LogStep(45,
                    "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 13107U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 47: {
            LogStep(47, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49,
                    "TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 13107U;
            value.colorY          = 32768U;
            value.transitionTime  = 0U;
            value.optionsMask     = 1U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 51: {
            LogStep(51, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 52: {
            LogStep(52, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 53: {
            LogStep(53,
                    "TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 TransitionTime = 0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 26214U;
            value.colorY          = 32768U;
            value.transitionTime  = 0U;
            value.optionsMask     = 1U;
            value.optionsOverride = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 54: {
            LogStep(54, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 55: {
            LogStep(55, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 56: {
            LogStep(56, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 57: {
            LogStep(57, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 58: {
            LogStep(58, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 60: {
            LogStep(60, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_2Suite : public TestCommand
{
public:
    Test_TC_CC_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_5_2", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_5_2Suite() {}

    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;

    uint16_t CurrentXValue;
    uint16_t CurrentYValue;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 27200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 36800U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 22900U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 31100U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 26350U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 35650U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 23800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32200U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 25500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 34500U));
                CurrentXValue = value;
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 24650U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 33350U));
                CurrentYValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 25500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 34500U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 24650U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 33350U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 26000 TransitionTime = 0 (immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 33000U;
            value.colorY          = 26000U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveColor command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColor::Type value;
            value.rateX           = -100;
            value.rateY           = 100;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColor::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_3Suite : public TestCommand
{
public:
    Test_TC_CC_5_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_5_3", 19, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_5_3Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 13000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 33000U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 14000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 20000U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11050U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 14950U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11900U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 16100U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11050U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 14950U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 11900U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 16100U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 1U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 20000 TransitionTime = 0 (immediate)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColor::Type value;
            value.colorX          = 33000U;
            value.colorY          = 20000U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends StepColor command to DUT, with StepX = -20000, StepY = -6000, TransitionTime = 200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepColor::Type value;
            value.stepX           = -20000;
            value.stepY           = -6000;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColor::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentX attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentX::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads CurrentY attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentY::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F03 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_1Suite : public TestCommand
{
public:
    Test_TC_CC_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_6_1", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_6_1Suite() {}

    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;

    uint16_t ColorTempPhysicalMinMiredsValue;
    uint16_t ColorTempPhysicalMaxMiredsValue;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMinMiredsValue = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMaxMiredsValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 246U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 334U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 230U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 310U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 212U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 288U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 212U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 288U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads ColorTempPhysicalMaxMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=310 and TransitionTime=0 "
                    "(immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperatureMireds = 310U;
            value.transitionTime         = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8,
                    "TH sends MoveToColorTemperatur command to DUT with ColorTemperatureMireds=250 and TransitionTime=300 (30s).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperatureMireds = 250U;
            value.transitionTime         = 300U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_2Suite : public TestCommand
{
public:
    Test_TC_CC_6_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_6_2", 32, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_6_2Suite() {}

    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;

    uint16_t ColorTempPhysicalMinMiredsValue;
    uint16_t ColorTempPhysicalMaxMiredsValue;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMinMiredsValue = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMaxMiredsValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorTemperatureMireds", value, ColorTempPhysicalMaxMiredsValue));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorTemperatureMireds", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            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("colorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads ColorTempPhysicalMaxMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=(ColorTempPhysicalMinMireds + "
                    "ColorTempPhysicalMaxMireds)/2 and TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperatureMireds =
                static_cast<uint16_t>((ColorTempPhysicalMinMiredsValue + ColorTempPhysicalMaxMiredsValue) / 2);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x01 (up), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/40");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue) / 40);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x03(down), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/20");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(3);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue) / 20);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x01(up), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/20");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue) / 20);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24,
                    "After 10 seconds, TH sends MoveColorTemperature command to DUT with MoveMode = 0x00(stop), Rate = "
                    "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds)/20");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue) / 20);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Wait 2s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 31: {
            LogStep(31, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_3Suite : public TestCommand
{
public:
    Test_TC_CC_6_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_6_3", 26, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_6_3Suite() {}

    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;

    uint16_t ColorTempPhysicalMinMiredsValue;
    uint16_t ColorTempPhysicalMaxMiredsValue;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMinMiredsValue = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMaxMiredsValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMaxMiredsValue - 1));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorTemperatureMireds", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMiredsValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMiredsValue));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 2U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads ColorTempPhysicalMaxMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=(ColorTempPhysicalMinMireds + "
                    "ColorTempPhysicalMaxMireds)/2 and TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperatureMireds =
                static_cast<uint16_t>((ColorTempPhysicalMinMiredsValue + ColorTempPhysicalMaxMiredsValue) / 2);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8,
                    "TH sends StepColorTemperature command to DUT with StepMode = 0x01 (up), StepSize = "
                    "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds)/2 and TransitionTime = 200 (20s).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepColorTemperature::Type value;
            value.stepMode       = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(1);
            value.stepSize       = static_cast<uint16_t>((ColorTempPhysicalMinMiredsValue + ColorTempPhysicalMaxMiredsValue) / 2);
            value.transitionTime = 200U;
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15,
                    "TH sends StepColorTemperature command to DUT with StepMode = 0x03 (down), StepSize = "
                    "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds) and TransitionTime = 200 (20s).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StepColorTemperature::Type value;
            value.stepMode       = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(3);
            value.stepSize       = static_cast<uint16_t>(ColorTempPhysicalMaxMiredsValue - ColorTempPhysicalMinMiredsValue);
            value.transitionTime = 200U;
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMiredsValue;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMiredsValue;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C4c.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_2Suite : public TestCommand
{
public:
    Test_TC_CC_7_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_2", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_2Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 21250U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 28750U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 25500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 34500U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 29750U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 40250U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 29750U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 40250U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 17000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23000U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 12750U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 17250U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            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("enhancedColorMode", value, 3U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=20000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 20000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x01 (up) and Rate=500 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate            = 500U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait 2s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=25000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 25000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x03 (down) and Rate=500 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(3);
            value.rate            = 500U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(0);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Wait 2s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_3Suite : public TestCommand
{
public:
    Test_TC_CC_7_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_3", 29, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_3Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5100U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6900U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5100U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6900U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 3U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends EnhancedStepHue command to DUT with StepMode=0x01 (up), StepSize=6000 and TransitionTime=300 (30s).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedStepHue::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(1);
            value.stepSize        = 6000U;
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedStepHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 12000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(
                16,
                "TH sends EnhancedStepHue command to DUT with StepMode=0x03 (down), StepSize=6000 and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedStepHue::Type value;
            value.stepMode        = static_cast<chip::app::Clusters::ColorControl::HueStepMode>(3);
            value.stepSize        = 6000U;
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedStepHue::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_4Suite : public TestCommand
{
public:
    Test_TC_CC_7_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_4", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_4Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 17000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23000U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 42U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 58U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 16000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 20000U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 50U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 80U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 13600U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 18400U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, 16000U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentSaturation", value, 80U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 3U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=20000, Saturation=50 and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C43.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHueAndSaturation::Type value;
            value.enhancedHue     = 20000U;
            value.saturation      = 50U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                               ColorControl::Commands::EnhancedMoveToHueAndSaturation::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7,
                    "TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=16000, Saturation=80 and "
                    "TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C43.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHueAndSaturation::Type value;
            value.enhancedHue     = 16000U;
            value.saturation      = 80U;
            value.transitionTime  = 200U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                               ColorControl::Commands::EnhancedMoveToHueAndSaturation::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_8_1Suite : public TestCommand
{
public:
    Test_TC_CC_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_8_1", 39, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_8_1Suite() {}

    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;

    uint16_t ColorTempPhysicalMinMireds;
    uint16_t ColorTempPhysicalMaxMireds;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 216U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMinMireds = value;
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65279U));
                ColorTempPhysicalMaxMireds = value;
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMireds));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMireds));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorTempPhysicalMinMireds));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, ColorTempPhysicalMaxMireds));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 21250U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 28750U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 21250U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 28750U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 200U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH sends MoveHue command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0000 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0000 && CC.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToSaturation::Type value;
            value.saturation      = 150U;
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id,
                               value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveSaturation::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::SaturationMoveMode>(1);
            value.rate            = 5U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads CurrentSaturation attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads ColorTempPhysicalMinMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A400b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMinMireds::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads ColorTempPhysicalMaxMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.A400c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21,
                    "TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds= ColorTempPhysicalMaxMireds / 2 "
                    "and TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToColorTemperature::Type value;
            value.colorTemperatureMireds = static_cast<uint16_t>((ColorTempPhysicalMinMireds + ColorTempPhysicalMaxMireds) / 2);
            value.transitionTime         = 0U;
            value.optionsMask            = 0U;
            value.optionsOverride        = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x01 (up), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/40");
            VerifyOrDo(!ShouldSkip("CC.S.C4b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveColorTemperature::Type value;
            value.moveMode = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate     = static_cast<uint16_t>((ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds) / 40);
            value.colorTemperatureMinimumMireds = ColorTempPhysicalMinMireds;
            value.colorTemperatureMaximumMireds = ColorTempPhysicalMaxMireds;
            value.optionsMask                   = 0U;
            value.optionsOverride               = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id,
                               value, chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.C4b.Rsp && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.A0007 && CC.S.C4b.Rsp && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.A0007 && CC.S.C4b.Rsp && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorTemperatureMireds::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=20000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 20000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH sends EnhancedMoveHue command to DUT with MoveMode=0x01 (up) and Rate=500 (units/s)");
            VerifyOrDo(!ShouldSkip("CC.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveHue::Type value;
            value.moveMode        = static_cast<chip::app::Clusters::ColorControl::HueMoveMode>(1);
            value.rate            = 500U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id, value,
                               chip::NullOptional

            );
        }
        case 32: {
            LogStep(32, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH sends StopMoveStep command to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::StopMoveStep::Type value;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id, value,
                               chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4000 && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 36: {
            LogStep(36, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.A4000 && CC.S.C47.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestColorControl_9_1Suite : public TestCommand
{
public:
    TestColorControl_9_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestColorControl_9_1", 72, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
    }

    ~TestColorControl_9_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;

    uint16_t ColorLoopStartEnhancedHueStep5d;
    uint16_t ColorLoopStoredEnhancedHueStep6c;
    uint16_t ColorLoopStartEnhancedHueStep8d;
    uint16_t ColorLoopStoredEnhancedHueStep9c;
    uint16_t ColorLoopStartEnhancedHueStep12d;
    uint16_t ColorLoopStoredEnhancedHueStep13c;
    uint16_t ColorLoopStartEnhancedHueStep15d;
    uint16_t ColorLoopStoredEnhancedHueStep16b;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 5U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStartEnhancedHue", value, 160U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep5d = value;
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep5d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep5d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep6c = value;
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep6c));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 1U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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("colorLoopActive", value, 1U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep8d = value;
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep8d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep8d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep9c = value;
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep9c));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, 16384U));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep12d = value;
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep12d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep12d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep13c = value;
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep13c));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 1U));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep15d = value;
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep15d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep15d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep16b = value;
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep16b));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x0 (decrement hue) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Read ColorLoopDirection attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x4 (UpdateTime) and Time attribute to 5 (5s "
                    "for one loop) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(4U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 5U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Read ColorLoopTime attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x8 (UpdateStartHue) and StartHue attribute to "
                    "0x00A0 to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(8U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 160U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Read ColorLoopStartEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Saving value for comparison in step 8d read ColorLoopStartEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Saving value for comparison in step 6c read ColorLoopStoredEnhancedHue attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x1 (increment hue) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(1);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Read ColorLoopDirection attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "Saving value for comparision in step 8d read ColorLoopStartEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 35: {
            LogStep(35,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Saving value for comparision in step 9c read ColorLoopStoredEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 39: {
            LogStep(39,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "Wait 10ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 42: {
            LogStep(42,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x0 (decrement hue) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 43: {
            LogStep(43, "Read ColorLoopDirection attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 44: {
            LogStep(44,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x2 "
                    "(start from EnhancedCurrentHue) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(2);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 45: {
            LogStep(45, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 48: {
            LogStep(48, "Saving value for comparision in step 12d read ColorLoopStartEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 51: {
            LogStep(51, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 52: {
            LogStep(52,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 53: {
            LogStep(53, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Saving value for comparision in step 13c read ColorLoopStoredEnhancedHue attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 56: {
            LogStep(56,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x1 (increment hue) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(1);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 57: {
            LogStep(57, "Read ColorLoopDirection attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 58: {
            LogStep(58,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x2 "
                    "(start from EnhancedCurrentHue) to DUT");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(2);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 59: {
            LogStep(59, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 62: {
            LogStep(62, "Saving value for comparision in step 15d read ColorLoopStartEnhancedHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 65: {
            LogStep(65, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 66: {
            LogStep(66,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 67: {
            LogStep(67, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 68: {
            LogStep(68, "Saving value for comparision in step 16b read ColorLoopStoredEnhancedHue attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 70: {
            LogStep(70, "Turn Off light for color control tests");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 71: {
            LogStep(71, "Check on/off attribute value is false after off command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestColorControl_9_2Suite : public TestCommand
{
public:
    TestColorControl_9_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestColorControl_9_2", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestColorControl_9_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t ColorLoopStartEnhancedHueValue;
    uint16_t ColorLoopStartEnhancedHue;
    uint16_t ColorLoopStoredEnhancedHueValue;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 5U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStartEnhancedHue", value, 160U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 1U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHue = value;
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueValue = value;
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueValue));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0xF, Action attribute to 0x0 (De-activate), "
                    "Direction attribute to 0x0 (decrement hue), Time attribute to 30, and StartHue attribute to 0x00A0 to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(15U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 5U;
            value.startHue        = 160U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read ColorLoopDirection attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read ColorLoopTime attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read ColorLoopStartEnhancedHue attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Read ColorLoopActive attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read ColorLoopStoredEnhancedHue attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Saving value for comparision read ColorLoopStartEnhancedHue attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x1 (increment hue) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(1);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read ColorLoopDirection attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Saving value for comparision read ColorLoopStartEnhancedHue attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait for 5S");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "Read EnhancedCurrentHue attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Read ColorLoopActive attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Saving value for comparision read ColorLoopStoredEnhancedHue attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read EnhancedCurrentHue attribute from DUT.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Turn off light for color control tests");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_1_2Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_1_2", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_1_2Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_1_1Suite : public TestCommand
{
public:
    Test_TC_BINFO_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_1_1", 14, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BINFO_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 2U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 13UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads optional attribute(ManufacturingDate) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads optional attribute(PartNumber) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads optional attribute(ProductURL) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads optional attribute(ProductLabel) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads optional attribute(SerialNumber) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads optional attribute(LocalConfigDisabled) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads optional attribute(Reachable) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads optional attribute(UniqueID) in attributeList");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH1 reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH1 reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_2_1Suite : public TestCommand
{
public:
    Test_TC_BINFO_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_2_1", 68, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BINFO_2_1Suite()
    {
        if (VendorNameValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(VendorNameValueBuffer);
            VendorNameValueBuffer = nullptr;
        }
        if (ProductNameValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ProductNameValueBuffer);
            ProductNameValueBuffer = nullptr;
        }
        if (NodeLabelValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(NodeLabelValueBuffer);
            NodeLabelValueBuffer = nullptr;
        }
        if (HardwareVersionStringValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(HardwareVersionStringValueBuffer);
            HardwareVersionStringValueBuffer = nullptr;
        }
        if (SoftwareVersionStringValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(SoftwareVersionStringValueBuffer);
            SoftwareVersionStringValueBuffer = nullptr;
        }
        if (ManufacturingDateValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ManufacturingDateValueBuffer);
            ManufacturingDateValueBuffer = nullptr;
        }
        if (PartNumberValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(PartNumberValueBuffer);
            PartNumberValueBuffer = nullptr;
        }
        if (ProductURLValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ProductURLValueBuffer);
            ProductURLValueBuffer = nullptr;
        }
        if (ProductLabelValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(ProductLabelValueBuffer);
            ProductLabelValueBuffer = nullptr;
        }
        if (SerialNumberValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(SerialNumberValueBuffer);
            SerialNumberValueBuffer = nullptr;
        }
        if (UniqueIDValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(UniqueIDValueBuffer);
            UniqueIDValueBuffer = nullptr;
        }
    }

    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;

    uint16_t DataModelRevisionValue;
    char * VendorNameValueBuffer = nullptr;
    chip::CharSpan VendorNameValue;
    chip::VendorId VendorIDValue;
    char * ProductNameValueBuffer = nullptr;
    chip::CharSpan ProductNameValue;
    uint16_t ProductIDValue;
    char * NodeLabelValueBuffer = nullptr;
    chip::CharSpan NodeLabelValue;
    uint16_t HardwareVersionValue;
    char * HardwareVersionStringValueBuffer = nullptr;
    chip::CharSpan HardwareVersionStringValue;
    uint32_t SoftwareVersionValue;
    char * SoftwareVersionStringValueBuffer = nullptr;
    chip::CharSpan SoftwareVersionStringValue;
    char * ManufacturingDateValueBuffer = nullptr;
    chip::CharSpan ManufacturingDateValue;
    char * PartNumberValueBuffer = nullptr;
    chip::CharSpan PartNumberValue;
    char * ProductURLValueBuffer = nullptr;
    chip::CharSpan ProductURLValue;
    char * ProductLabelValueBuffer = nullptr;
    chip::CharSpan ProductLabelValue;
    char * SerialNumberValueBuffer = nullptr;
    chip::CharSpan SerialNumberValue;
    char * UniqueIDValueBuffer = nullptr;
    chip::CharSpan UniqueIDValue;
    chip::app::Clusters::BasicInformation::Structs::CapabilityMinimaStruct::DecodableType CapabilityMinimaValue;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                DataModelRevisionValue = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("dataModelRevision", value, DataModelRevisionValue));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (VendorNameValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(VendorNameValueBuffer);
                }
                VendorNameValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(VendorNameValueBuffer, value.data(), value.size());
                VendorNameValue = chip::CharSpan(VendorNameValueBuffer, value.size());
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("vendorName", value, VendorNameValue));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "vendor_id", "vendor_id"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65521U));
                VendorIDValue = value;
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorID", value, VendorIDValue));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (ProductNameValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ProductNameValueBuffer);
                }
                ProductNameValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ProductNameValueBuffer, value.data(), value.size());
                ProductNameValue = chip::CharSpan(ProductNameValueBuffer, value.size());
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("productName", value, ProductNameValue));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                ProductIDValue = value;
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("productID", value, ProductIDValue));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (NodeLabelValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(NodeLabelValueBuffer);
                }
                NodeLabelValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(NodeLabelValueBuffer, value.data(), value.size());
                NodeLabelValue = chip::CharSpan(NodeLabelValueBuffer, value.size());
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("newnode", 7)));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 16));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("location", value, chip::CharSpan("in", 2)));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                HardwareVersionValue = value;
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("hardwareVersion", value, HardwareVersionValue));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 1));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 64));
                if (HardwareVersionStringValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(HardwareVersionStringValueBuffer);
                }
                HardwareVersionStringValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(HardwareVersionStringValueBuffer, value.data(), value.size());
                HardwareVersionStringValue = chip::CharSpan(HardwareVersionStringValueBuffer, value.size());
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("hardwareVersionString", value, HardwareVersionStringValue));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967294UL));
                SoftwareVersionValue = value;
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("softwareVersion", value, SoftwareVersionValue));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 1));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 64));
                if (SoftwareVersionStringValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(SoftwareVersionStringValueBuffer);
                }
                SoftwareVersionStringValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(SoftwareVersionStringValueBuffer, value.data(), value.size());
                SoftwareVersionStringValue = chip::CharSpan(SoftwareVersionStringValueBuffer, value.size());
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("softwareVersionString", value, SoftwareVersionStringValue));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 8));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 16));
                if (ManufacturingDateValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ManufacturingDateValueBuffer);
                }
                ManufacturingDateValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ManufacturingDateValueBuffer, value.data(), value.size());
                ManufacturingDateValue = chip::CharSpan(ManufacturingDateValueBuffer, value.size());
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("manufacturingDate", value, ManufacturingDateValue));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (PartNumberValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(PartNumberValueBuffer);
                }
                PartNumberValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(PartNumberValueBuffer, value.data(), value.size());
                PartNumberValue = chip::CharSpan(PartNumberValueBuffer, value.size());
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("partNumber", value, PartNumberValue));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "long_char_string", "long_char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 256));
                if (ProductURLValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ProductURLValueBuffer);
                }
                ProductURLValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ProductURLValueBuffer, value.data(), value.size());
                ProductURLValue = chip::CharSpan(ProductURLValueBuffer, value.size());
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("productURL", value, ProductURLValue));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 64));
                if (ProductLabelValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(ProductLabelValueBuffer);
                }
                ProductLabelValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(ProductLabelValueBuffer, value.data(), value.size());
                ProductLabelValue = chip::CharSpan(ProductLabelValueBuffer, value.size());
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("productLabel", value, ProductLabelValue));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (SerialNumberValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(SerialNumberValueBuffer);
                }
                SerialNumberValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(SerialNumberValueBuffer, value.data(), value.size());
                SerialNumberValue = chip::CharSpan(SerialNumberValueBuffer, value.size());
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("serialNumber", value, SerialNumberValue));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, false));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, true));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("reachable", value, true));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("reachable", value, true));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
                if (UniqueIDValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(UniqueIDValueBuffer);
                }
                UniqueIDValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(UniqueIDValueBuffer, value.data(), value.size());
                UniqueIDValue = chip::CharSpan(UniqueIDValueBuffer, value.size());
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("uniqueID", value, UniqueIDValue));
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::BasicInformation::Structs::CapabilityMinimaStruct::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                CapabilityMinimaValue = value;
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::BasicInformation::Structs::CapabilityMinimaStruct::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        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, "During Commissioning, TH Saves the CountryCode Information from SetRegulatoryConfig command");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH reads DataModelRevision from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::DataModelRevision::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH writes DataModelRevision from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 4388U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::DataModelRevision::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads DataModelRevision from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::DataModelRevision::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads VendorName from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorName::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH writes VendorName from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("samplegarbage: not in length on purpose", 6);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::VendorName::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads VendorName from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorName::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads VendorID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Verify that VendorID matches the value assigned to this manufacturer");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH writes VendorID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::VendorId value;
            value = static_cast<chip::VendorId>(17);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads VendorID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads ProductName from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::ProductName::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH writes ProductName from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newproductgarbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::ProductName::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads ProductName from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::ProductName::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads ProductID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::ProductID::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH writes ProductID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 17697U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::ProductID::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads ProductID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::ProductID::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads NodeLabel from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH writes NodeLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newnodegarbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads NodeLabel from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads Location from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Verify that the Location is same as CountryCode value saved from step1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH write Location from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("ingarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads Location from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads HardwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::HardwareVersion::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH writes HardwareVersion from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 17713U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::HardwareVersion::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads HardwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::HardwareVersion::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads HardwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::HardwareVersionString::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH writes HardwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newhardwareversiongarbage: not in length on purpose", 18);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::HardwareVersionString::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH reads HardwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::HardwareVersionString::Id, true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH reads SoftwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::SoftwareVersion::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32,
                    "Verify that the SoftwareVersion is not displayed to the end-user through any device specific means (ex: "
                    "screen, audio)");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH writes SoftwareVersion from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 33299UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::SoftwareVersion::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "TH reads SoftwareVersion from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::SoftwareVersion::Id, true, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "TH reads SoftwareVersionString from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::SoftwareVersionString::Id, true, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH writes SoftwareVersionString from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("1.0garbage: not in length on purpose", 3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::SoftwareVersionString::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TH reads SoftwareVersionString from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::SoftwareVersionString::Id, true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "TH reads ManufacturingDate from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::ManufacturingDate::Id, true, chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Verify if the first 8 characters specify date according to ISO 8601, i.e, YYYYMMDD");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40, "TH writes ManufacturingDate from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("20210814789452INgarbage: not in length on purpose", 16);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::ManufacturingDate::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 41: {
            LogStep(41, "TH reads ManufacturingDate from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::ManufacturingDate::Id, true, chip::NullOptional);
        }
        case 42: {
            LogStep(42, "TH reads PartNumber from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::PartNumber::Id,
                                 true, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "TH writes PartNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newpartgarbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::PartNumber::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 44: {
            LogStep(44, "TH reads PartNumber from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::PartNumber::Id,
                                 true, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "TH reads ProductURL from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::ProductURL::Id,
                                 true, chip::NullOptional);
        }
        case 46: {
            LogStep(46,
                    "Verify that it specifies a link to a specific web page, Verify that it follows the syntax rules specified in "
                    "RFC 3986.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 47: {
            LogStep(47, "TH writes ProductURL from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("https://www.example.comgarbage: not in length on purpose", 23);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::ProductURL::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads ProductURL from the DUT");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::ProductURL::Id,
                                 true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "TH reads ProductLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::ProductLabel::Id, true, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Verify that it does not include the name of the vendor as defined within the VendorName attribute");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 51: {
            LogStep(51, "TH writes ProductLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newproductlabelgarbage: not in length on purpose", 15);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::ProductLabel::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 52: {
            LogStep(52, "TH reads ProductLabel from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::ProductLabel::Id, true, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "TH reads SerialNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::SerialNumber::Id, true, chip::NullOptional);
        }
        case 54: {
            LogStep(54, "TH writes SerialNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newserialnumbergarbage: not in length on purpose", 15);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::SerialNumber::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "TH reads SerialNumber from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::SerialNumber::Id, true, chip::NullOptional);
        }
        case 56: {
            LogStep(56, "TH reads LocalConfigDisabled from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::LocalConfigDisabled::Id, true, chip::NullOptional);
        }
        case 57: {
            LogStep(57, "TH sets LocalConfigDisabled to True");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::LocalConfigDisabled::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 58: {
            LogStep(58, "TH reads LocalConfigDisabled from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::LocalConfigDisabled::Id, true, chip::NullOptional);
        }
        case 59: {
            LogStep(59, "TH reads Reachable from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Reachable::Id,
                                 true, chip::NullOptional);
        }
        case 60: {
            LogStep(60, "TH sends Write request message to DUT to change value of Reachable to false");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Reachable::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 61: {
            LogStep(61, "TH reads Reachable from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Reachable::Id,
                                 true, chip::NullOptional);
        }
        case 62: {
            LogStep(62, "TH reads UniqueID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::UniqueID::Id,
                                 true, chip::NullOptional);
        }
        case 63: {
            LogStep(63, "TH writes UniqueID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("newidgarbage: not in length on purpose", 5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::UniqueID::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 64: {
            LogStep(64, "TH reads UniqueID from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::UniqueID::Id,
                                 true, chip::NullOptional);
        }
        case 65: {
            LogStep(65, "TH reads CapabilityMinima attribute from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::CapabilityMinima::Id, true, chip::NullOptional);
        }
        case 66: {
            LogStep(66, "TH writes CapabilityMinima from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::BasicInformation::Structs::CapabilityMinimaStruct::Type value;

            value.caseSessionsPerFabric  = 4U;
            value.subscriptionsPerFabric = 4U;

            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::CapabilityMinima::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 67: {
            LogStep(67, "TH reads CapabilityMinima attribute from the DUT.");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::CapabilityMinima::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_1_3Suite : public TestCommand
{
public:
    Test_TC_CNET_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_1_3", 16, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_1_3Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !CNET.S.F00 && !CNET.S.F01 && !CNET.S.F02 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: FeatureMap when CNET.S.F00 is set");
            VerifyOrDo(!ShouldSkip("CNET.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: FeatureMap when CNET.S.F01 is set");
            VerifyOrDo(!ShouldSkip("CNET.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: FeatureMap when CNET.S.F02 is set");
            VerifyOrDo(!ShouldSkip("CNET.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read mandatory attributes in AttributeList if CNET.S.F00(WI)/CNET.S.F01(TH)/CNET.S.F02(ET) is true");
            VerifyOrDo(!ShouldSkip("CNET.S.F00 || CNET.S.F01 || CNET.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute(ScanMaxTimeSeconds): AttributeList");
            VerifyOrDo(!ShouldSkip("CNET.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Reading optional attribute(ConnectMaxTimeSeconds) in AttributeList");
            VerifyOrDo(!ShouldSkip("CNET.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read AcceptedCommandList If DUT supports Wi-Fi/Thread related features CNET.S.F00(WI),CNET.S.F01(TH)");
            VerifyOrDo(!ShouldSkip("CNET.S.F00 || CNET.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read AcceptedCommandList If DUT supports Wi-Fi related features (CNET.S.F00(WI) is true)");
            VerifyOrDo(!ShouldSkip("CNET.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read AcceptedCommandList If DUT supports Thread related features(CNET.S.F01(TH) is true)");
            VerifyOrDo(!ShouldSkip("CNET.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read AcceptedCommandList If DUT supports Ethernet related features(CNET.S.F02(TH) is true)");
            VerifyOrDo(!ShouldSkip("CNET.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "Read the GeneratedCommandList If DUT supports Wi-Fi/Thread related features(CNET.S.F00(WI) or CNET.S.F01(TH) "
                    "is true)");
            VerifyOrDo(!ShouldSkip("CNET.S.F00 || CNET.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the GeneratedCommandList If DUT supports Ethernet related features(CNET.S.F02(ET) must be true)");
            VerifyOrDo(!ShouldSkip("CNET.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), NetworkCommissioning::Id,
                                 NetworkCommissioning::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DESC_1_1Suite : public TestCommand
{
public:
    Test_TC_DESC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DESC_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DESC_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_1_1Suite : public TestCommand
{
public:
    Test_TC_DLOG_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DLOG_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DLOG_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("acceptedCommandList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 1));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("generatedCommandList[0]", iter_0.GetValue(), 1UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 1));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id,
                                 DiagnosticLogs::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id, DiagnosticLogs::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id, DiagnosticLogs::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id,
                                 DiagnosticLogs::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), DiagnosticLogs::Id,
                                 DiagnosticLogs::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_1_1Suite : public TestCommand
{
public:
    Test_TC_DGETH_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_1_1", 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_DGETH_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !DGETH.S.F00 && !DGETH.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DGETH.S.F00 ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGETH.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given DGETH.S.F01 ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGETH.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads optional attribute(PHYRate) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads optional attribute(FullDuplex) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads optional attribute(CarrierDetect) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads optional attribute(TimeSinceReset) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.F00 || DGETH.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip(" !DGETH.S.F00 && !DGETH.S.F01 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_2_1Suite : public TestCommand
{
public:
    Test_TC_DGETH_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_2_1", 17, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGETH_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Read PHYRate attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FullDuplex attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::FullDuplex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read PacketRxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketRxCount::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read PacketRxCount value from DUT and verify the number of packets received on ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Read PacketTxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketTxCount::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read PacketTxCount value from DUT and verify the number of packets received on ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Read TxErrCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::TxErrCount::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8,
                    "Read TxErrCount value from DUT and verify value indicates the number of failed packet transmission on "
                    "ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Read CollisionCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::CollisionCount::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "Read CollisionCount value from DUT and verify value indicates the number of collision occurred while "
                    "transmitting packets on ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Read OverrunCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12,
                    "Read OverrunCount value from DUT and verify value indicates the number of packets dropped due to lack of "
                    "buffer memory on ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Read CarrierDetect attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::CarrierDetect::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "Read CarrierDetect value from DUT and verify value indicates the presence of carrier detect control signal on "
                    "ethernet network interface");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Read TimeSinceReset attribute constraints");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::TimeSinceReset::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read TimeSinceReset value from DUT and verify the value indicates the duration of time, in minutes");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_2_2Suite : public TestCommand
{
public:
    Test_TC_DGETH_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_2_2", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGETH_2_2Suite() {}

    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;

    uint64_t PacketRxCount;
    uint64_t PacketTxCount;
    uint64_t TxErrCount;
    uint64_t CollisionCount;
    uint64_t OverrunCount;

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                PacketRxCount = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                PacketTxCount = value;
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TxErrCount = value;
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                CollisionCount = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OverrunCount = value;
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, TxErrCount));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, CollisionCount));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, OverrunCount));
            }
            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;
        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, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads PHYRate attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PHYRate::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads PacketRxCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketRxCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads PacketTxCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::PacketTxCount::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads TxErrCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::TxErrCount::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads CollisionCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::CollisionCount::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads OverrunCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Sends ResetCounts command");
            VerifyOrDo(!ShouldSkip("DGETH.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::EthernetNetworkDiagnostics::Commands::ResetCounts::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                               EthernetNetworkDiagnostics::Commands::ResetCounts::Id, value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "TH reads PacketRxCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0002 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads PacketTxCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0003 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads TxErrCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::TxErrCount::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads CollisionCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::CollisionCount::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads OverrunCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGETH.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), EthernetNetworkDiagnostics::Id,
                                 EthernetNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_1_1Suite : public TestCommand
{
public:
    Test_TC_FLW_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLW_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLW_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id, FlowMeasurement::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("FLW.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_2_1Suite : public TestCommand
{
public:
    Test_TC_FLW_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLW_2_1", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLW_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65533U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            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;
        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, "Read the mandatory attribute: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads from the DUT the Tolerance attribute");
            VerifyOrDo(!ShouldSkip("FLW.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id, FlowMeasurement::Attributes::Tolerance::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLABEL_1_1Suite : public TestCommand
{
public:
    Test_TC_FLABEL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLABEL_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLABEL_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLABEL_2_1Suite : public TestCommand
{
public:
    Test_TC_FLABEL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLABEL_2_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLABEL_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::FixedLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "TH reads LabelList from the DUT");
            VerifyOrDo(!ShouldSkip("FLABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH tries to write LabelList attribute of the DUT by setting Label = Test_Label, Value= Test_Value");
            VerifyOrDo(!ShouldSkip("FLABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::FixedLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::FixedLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("Test_Labelgarbage: not in length on purpose", 10);
                listHolder_0->mList[0].value = chip::Span<const char>("Test_Valuegarbage: not in length on purpose", 10);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::FixedLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FixedLabel::Id, FixedLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads LabelList from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && FLABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_1_1Suite : public TestCommand
{
public:
    Test_TC_CGEN_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CGEN_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CGEN_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_2_1Suite : public TestCommand
{
public:
    Test_TC_CGEN_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CGEN_2_1", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CGEN_2_1Suite() {}

    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
    {
        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));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 1ULL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::RegulatoryLocationType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::RegulatoryLocationType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Structs::BasicCommissioningInfo::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            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;
        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, "TH1 reads the BreadCrumb Attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH1 writes the BreadCrumb attribute as 1 to the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint64_t value;
            value = 1ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH1 reads the BreadCrumb attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH1 reads the RegulatoryConfig attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::RegulatoryConfig::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH1 reads the LocationCapability attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::LocationCapability::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH1 reads BasicCommissioningInfo attribute from DUT and Verify that the BasicCommissioningInfo attribute has "
                    "the following field: FailSafeExpiryLengthSeconds field value is within a duration range of 0 to 65535");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::BasicCommissioningInfo::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH1 reads SupportsConcurrentConnection attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CGEN.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::SupportsConcurrentConnection::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_1_1Suite : public TestCommand
{
public:
    Test_TC_DGGEN_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_1_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGGEN_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read optional attribute(UpTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read optional attribute(TotalOperationalHours) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read optional attribute(BootReason) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read optional attribute(ActiveHardwareFaults) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read optional attribute(ActiveRadioFaults) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read optional attribute(ActiveNetworkFaults) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_2_1Suite : public TestCommand
{
public:
    Test_TC_DGGEN_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_2_1", 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_DGGEN_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GeneralDiagnostics::Structs::NetworkInterface::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967294UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralDiagnostics::BootReasonEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "TH reads NetworkInterfaces structure attribute from DUT.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::NetworkInterfaces::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads a RebootCount attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::RebootCount::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "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 8: {
            LogStep(8,
                    "DUT reboots and TH reads a UpTime attribute value of DUT since some arbitrary start time of DUT rebooting.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id, GeneralDiagnostics::Attributes::UpTime::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads a TotalOperationalHours attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::TotalOperationalHours::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "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 13: {
            LogStep(13, "TH reads BootReason attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("DGGEN.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::BootReason::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads ActiveHardwareFaults attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads ActiveRadioFaults attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads ActiveNetworkFaults attribute value from DUT.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads TestEventTriggersEnabled attribute value");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_1_1Suite : public TestCommand
{
public:
    Test_TC_I_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 64UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional command(TriggerEffect) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_1Suite : public TestCommand
{
public:
    Test_TC_I_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_2_1", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_2_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            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;
        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, "TH reads the IdentifyTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the IdentifyType attribute from the DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyType::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_2Suite : public TestCommand
{
public:
    Test_TC_I_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_2_2", 11, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_2_2Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 51U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 69U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 42U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 58U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("identifyTime", value, 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15U));
            }
            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;
        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, "TH sends Identify command to DUT, with the IdentifyTime field set to 0x003c (60s).");
            VerifyOrDo(!ShouldSkip("I.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::Identify::Type value;
            value.identifyTime = 60U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::Identify::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "TH reads immediately IdentifyTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "After 10 seconds, the TH reads IdentifyTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5,
                    "TH sends IdentifyQuery command to DUT and Verify IdentifyQueryResponse command to TH,with the Timeout field "
                    "set to a value in the range 0x0000 to 0x0032");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C01.Rsp && I.S.C00.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH sends Identify command to DUT, with the IdentifyTime field set to 0x0000 (stop identifying).");
            VerifyOrDo(!ShouldSkip("I.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::Identify::Type value;
            value.identifyTime = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::Identify::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH reads immediately IdentifyTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH writes a value of 0x000f (15s) to IdentifyTime attribute of DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "After 5 seconds, the TH reads IdentifyTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("I.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::IdentifyTime::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_3Suite : public TestCommand
{
public:
    Test_TC_I_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_2_3", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_2_3Suite() {}

    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "1.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,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(0);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "DUT executes a blink effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 breathe and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(1);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "DUT executes a breathe effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x02 okay and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(2);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "DUT executes an okay effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x0b channel change and the "
                    "effect variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(11);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "DUT executes a channel change effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 breathe and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(1);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "DUT executes a breathe effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0xfe finish effect and the "
                    "effect variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(254);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "DUT stops the breathe effect after the current effect sequence");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 breathe and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(1);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "DUT executes a breathe effect");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0xff stop effect and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(255);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "DUT stops the breathe effect as soon as possible.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink and the effect "
                    "variant field set to 0x42 unknown");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(0);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(66);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Check DUT executes a blink effect.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19,
                    "TH sends TriggerEffect command to DUT with the effect identifier field set to 0xff stop effect and the effect "
                    "variant field set to 0x00 default");
            VerifyOrDo(!ShouldSkip("I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::TriggerEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::Identify::IdentifyEffectIdentifier>(255);
            value.effectVariant    = static_cast<chip::app::Clusters::Identify::IdentifyEffectVariant>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Commands::TriggerEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "DUT stops any effect that may be still running as soon as possible");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_1_1Suite : public TestCommand
{
public:
    Test_TC_ILL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ILL_1_1", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ILL_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("ILL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(LightSensorType) in AttributeList");
            VerifyOrDo(!ShouldSkip("ILL.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_2_1Suite : public TestCommand
{
public:
    Test_TC_ILL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ILL_2_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ILL_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65533U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 2U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            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;
        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, "TH reads MinMeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads MaxMeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads MeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads Tolerance attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::Tolerance::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads LightSensorType attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::LightSensorType::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_2_2Suite : public TestCommand
{
public:
    Test_TC_ILL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ILL_2_2", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ILL_2_2Suite() {}

    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::app::DataModel::Nullable<uint16_t> MinMeasuredValue;
    chip::app::DataModel::Nullable<uint16_t> MaxMeasuredValue;

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                MinMeasuredValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                MaxMeasuredValue = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            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;
        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, "TH reads MinMeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads MaxMeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("ILL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Cover the sensor or darken the room");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for Successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Wait 1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "After a few seconds, TH reads MeasuredValue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("ILL.S.A0000 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Expose the sensor again to light");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for Successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Wait 1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "After a few seconds, TH reads MeasuredValue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("ILL.S.A0000 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), IlluminanceMeasurement::Id,
                                 IlluminanceMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_1_1Suite : public TestCommand
{
public:
    Test_TC_LVL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_1_1", 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_LVL_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16384UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !LVL.S.F00 && !LVL.S.F01 && !LVL.S.F02 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given LVL.S.F00(OO) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("LVL.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given LVL.S.F01(LT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given LVL.S.F02(FQ) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("LVL.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute(StartUpCurrentLevel and RemainingTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute(CurrentFrequency, MinFrequency and MinFrequency) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute(MinLevel) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute(MaxLevel) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional attribute(OnOffTransitionTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the optional attribute(OnTransitionTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the optional attribute(OffTransitionTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the optional attribute(DefaultMoveRate) in AttributeList");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read the Feature-dependent(LVL.S.F02) command in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("LVL.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_1Suite : public TestCommand
{
public:
    Test_TC_LVL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_2_1", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_2_1Suite() {}

    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::app::DataModel::Nullable<uint8_t> CurrentLevelValue;
    uint8_t MinLevelValue;
    uint8_t MinLevelFeatureMapNotSupportedValue;
    uint8_t MaxLevelValue;
    uint8_t MaxLevelFeatureMapNotSupportedValue;
    uint16_t MinFrequencyValue;
    uint16_t MaxFrequencyValue;

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
                CurrentLevelValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minLevel", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                MinLevelValue = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
                MinLevelFeatureMapNotSupportedValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("maxLevel", value, 254U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelValue));
                MaxLevelValue = value;
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
                MaxLevelFeatureMapNotSupportedValue = value;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxLevelValue));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxLevelFeatureMapNotSupportedValue));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                MinFrequencyValue = value;
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                MaxFrequencyValue = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinFrequencyValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxFrequencyValue));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxLevelValue));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxLevelFeatureMapNotSupportedValue));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            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;
        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, "Reads the CurrentLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the RemainingTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::RemainingTime::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the MinLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0002 && LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MinLevel::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the MinLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0002 && !LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MinLevel::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads the MaxLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0003 && LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MaxLevel::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the MaxLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0003 && !LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MaxLevel::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Step 4b & 4C Reads the CurrentLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.F01 && LVL.S.A0002 && LVL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Step 4b & 4C Reads the CurrentLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0002 && LVL.S.A0003 && !LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Reads the CurrentFrequency attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentFrequency::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads the MinFrequency attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MinFrequency::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Reads the MaxFrequency attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MaxFrequency::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Step 7b & 7C Reads the CurrentFrequency attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0004 && LVL.S.A0005 && LVL.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentFrequency::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Reads the OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::OnOffTransitionTime::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Reads the OnLevel attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.F01 && LVL.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Reads the OnLevel attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A0011 && !LVL.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Reads the OnTransitionTime attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Reads the OffTransitionTime attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OffTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Reads the DefaultMoveRate attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::DefaultMoveRate::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Reads the Options attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Reads the StartUpCurrentLevel attribute ");
            VerifyOrDo(!ShouldSkip("LVL.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::StartUpCurrentLevel::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_2Suite : public TestCommand
{
public:
    Test_TC_LVL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_2_2", 20, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("OnOffTransitionTimeConfigValue", 0, UINT16_MAX, &mOnOffTransitionTimeConfigValue);
        AddArgument("OnLevelConfigValue", 0, UINT8_MAX, &mOnLevelConfigValue);
        AddArgument("OnTransitionTimeConfigValue", 0, UINT16_MAX, &mOnTransitionTimeConfigValue);
        AddArgument("OffTransitionTimeConfigValue", 0, UINT16_MAX, &mOffTransitionTimeConfigValue);
        AddArgument("DefaultMoveRateConfigValue", 0, UINT8_MAX, &mDefaultMoveRateConfigValue);
        AddArgument("StartUpCurrentLevelConfigValue", 0, UINT8_MAX, &mStartUpCurrentLevelConfigValue);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_2_2Suite() {}

    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> mOnOffTransitionTimeConfigValue;
    chip::Optional<uint8_t> mOnLevelConfigValue;
    chip::Optional<uint16_t> mOnTransitionTimeConfigValue;
    chip::Optional<uint16_t> mOffTransitionTimeConfigValue;
    chip::Optional<uint8_t> mDefaultMoveRateConfigValue;
    chip::Optional<uint8_t> mStartUpCurrentLevelConfigValue;
    chip::Optional<uint16_t> mTimeout;

    uint16_t OnOffTransitionTimeValue;
    chip::app::DataModel::Nullable<uint8_t> OnLevelValue;
    chip::app::DataModel::Nullable<uint16_t> OnTransitionTimeValue;
    chip::app::DataModel::Nullable<uint16_t> OffTransitionTimeValue;
    chip::app::DataModel::Nullable<uint8_t> DefaultMoveRatevalue;
    chip::app::DataModel::Nullable<uint8_t> StartUpCurrentLevelValue;

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                OnOffTransitionTimeValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValue("onOffTransitionTime", value,
                               mOnOffTransitionTimeConfigValue.HasValue() ? mOnOffTransitionTimeConfigValue.Value() : 10U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OnOffTransitionTimeValue));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
                OnLevelValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("onLevel", value));
                VerifyOrReturn(CheckValue("onLevel.Value()", value.Value(),
                                          mOnLevelConfigValue.HasValue() ? mOnLevelConfigValue.Value() : 5U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OnLevelValue));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                OnTransitionTimeValue = value;
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("onTransitionTime", value));
                VerifyOrReturn(CheckValue("onTransitionTime.Value()", value.Value(),
                                          mOnTransitionTimeConfigValue.HasValue() ? mOnTransitionTimeConfigValue.Value() : 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OnTransitionTimeValue));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                OffTransitionTimeValue = value;
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("offTransitionTime", value));
                VerifyOrReturn(CheckValue("offTransitionTime.Value()", value.Value(),
                                          mOffTransitionTimeConfigValue.HasValue() ? mOffTransitionTimeConfigValue.Value() : 10U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OffTransitionTimeValue));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                DefaultMoveRatevalue = value;
            }
            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::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("defaultMoveRate", value));
                VerifyOrReturn(CheckValue("defaultMoveRate.Value()", value.Value(),
                                          mDefaultMoveRateConfigValue.HasValue() ? mDefaultMoveRateConfigValue.Value() : 111U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, DefaultMoveRatevalue));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                StartUpCurrentLevelValue = value;
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("startUpCurrentLevel", value));
                VerifyOrReturn(
                    CheckValue("startUpCurrentLevel.Value()", value.Value(),
                               mStartUpCurrentLevelConfigValue.HasValue() ? mStartUpCurrentLevelConfigValue.Value() : 5U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, StartUpCurrentLevelValue));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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, "Reads the OnOffTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::OnOffTransitionTime::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "writes the OnOffTransitionTime attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = mOnOffTransitionTimeConfigValue.HasValue() ? mOnOffTransitionTimeConfigValue.Value() : 10U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the OnOffTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::OnOffTransitionTime::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the OnLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "writes the OnLevel attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = mOnLevelConfigValue.HasValue() ? mOnLevelConfigValue.Value() : 5U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the OnLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads the OnTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Writes the OnTransitionTime attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = mOnTransitionTimeConfigValue.HasValue() ? mOnTransitionTimeConfigValue.Value() : 5U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnTransitionTime::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Reads the OnTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads the OffTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OffTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Writes the OffTransitionTime attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = mOffTransitionTimeConfigValue.HasValue() ? mOffTransitionTimeConfigValue.Value() : 10U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OffTransitionTime::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads the OffTransitionTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OffTransitionTime::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Reads the DefaultMoveRate attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::DefaultMoveRate::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Writes the DefaultMoveRate attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = mDefaultMoveRateConfigValue.HasValue() ? mDefaultMoveRateConfigValue.Value() : 111U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::DefaultMoveRate::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Reads the DefaultMoveRate attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::DefaultMoveRate::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Reads the StartUpCurrentLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::StartUpCurrentLevel::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "writes the StartUpCurrentLevel attribute on the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = mStartUpCurrentLevelConfigValue.HasValue() ? mStartUpCurrentLevelConfigValue.Value() : 5U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::StartUpCurrentLevel::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "reads the StartUpCurrentLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::StartUpCurrentLevel::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "writes back default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_3_1Suite : public TestCommand
{
public:
    Test_TC_LVL_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_3_1", 47, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_3_1Suite() {}

    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
    {
        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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            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));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 127U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 173U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("options", value, 0U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 160U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("options", value, 1U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 100U));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 120U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 120U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 160U));
            }
            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;
        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, "Precondition Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Precondition: write default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH writes NULL to the OnLevel attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH sends a MoveToLevelWithOnOff command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevelWithOnOff::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevelWithOnOff::Id,
                               value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH reads OnOff attribute (On/Off cluster) from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && LVL.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C04.Rsp && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13,
                    "TH sends a MoveToLevel command to the DUT with Level = 200 and TransitionTime = 300 (30 s). This means the "
                    "level should increase by 150 units in 30s, so 5 units/s");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 200U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 300U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 100U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 120U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 140U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 32: {
            LogStep(32, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 160U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "TH writes 1 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH reads Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 100U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 40: {
            LogStep(40, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 41: {
            LogStep(41, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 120U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 42: {
            LogStep(42, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 43: {
            LogStep(43, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 140U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 44: {
            LogStep(44, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 45: {
            LogStep(45, "TH sends a MoveToLevel command to the DUT with");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 160U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_4_1Suite : public TestCommand
{
public:
    Test_TC_LVL_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_4_1", 26, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_4_1Suite() {}

    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::app::DataModel::Nullable<uint8_t> CurrentLevelValue;

    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
    {
        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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                CurrentLevelValue = value;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            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));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 127U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 173U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 254U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "Precondition Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Precondition: write default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads the MaxLevel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MaxLevel::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp && LVL.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH sends a MoveWithOnOff command to DUT, with MoveMode =0x00 (up) and Rate =10 (units/s)");
            VerifyOrDo(!ShouldSkip("LVL.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveWithOnOff::Type value;
            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
            value.rate.SetNonNull();
            value.rate.Value()    = 10U;
            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveWithOnOff::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH reads OnOff attribute (On/Off cluster) from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && LVL.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH sends a Move command to the DUT with MoveMode =0x00 (up) and Rate =5 (units/s)");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Move::Type value;
            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
            value.rate.SetNonNull();
            value.rate.Value()    = 5U;
            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait 19s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 19000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Precondition send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_5_1Suite : public TestCommand
{
public:
    Test_TC_LVL_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_5_1", 23, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_5_1Suite() {}

    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
    {
        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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            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));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 127U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 173U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 200U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "Precondition Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Precondition: write default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp && LVL.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6,
                    "TH sends a StepWithOnOff command to DUT, with StepMode =0x00 (up), StepSize =50 and TransitionTime =0 "
                    "(immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::StepWithOnOff::Type value;
            value.stepMode = static_cast<chip::app::Clusters::LevelControl::StepMode>(0);
            value.stepSize = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::StepWithOnOff::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH reads OnOff attribute (On/Off cluster) from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && LVL.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Reads current level attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH sends a Step command to the DUT with StepMode =0x00 (up), StepSize =150 and TransitionTime =300");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Step::Type value;
            value.stepMode = static_cast<chip::app::Clusters::LevelControl::StepMode>(0);
            value.stepSize = 150U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 300U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Step::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads CurrentLevel attribute from DUT (after DUT has finished the transition)");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Precondition send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_6_1Suite : public TestCommand
{
public:
    Test_TC_LVL_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_6_1", 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_LVL_6_1Suite() {}

    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
    {
        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));
            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));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 64U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 86U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "Precondition: write default value of OnOffTransitionTime attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("LVL.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)");
            VerifyOrDo(!ShouldSkip("LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 50U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the Rate field set to "
                    "0x05 (5 units/s)");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Move::Type value;
            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
            value.rate.SetNonNull();
            value.rate.Value()    = 5U;
            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Sends stop command to DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Stop::Type value;
            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Stop::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Physically verify that the device has stopped transitioning");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && LVL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.C03.Rsp && LVL.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the Rate field set to "
                    "0x05 (5 units/s)");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::Move::Type value;
            value.moveMode = static_cast<chip::app::Clusters::LevelControl::MoveMode>(0);
            value.rate.SetNonNull();
            value.rate.Value()    = 5U;
            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::Move::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH sends a StopWithOnOff command to the DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::StopWithOnOff::Type value;
            value.optionsMask     = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            value.optionsOverride = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(0U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::StopWithOnOff::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Physically verify that the device has stopped transitioning");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && LVL.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Reads CurrentLevel attribute from DUT");
            VerifyOrDo(!ShouldSkip("LVL.S.C01.Rsp && LVL.S.C07.Rsp && LVL.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Precondition send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LCFG_1_1Suite : public TestCommand
{
public:
    Test_TC_LCFG_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LCFG_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LCFG_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), LocalizationConfiguration::Id,
                                 LocalizationConfiguration::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LUNIT_1_2Suite : public TestCommand
{
public:
    Test_TC_LUNIT_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LUNIT_1_2", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LUNIT_1_2Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffd"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffc && !LUNIT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id, UnitLocalization::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given LUNIT.S.F00(TEMP) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffc && LUNIT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id, UnitLocalization::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads Feature dependent(LUNIT.S.F00) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afffb && LUNIT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afff9"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads GeneratedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.Afff8"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LUNIT_3_1Suite : public TestCommand
{
public:
    Test_TC_LUNIT_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LUNIT_3_1", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LUNIT_3_1Suite() {}

    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
    {
        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));
            {
                chip::app::Clusters::UnitLocalization::TempUnitEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitLocalization::TempUnitEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureUnit", value, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitLocalization::TempUnitEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureUnit", value, 1U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitLocalization::TempUnitEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureUnit", value, 2U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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;
        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, "TH reads TemperatureUnit attribute from DUT");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::TemperatureUnit::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH writes 0 (Fahrenheit) to TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Fahrenheit"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::UnitLocalization::TempUnitEnum value;
            value = static_cast<chip::app::Clusters::UnitLocalization::TempUnitEnum>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                  UnitLocalization::Attributes::TemperatureUnit::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Fahrenheit"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::TemperatureUnit::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH writes 1 (Celsius) to TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Celsius"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::UnitLocalization::TempUnitEnum value;
            value = static_cast<chip::app::Clusters::UnitLocalization::TempUnitEnum>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                  UnitLocalization::Attributes::TemperatureUnit::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Celsius"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::TemperatureUnit::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH writes 2 (Kelvin) to TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Kelvin"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::UnitLocalization::TempUnitEnum value;
            value = static_cast<chip::app::Clusters::UnitLocalization::TempUnitEnum>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                  UnitLocalization::Attributes::TemperatureUnit::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Kelvin"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                 UnitLocalization::Attributes::TemperatureUnit::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH writes 5 to TemperatureUnit attribute");
            VerifyOrDo(!ShouldSkip("LUNIT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::UnitLocalization::TempUnitEnum value;
            value = static_cast<chip::app::Clusters::UnitLocalization::TempUnitEnum>(5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UnitLocalization::Id,
                                  UnitLocalization::Attributes::TemperatureUnit::Id, value, chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LTIME_1_2Suite : public TestCommand
{
public:
    Test_TC_LTIME_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LTIME_1_2", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LTIME_1_2Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffd"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffc"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads optional attribute(ActiveCalendarType) in AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffb && LTIME.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads optional attribute(SupportedCalendarTypes) in AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afffb && LTIME.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afff9"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads GeneratedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("LTIME.S.Afff8"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TimeFormatLocalization::Id,
                                 TimeFormatLocalization::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LOWPOWER_1_1Suite : public TestCommand
{
public:
    Test_TC_LOWPOWER_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_LOWPOWER_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LOWPOWER_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 0));
                    VerifyOrReturn(CheckValue("attributeList[0]", iter_0.GetValue(), 65528UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 1));
                    VerifyOrReturn(CheckValue("attributeList[1]", iter_0.GetValue(), 65529UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 2));
                    VerifyOrReturn(CheckValue("attributeList[2]", iter_0.GetValue(), 65531UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 3));
                    VerifyOrReturn(CheckValue("attributeList[3]", iter_0.GetValue(), 65532UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 4));
                    VerifyOrReturn(CheckValue("attributeList[4]", iter_0.GetValue(), 65533UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("attributeList", iter_0, 5));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("acceptedCommandList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 1));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_1_2Suite : public TestCommand
{
public:
    Test_TC_KEYPADINPUT_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_KEYPADINPUT_1_2", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_KEYPADINPUT_1_2Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !KEYPADINPUT.S.NV && KEYPADINPUT.S.LK && !KEYPADINPUT.S.NK "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given (KEYPADINPUT.S.NV) FeatureMap bit mask is set or not");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.NV"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given (KEYPADINPUT.S.LK) FeatureMap bit mask is set or not");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.LK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given (KEYPADINPUT.S.NK) FeatureMap bit mask is set or not");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_1_3Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_1_3", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_1_3Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 1UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.AP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !APPLAUNCHER.S.AP "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(CatalogList) in AttributeList");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(CurrentApp) in AttributeList");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_1_4Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_1_4", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_1_4Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !MEDIAINPUT.S.NU "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given MEDIAINPUT.S.NU ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.NU"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(InputList) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(CurrentInput) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WAKEONLAN_1_5Suite : public TestCommand
{
public:
    Test_TC_WAKEONLAN_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_WAKEONLAN_1_5", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WAKEONLAN_1_5Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(MACAddress) in AttributeList");
            VerifyOrDo(!ShouldSkip("WAKEONLAN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_1_6Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_1_6", 14, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_1_6Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("( !CHANNEL.S.CL && !CHANNEL.S.LI )"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given CHANNEL.S.CL ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.CL"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given CHANNEL.S.LI ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.LI"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(ChannelList): AttributeList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reading optional attribute(Lineup) in AttributeList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute(CurrentChannel): AttributeList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional command(ChangeChannel) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional command(ChangeChannelByNumber) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional command(SkipChannel) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the global attribute: GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("( !CHANNEL.S.CL && !CHANNEL.S.LI )"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the global attribute: GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.CL || CHANNEL.S.LI"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_1_7Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_1_7Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_1_7", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_1_7Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !MEDIAPLAYBACK.S.AS && !MEDIAPLAYBACK.S.VS "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given MEDIAPLAYBACK.S.AS ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.AS"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given MEDIAPLAYBACK.S.VS ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.VS"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(StartTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute(Duration) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute(SampledPosition) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute(PlaybackSpeed) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute(SeekRangeEnd) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional attribute(SeekRangeStart) in AttributeList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the optional command(StartOver) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the optional command(Previous) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the optional command(Next) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read the optional command(Rewind) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read the optional command(FastForward) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the optional command(SkipForward) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read the optional command(SkipBackward) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read the optional command(Seek) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C0b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_1_8Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_1_8Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_1_8", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_1_8Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_1_9Suite : public TestCommand
{
public:
    Test_TC_TGTNAV_1_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TGTNAV_1_9", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TGTNAV_1_9Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(CurrentTarget) in AttributeList");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_8_2Suite : public TestCommand
{
public:
    Test_TC_TGTNAV_8_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TGTNAV_8_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TGTNAV_8_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APBSC_1_10Suite : public TestCommand
{
public:
    Test_TC_APBSC_1_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_APBSC_1_10", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APBSC_1_10Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(VendorName) in AttributeList");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(VendorID) in AttributeList");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(ProductID) in AttributeList");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_1_11Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_1_11Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_1_11", 11, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_1_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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            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;
        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, "read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("( !CONTENTLAUNCHER.S.CS && !CONTENTLAUNCHER.S.UP )"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given CONTENTLAUNCHER.S.CS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.CS"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given CONTENTLAUNCHER.S.UP ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.UP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(AcceptHeader): AttributeList");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute(SupportedStreamingProtocols): AttributeList");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional command(LaunchContent) in AcceptedCommandList attribute");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional command(LaunchURL) in AcceptedCommandList attribute");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.C.C01.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ALOGIN_1_12Suite : public TestCommand
{
public:
    Test_TC_ALOGIN_1_12Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_ALOGIN_1_12", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ALOGIN_1_12Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id,
                                 AccountLogin::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id,
                                 AccountLogin::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LOWPOWER_2_1Suite : public TestCommand
{
public:
    Test_TC_LOWPOWER_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_LOWPOWER_2_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LOWPOWER_2_1Suite() {}

    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
    {
        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;
        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;
        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, "TH sends Sleep command to DUT");
            VerifyOrDo(!ShouldSkip("LOWPOWER.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LowPower::Commands::Sleep::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Commands::Sleep::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_2Suite : public TestCommand
{
public:
    Test_TC_KEYPADINPUT_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_KEYPADINPUT_3_2", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_KEYPADINPUT_3_2Suite() {}

    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
    {
        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));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            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;
        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, "TH sends CEC Settings Keys(0x0A) to DUT");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.LK && KEYPADINPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(10);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "TH sends CEC Home Keys(0x09) to DUT");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.LK && KEYPADINPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(9);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_3Suite : public TestCommand
{
public:
    Test_TC_KEYPADINPUT_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_KEYPADINPUT_3_3", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_KEYPADINPUT_3_3Suite() {}

    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
    {
        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));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            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;
        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, "Send Numbers1");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(33);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Numbers2");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(34);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send Numbers3");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(35);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Send Numbers4");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(36);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Send Numbers5");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(37);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Send Numbers6");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(38);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Send Numbers7");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(39);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Send Numbers8");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(40);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Send Numbers9");
            VerifyOrDo(!ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(41);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_5Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_5", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_5Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        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,
                    "TH reads CatalogList attribute from the DUT and where each entry in the list is a CSA-issued Vendor Id of "
                    "type unsigned 16 bit integer ranging between 0-65536 for the catalog");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::CatalogList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_6Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_6Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_6", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_6Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<
                    chip::app::Clusters::ApplicationLauncher::Structs::ApplicationEPStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        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,
                    "TH reads CurrentApp attribute from the DUT and Verify the in-focus application attributes, which should "
                    "include the display Application ID(type:uint16) Catalog Vendor ID(type:string) or Null if there is no current "
                    "in-focus application");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::CurrentApp::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_7Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_7Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_7", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("catalogVendorId", 0, UINT16_MAX, &mCatalogVendorId);
        AddArgument("applicationId", &mApplicationId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_7Suite() {}

    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> mCatalogVendorId;
    chip::Optional<chip::CharSpan> mApplicationId;
    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
    {
        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));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            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;
        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, "Launch an app with the provided a application ID");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::LaunchApp::Type value;
            value.application.Emplace();

            value.application.Value().catalogVendorID = mCatalogVendorId.HasValue() ? mCatalogVendorId.Value() : 123U;
            value.application.Value().applicationID =
                mApplicationId.HasValue() ? mApplicationId.Value() : chip::Span<const char>("exampleid", 9);

            value.data.Emplace();
            value.data.Value() = chip::ByteSpan(chip::Uint8::from_const_char("Hello Worldgarbage: not in length on purpose"), 11);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                               ApplicationLauncher::Commands::LaunchApp::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "TH sends a LaunchApp command to DUT to launch an app which is not available");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::LaunchApp::Type value;
            value.application.Emplace();

            value.application.Value().catalogVendorID = mCatalogVendorId.HasValue() ? mCatalogVendorId.Value() : 123U;
            value.application.Value().applicationID =
                chip::Span<const char>("NonAvailableAppgarbage: not in length on purpose", 15);

            value.data.Emplace();
            value.data.Value() = chip::ByteSpan(chip::Uint8::from_const_char("Hello Worldgarbage: not in length on purpose"), 11);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                               ApplicationLauncher::Commands::LaunchApp::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_8Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_8Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_8", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("catalogVendorId", 0, UINT16_MAX, &mCatalogVendorId);
        AddArgument("applicationId", &mApplicationId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_8Suite() {}

    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> mCatalogVendorId;
    chip::Optional<chip::CharSpan> mApplicationId;
    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
    {
        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));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Stop an app with the provided application ID");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::StopApp::Type value;
            value.application.Emplace();

            value.application.Value().catalogVendorID = mCatalogVendorId.HasValue() ? mCatalogVendorId.Value() : 123U;
            value.application.Value().applicationID =
                mApplicationId.HasValue() ? mApplicationId.Value() : chip::Span<const char>("exampleid", 9);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id, ApplicationLauncher::Commands::StopApp::Id,
                               value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the Status attribute");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_9Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_9Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_9", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("catalogVendorId", 0, UINT16_MAX, &mCatalogVendorId);
        AddArgument("applicationId", &mApplicationId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_9Suite() {}

    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> mCatalogVendorId;
    chip::Optional<chip::CharSpan> mApplicationId;
    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
    {
        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));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "TH sends HideApp command to DUT");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::HideApp::Type value;
            value.application.Emplace();

            value.application.Value().catalogVendorID = mCatalogVendorId.HasValue() ? mCatalogVendorId.Value() : 123U;
            value.application.Value().applicationID =
                mApplicationId.HasValue() ? mApplicationId.Value() : chip::Span<const char>("exampleid", 9);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id, ApplicationLauncher::Commands::HideApp::Id,
                               value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the Status attribute");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_10Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_10Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_10", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_10Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        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,
                    "TH reads the InputList attribute from the DUT to show list of Inputs available and Verify list of available "
                    "inputs supported by the device is provided, where each entry in the list contains an index(type:uint 8), "
                    "InputType (InputType Enums), Name (type: Strings), and Description(Type:String)");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_11Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_11Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_11", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentInput", value, 1U));
            }
            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;
        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,
                    "TH reads the InputList attribute from the DUT to show list of Inputs available and Verify list of available "
                    "inputs supported by the device is provided, where each entry in the list contains an index(type:uint 8), "
                    "InputType (InputType Enums), Name (type: Strings), and Description(Type:String)");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Select Input Command");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::SelectInput::Type value;
            value.index = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::SelectInput::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Read current input list");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0001 && MEDIAINPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::CurrentInput::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_12Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_12Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_12", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_12Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        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;
        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,
                    "TH reads the InputList attribute from the DUT to show list of Inputs available and Verify list of available "
                    "inputs supported by the device is provided, where each entry in the list contains an index(type:uint 8), "
                    "InputType (InputType Enums), Name (type: Strings), and Description(Type:String)");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Show Input Status Command");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::ShowInputStatus::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::ShowInputStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Hide Input Status Command");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::HideInputStatus::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::HideInputStatus::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_13Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_13Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_13", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_13Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "TH reads the InputList attribute from the DUT to show list of Inputs available");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Rename Input Command");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::RenameInput::Type value;
            value.index = 1U;
            value.name  = chip::Span<const char>("A1garbage: not in length on purpose", 2);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::RenameInput::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH reads the InputList attribute from the DUT to show list of Inputs available");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAINPUT.S.A0000 && MEDIAINPUT.S.C03.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_1Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        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,
                    "TH reads the ChannelList attribute from the DUT to show list of Inputs available and Verify that the response "
                    "contains a list of the known TV channels. Each list element should consist of the following,Major number "
                    "(unsigned 16-bit integer, mandatory),Minor number (unsigned 16-bit integer, mandatory),Name (String, "
                    "optional),Call sign (String, optional),Affiliate call sign (String, optional)");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ChannelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_2Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_2", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("majornumber", 0, UINT16_MAX, &mMajornumber);
        AddArgument("minornumber", 0, UINT16_MAX, &mMinornumber);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_2Suite() {}

    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> mMajornumber;
    chip::Optional<uint16_t> mMinornumber;
    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentChannel", value));
                VerifyOrReturn(CheckValue("currentChannel.Value().majorNumber", value.Value().majorNumber,
                                          mMajornumber.HasValue() ? mMajornumber.Value() : 9U));
                VerifyOrReturn(CheckValue("currentChannel.Value().minorNumber", value.Value().minorNumber,
                                          mMinornumber.HasValue() ? mMinornumber.Value() : 1U));
            }
            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;
        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, "Reads the ChannelList attribute");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ChannelList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends a ChangeChannelByNumber command");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::ChangeChannelByNumber::Type value;
            value.majorNumber = mMajornumber.HasValue() ? mMajornumber.Value() : 9U;
            value.minorNumber = mMinornumber.HasValue() ? mMinornumber.Value() : 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::ChangeChannelByNumber::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Verify that the channel has changed on the device");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CHANNEL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if channel has changed on the devicegarbage: not in length on purpose", 53);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Reads the CurrentChannel attribute");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0002 && CHANNEL.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::CurrentChannel::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_3Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_3", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("majornumber", 0, UINT16_MAX, &mMajornumber);
        AddArgument("minornumber", 0, UINT16_MAX, &mMinornumber);
        AddArgument("majornumber2", 0, UINT16_MAX, &mMajornumber2);
        AddArgument("minornumber2", 0, UINT16_MAX, &mMinornumber2);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_3Suite() {}

    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> mMajornumber;
    chip::Optional<uint16_t> mMinornumber;
    chip::Optional<uint16_t> mMajornumber2;
    chip::Optional<uint16_t> mMinornumber2;
    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
    {
        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));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::LineupInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentChannel", value));
                VerifyOrReturn(CheckValue("currentChannel.Value().majorNumber", value.Value().majorNumber,
                                          mMajornumber.HasValue() ? mMajornumber.Value() : 6U));
                VerifyOrReturn(CheckValue("currentChannel.Value().minorNumber", value.Value().minorNumber,
                                          mMinornumber.HasValue() ? mMinornumber.Value() : 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentChannel", value));
                VerifyOrReturn(CheckValue("currentChannel.Value().majorNumber", value.Value().majorNumber,
                                          mMajornumber2.HasValue() ? mMajornumber2.Value() : 9U));
                VerifyOrReturn(CheckValue("currentChannel.Value().minorNumber", value.Value().minorNumber,
                                          mMinornumber2.HasValue() ? mMinornumber2.Value() : 1U));
                VerifyOrReturn(CheckConstraintType("value", "ChannelInfoStruct", "ChannelInfoStruct"));
            }
            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;
        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,
                    "TH reads the Lineup attribute from the DUT to show list of Inputs available and Verify that the response "
                    "contains a lineup info object");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::Lineup::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the ChannelList attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ChannelList::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the CurrentChannel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::CurrentChannel::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Sends a SkipChannel command to the DUT");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::SkipChannel::Type value;
            value.count = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::SkipChannel::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Verify that the channel has changed on the device");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && CHANNEL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if channel has changed on the devicegarbage: not in length on purpose", 53);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Reads the CurrentChannel attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CHANNEL.S.A0002 && CHANNEL.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::CurrentChannel::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_1Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_1Suite() {}

    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
    {
        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));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 1U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 2U));
            }
            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;
        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, "Precondition: Media content in a paused state at the beginning of the content");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Sends a Play command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Play::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Play::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the media state is playing");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C00.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "sends a Pause command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Verify that the media is paused");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is pausedgarbage: not in length on purpose", 41);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp && MEDIAPLAYBACK.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Sends a Stop command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Stop::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Stop::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Verify that the media is stoped");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is stopedgarbage: not in length on purpose", 41);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C02.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_2Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_2", 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_MEDIAPLAYBACK_6_2Suite() {}

    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
    {
        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));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 10000ULL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 0ULL));
            }
            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;
        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, "Precondition: Media content in a paused state at the beginning of the content");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the CurrentState attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Sends a Play command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Play::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Play::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the media state is playing");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C00.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Sends a StartOver command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::StartOver::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::StartOver::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Verify that the media is started over");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media is started overgarbage: not in length on purpose", 41);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Sends a Next command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Next::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Next::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Verify that the next media item in the queue has been loaded");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media item in the queue has been loadedgarbage: not in length on purpose", 59);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Sends a Previous command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Previous::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Previous::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Verify that the previous media item in the queue has been loaded");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C04.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if previous media item in the queue has been loadedgarbage: not in length on purpose", 68);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "Sends a SkipForward command to the DUT ");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::SkipForward::Type value;
            value.deltaPositionMilliseconds = 10000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::SkipForward::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Verify that the media has skipped forward 10 seconds");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media has skipped forward 10 secondsgarbage: not in length on purpose", 56);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Reads the SampledPosition attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C08.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Sends a SkipBackward command to the DUT ");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::SkipBackward::Type value;
            value.deltaPositionMilliseconds = 10000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::SkipBackward::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Verify that the media has skipped backward 10 seconds");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C09.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media has skipped backward 10 secondsgarbage: not in length on purpose", 57);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Reads the SampledPosition attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C09.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_3Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_3", 11, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("SeekPosition", 0, UINT64_MAX, &mSeekPosition);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_3Suite() {}

    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<uint64_t> mSeekPosition;
    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
    {
        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));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 10000ULL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 5U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Precondition: Media content in a paused state at the beginning of the content");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Sends a Seek command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C0b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Seek::Type value;
            value.position = 10000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Seek::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Verify that the media has moved to 10 seconds from the starting point");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C0b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media has moved to 10 seconds from the starting pointgarbage: not in length on purpose", 73);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Reads the SampledPosition attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C0b.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads the StartTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0001 && PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH reads the SeekRangeEnd attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads the SeekRangeStart attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "TH reads the Duration attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Sends a Seek command Position value beyond the furthest valid position");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C0b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Seek::Type value;
            value.position = mSeekPosition.HasValue() ? mSeekPosition.Value() : 100000000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Seek::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "verify that the media has not moved.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C0b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' if media has not movedgarbage: not in length on purpose", 39);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_4Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_4", 23, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_4Suite() {}

    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
    {
        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));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 0.0f));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 1.0f));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 2.0f));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 1.0f));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Precondition: Media content in a paused state at the beginning of the content");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads the CurrentState attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Sends a FastForward command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::FastForward::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::FastForward::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "verify that the media state is playing");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C07.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Sends a FastForward command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::FastForward::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::FastForward::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "verify that the media play speed has increased.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if media play speed has increased.garbage: not in length on purpose", 51);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Sends a Rewind command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Rewind::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Rewind::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "verify that the media play has reversed direction.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media play has reversed directiongarbage: not in length on purpose", 53);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Reads the CurrentState attribute");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C06.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if PlaybackSpeed value is -1garbage: not in length on purpose", 45);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Sends a Rewind command to the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Rewind::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Rewind::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "verify that the media play speed has increased in the reverse direction.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media play speed has increased in the reverse directiongarbage: not in length on purpose", 75);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please enter 'y' if PlaybackSpeed value is -2garbage: not in length on purpose", 45);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "Sends a Play command");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Play::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Commands::Play::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "verify that the media is has resumed playing forward at the default speed.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>(
                "Please enter 'y' if media is has resumed playing forward at the default speedgarbage: not in length on purpose",
                77);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Reads the PlaybackSpeed attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C00.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Sends consecutive FastForward commands");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "Sends consecutive Rewind commands");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_1Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_7_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("Index", 0, UINT8_MAX, &mIndex);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_7_1Suite() {}

    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<uint8_t> mIndex;
    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentOutput", value, mIndex.HasValue() ? mIndex.Value() : 1U));
            }
            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;
        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, "Reads the OutputList attribute");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::OutputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Sends a SelectAudioOutput command");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AudioOutput::Commands::SelectOutput::Type value;
            value.index = mIndex.HasValue() ? mIndex.Value() : 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Commands::SelectOutput::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Reads the CurrentOutput attribute");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.A0001 && AUDIOOUTPUT.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::CurrentOutput::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_2Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_7_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_7_2", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("Index", 0, UINT8_MAX, &mIndex);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_7_2Suite() {}

    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<uint8_t> mIndex;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::DecodableType>
        audioOutputListValues;

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                audioOutputListValues = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Reads the OutputList attribute from the DUT");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::OutputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Sends a RenameOutput command");
            VerifyOrDo(!ShouldSkip("AUDIOOUTPUT.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AudioOutput::Commands::RenameOutput::Type value;
            value.index = mIndex.HasValue() ? mIndex.Value() : 1U;
            value.name  = chip::Span<const char>("CertTestgarbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Commands::RenameOutput::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "Reads the OutputList attribute from the DUT Verify that the output at the index provided in step 2 has the "
                    "name CertTest");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && AUDIOOUTPUT.S.A0001 && AUDIOOUTPUT.S.C01.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_8_1Suite : public TestCommand
{
public:
    Test_TC_TGTNAV_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TGTNAV_8_1", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("targetvalue", 0, UINT8_MAX, &mTargetvalue);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TGTNAV_8_1Suite() {}

    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<uint8_t> mTargetvalue;
    chip::Optional<uint16_t> mTimeout;

    chip::app::DataModel::DecodableList<chip::app::Clusters::TargetNavigator::Structs::TargetInfoStruct::DecodableType>
        TargetListValues;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::TargetNavigator::Structs::TargetInfoStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                TargetListValues = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentTarget", value, mTargetvalue.HasValue() ? mTargetvalue.Value() : 1U));
            }
            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;
        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, "Reads the CurrentTarget attribute");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::CurrentTarget::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the TargetList attribute");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Attributes::TargetList::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Sends a NavigateTarget command");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::TargetNavigator::Commands::NavigateTarget::Type value;
            value.target = mTargetvalue.HasValue() ? mTargetvalue.Value() : 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Commands::NavigateTarget::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Reads the CurrentTarget attribute");
            VerifyOrDo(!ShouldSkip("TGTNAV.S.A0001 && TGTNAV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::CurrentTarget::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APBSC_9_1Suite : public TestCommand
{
public:
    Test_TC_APBSC_9_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_APBSC_9_1", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APBSC_9_1Suite() {}

    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
    {
        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));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "vendor_id", "vendor_id"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 256));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationBasic::Structs::ApplicationStruct::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "ApplicationStruct", "ApplicationStruct"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::VendorId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Reads the VendorName attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::VendorName::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the VendorID attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads the ApplicationName attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ApplicationName::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the ProductID attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::ProductID::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads the Application attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::Application::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the Status attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::Status::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads the ApplicationVersion attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ApplicationVersion::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reads the AllowedVendorList attribute");
            VerifyOrDo(!ShouldSkip("APBSC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AllowedVendorList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_1Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_1", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            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;
        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, "TH reads the AcceptHeader attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::AcceptHeader::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the SupportedStreamingProtocols attribute from the DUT");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::SupportedStreamingProtocols::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WAKEONLAN_4_1Suite : public TestCommand
{
public:
    Test_TC_WAKEONLAN_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_WAKEONLAN_4_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WAKEONLAN_4_1Suite() {}

    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
    {
        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));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 12));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "TH reads the MACAddress attribute from the DUT");
            VerifyOrDo(!ShouldSkip("WAKEONLAN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::MACAddress::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends a Sleep command to DUT");
            VerifyOrDo(!ShouldSkip("LOWPOWER.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LowPower::Commands::Sleep::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Commands::Sleep::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends a Wake-On LAN magic packet containing the MAC address from step 1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ALOGIN_12_1Suite : public TestCommand
{
public:
    Test_TC_ALOGIN_12_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_ALOGIN_12_1", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("TempAccountIdentifier", &mTempAccountIdentifier);
        AddArgument("catalogVendorId", 0, UINT16_MAX, &mCatalogVendorId);
        AddArgument("applicationId", &mApplicationId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ALOGIN_12_1Suite()
    {
        if (setupPINBuffer != nullptr)
        {
            chip::Platform::MemoryFree(setupPINBuffer);
            setupPINBuffer = nullptr;
        }
    }

    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<chip::CharSpan> mTempAccountIdentifier;
    chip::Optional<uint16_t> mCatalogVendorId;
    chip::Optional<chip::CharSpan> mApplicationId;
    chip::Optional<uint16_t> mTimeout;

    char * setupPINBuffer = nullptr;
    chip::CharSpan setupPIN;

    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
    {
        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));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AccountLogin::Commands::GetSetupPINResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (setupPINBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(setupPINBuffer);
                }
                setupPINBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.setupPIN.size()));
                memcpy(setupPINBuffer, value.setupPIN.data(), value.setupPIN.size());
                setupPIN = chip::CharSpan(setupPINBuffer, value.setupPIN.size());
            }
            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;
        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;
        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, "Launch an app with the provided a application ID");
            VerifyOrDo(!ShouldSkip("APPLAUNCHER.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::LaunchApp::Type value;
            value.application.Emplace();

            value.application.Value().catalogVendorID = mCatalogVendorId.HasValue() ? mCatalogVendorId.Value() : 123U;
            value.application.Value().applicationID =
                mApplicationId.HasValue() ? mApplicationId.Value() : chip::Span<const char>("exampleid", 9);

            value.data.Emplace();
            value.data.Value() = chip::ByteSpan(chip::Uint8::from_const_char("Hello Worldgarbage: not in length on purpose"), 11);
            return SendCommand(kIdentityAlpha, GetEndpoint(3), ApplicationLauncher::Id,
                               ApplicationLauncher::Commands::LaunchApp::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "TH sends a GetSetupPIN command to the DUT with test values provided by the product maker.");
            VerifyOrDo(!ShouldSkip("ALOGIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AccountLogin::Commands::GetSetupPIN::Type value;
            value.tempAccountIdentifier =
                mTempAccountIdentifier.HasValue() ? mTempAccountIdentifier.Value() : chip::Span<const char>("1111", 4);
            return SendCommand(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Commands::GetSetupPIN::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH sends a Login command to the DUT with test values provided by the product maker.");
            VerifyOrDo(!ShouldSkip("ALOGIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AccountLogin::Commands::Login::Type value;
            value.tempAccountIdentifier =
                mTempAccountIdentifier.HasValue() ? mTempAccountIdentifier.Value() : chip::Span<const char>("1111", 4);
            value.setupPIN = setupPIN;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Commands::Login::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "TH sends a Logout command to the DUT with test values provided by the product maker.");
            VerifyOrDo(!ShouldSkip("ALOGIN.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AccountLogin::Commands::Logout::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Commands::Logout::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_1_1Suite : public TestCommand
{
public:
    Test_TC_MOD_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_1_1", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 1UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap attribute from the DUT");
            VerifyOrDo(!ShouldSkip("MOD.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads the FeatureMap attribute from the DUT");
            VerifyOrDo(!ShouldSkip(" !MOD.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads the AttributeList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads the optional attribute(StartUpMode) in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("MOD.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads the optional attribute(OnMode) in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("MOD.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class OTA_SuccessfulTransferSuite : public TestCommand
{
public:
    OTA_SuccessfulTransferSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("OTA_SuccessfulTransfer", 11, credsIssuerConfig)
    {
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("requestorNodeId", 0, UINT64_MAX, &mRequestorNodeId);
        AddArgument("providerNodeId", 0, UINT64_MAX, &mProviderNodeId);
        AddArgument("providerPayload", &mProviderPayload);
        AddArgument("providerDiscriminator", 0, UINT16_MAX, &mProviderDiscriminator);
        AddArgument("providerPort", 0, UINT16_MAX, &mProviderPort);
        AddArgument("providerKvs", &mProviderKvs);
        AddArgument("otaImageFilePath", &mOtaImageFilePath);
        AddArgument("rawImageFilePath", &mRawImageFilePath);
        AddArgument("rawImageContent", &mRawImageContent);
        AddArgument("downloadImageFilePath", &mDownloadImageFilePath);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~OTA_SuccessfulTransferSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::NodeId> mRequestorNodeId;
    chip::Optional<chip::NodeId> mProviderNodeId;
    chip::Optional<chip::CharSpan> mProviderPayload;
    chip::Optional<uint16_t> mProviderDiscriminator;
    chip::Optional<uint16_t> mProviderPort;
    chip::Optional<chip::CharSpan> mProviderKvs;
    chip::Optional<chip::CharSpan> mOtaImageFilePath;
    chip::Optional<chip::CharSpan> mRawImageFilePath;
    chip::Optional<chip::CharSpan> mRawImageContent;
    chip::Optional<chip::CharSpan> mDownloadImageFilePath;
    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Create OTA image");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::CreateOtaImage::Type value;
            value.otaImageFilePath =
                mOtaImageFilePath.HasValue() ? mOtaImageFilePath.Value() : chip::Span<const char>("/tmp/otaImage", 13);
            value.rawImageFilePath =
                mRawImageFilePath.HasValue() ? mRawImageFilePath.Value() : chip::Span<const char>("/tmp/rawImage", 13);
            value.rawImageContent =
                mRawImageContent.HasValue() ? mRawImageContent.Value() : chip::Span<const char>("Have a hootenanny!", 18);
            return CreateOtaImage(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Start the provider with an image");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-ota-provider-appgarbage: not in length on purpose", 21);
            value.discriminator.Emplace();
            value.discriminator.Value() = mProviderDiscriminator.HasValue() ? mProviderDiscriminator.Value() : 50U;
            value.port.Emplace();
            value.port.Value() = mProviderPort.HasValue() ? mProviderPort.Value() : 5560U;
            value.kvs.Emplace();
            value.kvs.Value() =
                mProviderKvs.HasValue() ? mProviderKvs.Value() : chip::Span<const char>("/tmp/chip_kvs_provider", 22);
            value.filepath.Emplace();
            value.filepath.Value() =
                mOtaImageFilePath.HasValue() ? mOtaImageFilePath.Value() : chip::Span<const char>("/tmp/otaImage", 13);
            return Start(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Commission the provider from alpha");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
            value.payload =
                mProviderPayload.HasValue() ? mProviderPayload.Value() : chip::Span<const char>("MT:-24J0IX4122-.548G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Wait for the commissioned provider to be retrieved for alpha");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Install ACL for QueryImage");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNonNull();
                    listHolder_3->mList[0].cluster.Value() = 41UL;
                    listHolder_3->mList[0].endpoint.SetNull();
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Stop the requestor");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Start the requestor with an OTA download path");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.otaDownloadPath.Emplace();
            value.otaDownloadPath.Value() = mDownloadImageFilePath.HasValue() ? mDownloadImageFilePath.Value()
                                                                              : chip::Span<const char>("/tmp/downloadedImage", 20);
            return Start(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Wait for the commissioned requestor to be retrieved for alpha");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mRequestorNodeId.HasValue() ? mRequestorNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Send an announce OTA provider command to the requestor");
            ListFreer listFreer;
            chip::app::Clusters::OtaSoftwareUpdateRequestor::Commands::AnnounceOTAProvider::Type value;
            value.providerNodeID     = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
            value.vendorID           = static_cast<chip::VendorId>(0);
            value.announcementReason = static_cast<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason>(0);
            value.endpoint           = mEndpoint.HasValue() ? mEndpoint.Value() : 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OtaSoftwareUpdateRequestor::Id,
                               OtaSoftwareUpdateRequestor::Commands::AnnounceOTAProvider::Id, value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Wait for transfer complete message");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMessage::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            value.message             = chip::Span<const char>("OTA image downloadedgarbage: not in length on purpose", 20);
            return WaitForMessage(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Compare original file to downloaded file");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::CompareFiles::Type value;
            value.file1 = mRawImageFilePath.HasValue() ? mRawImageFilePath.Value() : chip::Span<const char>("/tmp/rawImage", 13);
            value.file2 = mDownloadImageFilePath.HasValue() ? mDownloadImageFilePath.Value()
                                                            : chip::Span<const char>("/tmp/downloadedImage", 20);
            return CompareFiles(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_1_1Suite : public TestCommand
{
public:
    Test_TC_OCC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_2_1Suite : public TestCommand
{
public:
    Test_TC_OCC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_2_1", 13, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_2_1Suite() {}

    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
    {
        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));
            {
                chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancyBitmap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OccupancySensing::OccupancySensorTypeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancySensorTypeBitmap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            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;
        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, "Reads mandatory attribute constrains: Occupancy");
            VerifyOrDo(!ShouldSkip("OCC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads mandatory attribute constrains: OccupancySensorType");
            VerifyOrDo(!ShouldSkip("OCC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::OccupancySensorType::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads mandatory attribute constrains: OccupancySensorTypeBitmap");
            VerifyOrDo(!ShouldSkip("OCC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::OccupancySensorTypeBitmap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads optional attribute: PIROccupiedToUnoccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PIROccupiedToUnoccupiedDelay::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads optional attribute constrains: PIRUnoccupiedToOccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PIRUnoccupiedToOccupiedDelay::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads optional attribute constrains: PIRUnoccupiedToOccupiedThreshold");
            VerifyOrDo(!ShouldSkip("OCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PIRUnoccupiedToOccupiedThreshold::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read optional attribute: UltrasonicOccupiedToUnoccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::UltrasonicOccupiedToUnoccupiedDelay::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute: UltrasonicUnoccupiedToOccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::UltrasonicUnoccupiedToOccupiedDelay::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read attribute: UltrasonicUnoccupiedToOccupiedThreshold");
            VerifyOrDo(!ShouldSkip("OCC.S.A0022"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::UltrasonicUnoccupiedToOccupiedThreshold::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads optional attribute constrains: PhysicalContactOccupiedToUnoccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PhysicalContactOccupiedToUnoccupiedDelay::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedDelay");
            VerifyOrDo(!ShouldSkip("OCC.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PhysicalContactUnoccupiedToOccupiedDelay::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedThreshold");
            VerifyOrDo(!ShouldSkip("OCC.S.A0032"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::PhysicalContactUnoccupiedToOccupiedThreshold::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_2_3Suite : public TestCommand
{
public:
    Test_TC_OCC_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_2_3", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_2_3Suite() {}

    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
    {
        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));
            {
                chip::app::Clusters::OccupancySensing::OccupancySensorTypeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancySensorTypeBitmap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            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;
        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, "Reads mandatory attribute constrains: OccupancySensorType");
            VerifyOrDo(!ShouldSkip("OCC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::OccupancySensorType::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads mandatory attribute constrains: OccupancySensorTypeBitmap");
            VerifyOrDo(!ShouldSkip("OCC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id,
                                 OccupancySensing::Attributes::OccupancySensorTypeBitmap::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_1_1Suite : public TestCommand
{
public:
    Test_TC_OO_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_1_1", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16384UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16385UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16386UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16387UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 64UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 66UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !OO.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given OO.S.F00(LT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("OO.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the feature dependent(OO.S.F00) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("OO.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the feature dependent(OO.S.F00) commands in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("OO.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_1Suite : public TestCommand
{
public:
    Test_TC_OO_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_2_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_2_1Suite() {}

    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
    {
        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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
            }
            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;
        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, "Read the mandatory attribute: OnOff");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read LT attribute: GlobalSceneControl");
            VerifyOrDo(!ShouldSkip("OO.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read LT attribute: OnTime");
            VerifyOrDo(!ShouldSkip("OO.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read LT attribute: OffWaitTime");
            VerifyOrDo(!ShouldSkip("OO.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read LT attribute: StartUpOnOff");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_2Suite : public TestCommand
{
public:
    Test_TC_OO_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_2_2", 23, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_2_2Suite() {}

    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
    {
        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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 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));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Send Toggle Command");
            VerifyOrDo(!ShouldSkip("OO.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Toggle::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Toggle::Id, value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Check on/off attribute value is true after toggle command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Send Toggle Command");
            VerifyOrDo(!ShouldSkip("OO.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Toggle::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Toggle::Id, value, chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "Check on/off attribute value is false after toggle command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Operate on device to set OnOff attribute manually to on");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && OO.M.ManuallyControlled && OO.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "Check on/off attribute value is true after on command");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && OO.S.A0000 && OO.M.ManuallyControlled"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Operate on device to set OnOff attribute manually to off");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && OO.M.ManuallyControlled && OO.S.A0000"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && OO.S.A0000 && OO.M.ManuallyControlled"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Reset Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_4Suite : public TestCommand
{
public:
    Test_TC_OO_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_2_4", 32, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_2_4Suite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 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));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "TH writes a value of 0 to StartUpOnOff attribute of DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::OnOff::OnOffStartUpOnOff>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "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 6: {
            LogStep(6, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH writes a value of 1 to StartUpOnOff attribute of DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::OnOff::OnOffStartUpOnOff>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "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 11: {
            LogStep(11, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH writes a value of 2 to StartUpOnOff attribute of DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::OnOff::OnOffStartUpOnOff>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "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 16: {
            LogStep(16, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "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 20: {
            LogStep(20, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH writes NULL to StartUpOnOff attribute of DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "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 25: {
            LogStep(25, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH sends Off command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Reboot target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 30: {
            LogStep(30, "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 31: {
            LogStep(31, "TH reads the OnOff attribute from the DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_1_1Suite : public TestCommand
{
public:
    Test_TC_PS_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PS_1_1", 14, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PS_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::ClusterRevision::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !PS.S.F00 && !PS.S.F01 && !PS.S.F02 && !PS.S.F03 "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given PS.S.F00(WIRED) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PS.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given PS.S.F01(BAT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PS.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given PS.S.F02(RECHG) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PS.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given PS.S.F03(REPLC) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PS.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the Feature dependent(PS.S.F00-WIRED) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("PS.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the Feature dependent(PS.S.F01-BAT) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("PS.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the Feature dependent(PS.S.F02-RECHG) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("PS.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the Feature dependent(PS.S.F03-REPLC) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("PS.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_2_1Suite : public TestCommand
{
public:
    Test_TC_PS_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PS_2_1", 32, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PS_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::Clusters::PowerSource::PowerSourceStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::WiredCurrentTypeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::WiredFaultEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 8));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::BatChargeLevelEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::BatReplaceabilityEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatFaultEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 8));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 60));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::BatCommonDesignationEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum16", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 80U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 20));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 20));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::BatApprovedChemistryEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum16", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PowerSource::BatChargeStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatChargeFaultEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Test Harness Client reads Status attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::Status::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Test Harness Client reads Order attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::Order::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Test Harness Client reads Description attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::Description::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Test Harness Client reads WiredAssessedInputVoltage attribue from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::WiredAssessedInputVoltage::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Test Harness Client reads WiredAssessedInputFrequency attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::WiredAssessedInputFrequency::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Test Harness Client reads WiredCurrentType attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredCurrentType::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Test Harness Client reads WiredAssessedCurrent attribute from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredAssessedCurrent::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Test Harness Client reads WiredNominalVoltage from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredNominalVoltage::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Test Harness Client reads WiredMaximumCurrent from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredMaximumCurrent::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Test Harness Client reads WiredPresent from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::WiredPresent::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Test Harness Client reads ActiveWiredFaults from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::ActiveWiredFaults::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Test Harness Client reads BatVoltage from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatVoltage::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Test Harness Client reads BatPercentRemaining from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatPercentRemaining::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Test Harness Client reads BatTimeRemaining from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatTimeRemaining::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Test Harness Client reads BatChargeLevel from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatChargeLevel::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Test Harness Client reads BatReplacementNeeded from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatReplacementNeeded::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Test Harness Client reads BatReplaceability from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatReplaceability::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Test Harness Client reads BatPresent from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatPresent::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Test Harness Client readsActiveBatFaults from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::ActiveBatFaults::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Test Harness Client reads BatReplacementDescription from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::BatReplacementDescription::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Test Harness Client reads BatCommonDesignation from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatCommonDesignation::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Test Harness Client reads BatANSIDesignation from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatANSIDesignation::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Test Harness Client reads BatIECDesignation from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatIECDesignation::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Test Harness Client reads BatApprovedChemistry from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatApprovedChemistry::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Test Harness Client reads BatCapacity from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatCapacity::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Test Harness Client reads BatQuantity from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatQuantity::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Test Harness Client reads BatChargeState from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatChargeState::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Test Harness Client reads BatTimeToFullCharge from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatTimeToFullCharge::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Test Harness Client reads BatFunctionalWhileCharging from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::BatFunctionalWhileCharging::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Test Harness Client reads BatChargingCurrent from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::BatChargingCurrent::Id,
                                 true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Test Harness Client reads ActiveBatChargeFaults from Server DUT");
            VerifyOrDo(!ShouldSkip("PS.S.A001e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id,
                                 PowerSource::Attributes::ActiveBatChargeFaults::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_1_1Suite : public TestCommand
{
public:
    Test_TC_PRS_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PRS_1_1", 13, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PRS_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip(" !PRS.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given PRS.S.F00(EXT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PRS.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global mandatory attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute(ScaledValue) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute(MinScaledValue) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute(MaxScaledValue) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute(Scale) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute(ScaledTolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("PRS.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_2_1Suite : public TestCommand
{
public:
    Test_TC_PRS_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PRS_2_1", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PRS_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -127));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127));
            }
            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;
        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, "Read the mandatory attribute constraints: MeasuredValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute constraints: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute constraints: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute: Tolerance");
            VerifyOrDo(!ShouldSkip("PRS.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::Tolerance::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute: ScaledValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::ScaledValue::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute: MinScaledValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MinScaledValue::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute: MaxScaledValue");
            VerifyOrDo(!ShouldSkip("PRS.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MaxScaledValue::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute: ScaledTolerance");
            VerifyOrDo(!ShouldSkip("PRS.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::ScaledTolerance::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute: Scale");
            VerifyOrDo(!ShouldSkip("PRS.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::Scale::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_2_2Suite : public TestCommand
{
public:
    Test_TC_PRS_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PRS_2_2", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PRS_2_2Suite() {}

    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::app::DataModel::Nullable<int16_t> ValueBeforeChange;

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ValueBeforeChange = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, ValueBeforeChange));
            }
            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;
        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, "TH reads from the DUT the MeasuredValue attribute");
            VerifyOrDo(!ShouldSkip("PRS.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Operate on device to change the pressure significantly");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && PRS.M.PressureChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Wait 2s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "After a few seconds, TH reads from the DUT the MeasuredValue attribute");
            VerifyOrDo(!ShouldSkip("PRS.S.A0000 && PRS.M.PressureChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PressureMeasurement::Id,
                                 PressureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_1_1Suite : public TestCommand
{
public:
    Test_TC_PCC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_1_1", 29, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 32UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 64UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 32UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 21UL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 22UL));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 23UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 33UL));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap attribute from the DUT");
            VerifyOrDo(
                !ShouldSkip(" !PCC.S.F00 && !PCC.S.F01 && !PCC.S.F02 && !PCC.S.F03 && !PCC.S.F04 && !PCC.S.F05 && !PCC.S.F06 "),
                return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given PCC.S.F00(PRSCONST) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PCC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given PCC.S.F01(PRSCOMP) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PCC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given PCC.S.F02(FLW) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PCC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given PCC.S.F03(SPD) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PCC.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given PCC.S.F04(TEMP) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PCC.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Given PCC.S.F05(AUTO) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PCC.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Given PCC.S.F06(LOCAL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("PCC.S.F06"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads the AttributeList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads optional attribute(MinConstPressure) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads optional attribute(MaxConstPressure) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads optional attribute(MinCompPressure) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads optional attribute(MaxCompPressure) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads optional attribute(MinConstSpeed) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads optional attribute(MaxConstSpeed) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads optional attribute(MinConstFlow) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads optional attribute(MaxConstFlow) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads optional attribute(MinConstTemp) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads optional attribute(MaxConstTemp) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads optional attribute(PumpStatus) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads optional attribute(Speed) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads optional attribute(LifetimeRunningHours) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads optional attribute(Power) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads optional attribute(LifetimeEnergyConsumed) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH reads optional attribute(ControlMode) attribute in AttributeList from the DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads the AcceptedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads the GeneratedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_1Suite : public TestCommand
{
public:
    Test_TC_PCC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_2_1", 24, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::PumpConfigurationAndControl::PumpStatusBitmap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap16", "bitmap16"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 8U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32768));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int24u", "int24u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 16777215UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int24u", "int24u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 16777215UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            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;
        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, "Read the mandatory attribute: MaxPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxPressure::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: MaxSpeed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxSpeed::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute: MaxFlow");
            VerifyOrDo(!ShouldSkip("PCC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxFlow::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute: MinConstPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinConstPressure::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the optional attribute: MaxConstPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxConstPressure::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional attribute: MinCompPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinCompPressure::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute: MaxCompPressure");
            VerifyOrDo(!ShouldSkip("PCC.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxCompPressure::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the optional attribute: MinConstSpeed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinConstSpeed::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute: MaxConstSpeed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxConstSpeed::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the optional attribute: MinConstFlow");
            VerifyOrDo(!ShouldSkip("PCC.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinConstFlow::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional attribute: MaxConstFlow");
            VerifyOrDo(!ShouldSkip("PCC.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxConstFlow::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the optional attribute: MinConstTemp");
            VerifyOrDo(!ShouldSkip("PCC.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MinConstTemp::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the optional attribute: MaxConstTemp");
            VerifyOrDo(!ShouldSkip("PCC.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::MaxConstTemp::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the optional attribute: PumpStatus");
            VerifyOrDo(!ShouldSkip("PCC.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::PumpStatus::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute: EffectiveOperationMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read attribute: Capacity");
            VerifyOrDo(!ShouldSkip("PCC.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::Capacity::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the optional attribute: Speed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::Speed::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read the optional attribute: LifetimeRunningHours");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read the optional attribute: Power");
            VerifyOrDo(!ShouldSkip("PCC.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::Power::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read the optional attribute: LifetimeEnergyConsumed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read optional attribute: OperationMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::OperationMode::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read optional attribute: ControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::ControlMode::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_2Suite : public TestCommand
{
public:
    Test_TC_PCC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_2_2", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_2_2Suite() {}

    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
    {
        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::PumpConfigurationAndControl::OperationModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 1U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 2U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 3U));
            }
            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;
        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, "TH write 0 (Normal) to the OperationMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads from the DUT the EffectiveOperationMode attribute");
            VerifyOrDo(!ShouldSkip("PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH write 1 (Minimum) to the OperationMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.F03 && PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads from the DUT the EffectiveOperationMode attribute");
            VerifyOrDo(!ShouldSkip("PCC.S.F03 && PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH write 2 (Maximum) to the OperationMode attribute to DUT one at a time.");
            VerifyOrDo(!ShouldSkip("PCC.S.F03 && PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads from the DUT the EffectiveOperationMode attribute");
            VerifyOrDo(!ShouldSkip("PCC.S.F03 && PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH write 3 (Local) to the OperationMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.F06 && PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads from the DUT the EffectiveOperationMode attribute");
            VerifyOrDo(!ShouldSkip("PCC.S.F06 && PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_3Suite : public TestCommand
{
public:
    Test_TC_PCC_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_2_3", 15, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_2_3Suite() {}

    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
    {
        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::PumpConfigurationAndControl::OperationModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveOperationMode", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 0U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 1U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 2U));
            }
            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::PumpConfigurationAndControl::ControlModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 3U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 5U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("effectiveControlMode", value, 7U));
            }
            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;
        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, "Write 0 to the OperationMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::OperationMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the attribute: EffectiveOperationMode");
            VerifyOrDo(!ShouldSkip("PCC.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write 0 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.F03 && PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.F03 && PCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write 1 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.F00 && PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.F00 && PCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write 2 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.F01 && PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.F01 && PCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write 3 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.F02 && PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.F02 && PCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write 5 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.F04 && PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum>(5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.F04 && PCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Write 7 to the ControlMode attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.F05 && PCC.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
            value = static_cast<chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum>(7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::ControlMode::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Reads the attribute: EffectiveControlMode");
            VerifyOrDo(!ShouldSkip("PCC.S.F05 && PCC.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_4Suite : public TestCommand
{
public:
    Test_TC_PCC_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_2_4", 13, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_2_4Suite() {}

    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
    {
        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::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeRunningHours", value));
                VerifyOrReturn(CheckValue("lifetimeRunningHours.Value()", value.Value(), 1UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeRunningHours", value));
                VerifyOrReturn(CheckValue("lifetimeRunningHours.Value()", value.Value(), 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeRunningHours", value));
                VerifyOrReturn(CheckValue("lifetimeRunningHours.Value()", value.Value(), 3UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeEnergyConsumed", value));
                VerifyOrReturn(CheckValue("lifetimeEnergyConsumed.Value()", value.Value(), 1UL));
            }
            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::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeEnergyConsumed", value));
                VerifyOrReturn(CheckValue("lifetimeEnergyConsumed.Value()", value.Value(), 2UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lifetimeEnergyConsumed", value));
                VerifyOrReturn(CheckValue("lifetimeEnergyConsumed.Value()", value.Value(), 3UL));
            }
            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;
        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, "Write 1 to the LifetimeRunningHours attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 1UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads the attribute: LifetimeRunningHours");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write 2 to the LifetimeRunningHours attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 2UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads the attribute: LifetimeRunningHours");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write 3 to the LifetimeRunningHours attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 3UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads the attribute: LifetimeRunningHours");
            VerifyOrDo(!ShouldSkip("PCC.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write 1 to the LifetimeEnergyConsumed attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 1UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reads the attribute: LifetimeEnergyConsumed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write 2 to the LifetimeEnergyConsumed attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 2UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads the attribute: LifetimeEnergyConsumed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write 3 to the LifetimeEnergyConsumed attribute to DUT");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 3UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                  PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads the attribute: LifetimeEnergyConsumed");
            VerifyOrDo(!ShouldSkip("PCC.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PumpConfigurationAndControl::Id,
                                 PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_1_1Suite : public TestCommand
{
public:
    Test_TC_PSCFG_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PSCFG_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PSCFG_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Commission DUT to TH");
            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, "TH reads the ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads the AttributeList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads the AcceptedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads the GeneratedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_2_1Suite : public TestCommand
{
public:
    Test_TC_PSCFG_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PSCFG_2_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PSCFG_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Commission DUT to TH");
            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, "TH reads the Sources attribute from the DUT");
            VerifyOrDo(!ShouldSkip("PSCFG.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), PowerSourceConfiguration::Id,
                                 PowerSourceConfiguration::Attributes::Sources::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_1_1Suite : public TestCommand
{
public:
    Test_TC_RH_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_RH_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_RH_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 3U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("RH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_2_1Suite : public TestCommand
{
public:
    Test_TC_RH_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_RH_2_1", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_RH_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            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;
        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, "TH reads the MinMeasuredValue attribute from the DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the MaxMeasuredValue attribute from the DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads the MeasuredValue attribute from the DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads the Tolerance attribute from the DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::Tolerance::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_5_1Suite : public TestCommand
{
public:
    Test_TC_SC_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_1", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_5_1Suite() {}

    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::NodeId commissionerNodeId;

    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
    {
        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));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                commissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 259U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Test Group", 10)));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 259U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("", 0)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySetID", value.groupKeySet.groupKeySetID, 419U));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySecurityPolicy", value.groupKeySet.groupKeySecurityPolicy, 0U));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey0", value.groupKeySet.epochKey0));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime0", value.groupKeySet.epochStartTime0));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime0.Value()", value.groupKeySet.epochStartTime0.Value(), 2220000ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey1", value.groupKeySet.epochKey1));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime1", value.groupKeySet.epochStartTime1));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime1.Value()", value.groupKeySet.epochStartTime1.Value(), 2220001ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey2", value.groupKeySet.epochKey2));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime2", value.groupKeySet.epochStartTime2));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime2.Value()", value.groupKeySet.epochStartTime2.Value(), 2220002ULL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupId", iter_0.GetValue().groupId, 259U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 1));
                }
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 259U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[0].endpoints[0]", iter_2.GetValue(),
                                                  mEndpoint.HasValue() ? mEndpoint.Value() : 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Test Group", 10)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 1));
                }
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 259U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[0].endpoints[0]", iter_2.GetValue(),
                                                  mEndpoint.HasValue() ? mEndpoint.Value() : 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 1));
                }
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 0));
                }
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 0));
                }
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Read the commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH adds ACL Operate privileges for Group 0x0103");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 259ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH adds ACL Operate privileges for Group 0x0103");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "TH sends KeySetWrite command with incorrect key");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 419U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char("0x00000000000000000000000000000001garbage: not in length on purpose"), 34);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 111ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char("0x00000000000000000000000000000002garbage: not in length on purpose"), 34);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 222ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char("0x00000000000000000000000000000003garbage: not in length on purpose"), 34);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 333ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "TH sends KeySetWrite command with incorrect key");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH sends KeySetWrite command with TH key");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 419U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char("0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedfgarbage: not in length on purpose"), 34);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2220000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char("0xd1d1d2d3d4d5d6d7d8d9dadbdcdddedfgarbage: not in length on purpose"), 34);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2220001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char("0xd2d1d2d3d4d5d6d7d8d9dadbdcdddedfgarbage: not in length on purpose"), 34);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2220002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH sends KeySetWrite command with TH key");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "TH binds GroupId to GroupKeySet");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 259U;
                listHolder_0->mList[0].groupKeySetID = 419U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH binds GroupId to GroupKeySet");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH sends RemoveAllGroups command");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH sends AddGroup command");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 259U;
            value.groupName = chip::Span<const char>("Test Groupgarbage: not in length on purpose", 10);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH sends ViewGroup command");
            VerifyOrDo(!ShouldSkip("G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 259U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "TH sends ViewGroup command");
            VerifyOrDo(!ShouldSkip("!(G.S.F00)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 259U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH sends KeySetRead");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
            value.groupKeySetID = 419U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
                               value, chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH sends KeySetRead");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH reads GroupKeyMap Attribute from the GroupKeyManagement cluster");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads GroupKeyMap Attribute from the GroupKeyManagement cluster");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads GroupTable attribute");
            VerifyOrDo(!ShouldSkip("G.S.F00 && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads GroupTable attribute");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads GroupTable attribute");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY && !G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads GroupTable attribute");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && !G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "TH removes the GroupKeySet");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
            value.groupKeySetID = 419U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "TH removes the GroupKeySet");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "TH verifies the corresponding GroupKeyMap entry has been removed");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH verifies the corresponding GroupKeyMap entry has been removed");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH cleans up groups using RemoveAllGroups command");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
                               chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "TH verifies the group has been removed in the GroupTable");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH verifies the group has been removed in the GroupTable");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "TH removes ACL Operate privileges for Group 0x0103");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH removes ACL Operate privileges for Group 0x0103");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_5_2Suite : public TestCommand
{
public:
    Test_TC_SC_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_2", 20, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_5_2Suite() {}

    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::NodeId commissionerNodeId;

    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
    {
        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));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                commissionerNodeId = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 259U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Test Group 0101", 15)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("", 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));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Read the commissioner node ID");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH adds ACL Operate privileges for Group 0x0103");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(4);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 259ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH adds ACL Operate privileges for Group 0x0103");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "TH sends KeySetWrite command with TH key");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 419U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdfgarbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2220000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\xd1\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdfgarbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2220001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\xd2\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdfgarbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2220002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "TH sends KeySetWrite command with TH key");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH binds GroupId to GroupKeySet");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 419U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                listHolder_0->mList[1].groupId       = 259U;
                listHolder_0->mList[1].groupKeySetID = 419U;
                listHolder_0->mList[1].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH binds GroupId to GroupKeySet");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "TH sends RemoveAllGroups command");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH sends AddGroup command");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 259U;
            value.groupName = chip::Span<const char>("Test Group 0103garbage: not in length on purpose", 15);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH sends AddGroup command again but using group messaging (0x0103)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 257U;
            value.groupName = chip::Span<const char>("Test Group 0101garbage: not in length on purpose", 15);
            return SendGroupCommand(kIdentityAlpha, 259, Groups::Id, Groups::Commands::AddGroup::Id, value);
        }
        case 11: {
            LogStep(11, "Wait for AddGroup");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "Verify there is no response from DUT");
            VerifyOrDo(!ShouldSkip("!PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Verify that there is no response from DUTgarbage: not in length on purpose", 41);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH sends ViewGroup command");
            VerifyOrDo(!ShouldSkip("G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH sends ViewGroup command");
            VerifyOrDo(!ShouldSkip("!(G.S.F00)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH removes the GroupKeySet");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
            value.groupKeySetID = 419U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH removes the GroupKeySet");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH cleans up groups using RemoveAllGroups command");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "TH removes ACL Operate privileges for Group 0x0103");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeId;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH removes ACL Operate privileges for Group 0x0103");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_1_1Suite : public TestCommand
{
public:
    Test_TC_SWTCH_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SWTCH_1_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SWTCH_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 4UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 8UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 16UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap  attribute and Check values of flags in this FeatureMap");
            VerifyOrDo(!ShouldSkip("!SWTCH.S.F00 && !SWTCH.S.F01 && !SWTCH.S.F02 && !SWTCH.S.F03 && !SWTCH.S.F04"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given SWTCH.S.F00(LS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given SWTCH.S.F01(MS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given SWTCH.S.F02(MSR) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given SWTCH.S.F03(MSL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given SWTCH.S.F04(MSM) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: AttributeList");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the global attribute: AttributeList");
            VerifyOrDo(!ShouldSkip("!SWTCH.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_2_1Suite : public TestCommand
{
public:
    Test_TC_SWTCH_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SWTCH_2_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SWTCH_2_1Suite() {}

    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;

    uint8_t NumberOfPositionsValue;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 2U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                NumberOfPositionsValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, NumberOfPositionsValue - 1));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 2U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            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;
        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, "Read NumberOfPositions attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::NumberOfPositions::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read CurrentPosition attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::CurrentPosition::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read MultiPressMax attribute");
            VerifyOrDo(!ShouldSkip("SWTCH.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::MultiPressMax::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_1_1Suite : public TestCommand
{
public:
    Test_TC_TMP_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TMP_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TMP_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute(Tolerance) in AttributeList");
            VerifyOrDo(!ShouldSkip("TMP.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read AcceptedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read GeneratedCommandList attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_2_1Suite : public TestCommand
{
public:
    Test_TC_TMP_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TMP_2_1", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TMP_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27314));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2048U));
            }
            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;
        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, "Read the mandatory attribute: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optional attribute: Tolerance");
            VerifyOrDo(!ShouldSkip("TMP.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::Tolerance::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_1_1Suite : public TestCommand
{
public:
    Test_TC_TSTAT_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_1_1", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 32UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 27UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 32UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 33UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 34UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 52UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 53UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 54UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 55UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 56UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 57UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            VerifyOrDo(!ShouldSkip("!TSTAT.S.F00 && !TSTAT.S.F01 && !TSTAT.S.F02 && !TSTAT.S.F03 && !TSTAT.S.F04 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given TSTAT.S.F00(HEAT ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given TSTAT.S.F01(COOL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given TSTAT.S.F02(OCC) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given TSTAT.S.F03(SCH) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given TSTAT.S.F04(SB) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Given TSTAT.S.F05(AUTO) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the Feature dependent(TSTAT.S.F00(HEAT)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the Feature dependent(TSTAT.S.F01(COOL)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the Feature dependent(TSTAT.S.F02(OCC)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the Feature dependent(TSTAT.S.F00(HEAT) & TSTAT.S.F02(OCC)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the Feature dependent(TSTAT.S.F01(COOL) & TSTAT.S.F02(OCC)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the Feature dependent(TSTAT.S.F05(AUTO)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read the Feature dependent(TSTAT.S.F03(SCH)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read the Feature dependent(TSTAT.S.F04(SB)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the Feature dependent(TSTAT.S.F04(SB) & TSTAT.S.F02(OCC)) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F04 && TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read Feature dependent(TSTAT.S.F03(SCH)) commands in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_2_1Suite : public TestCommand
{
public:
    Test_TC_TSTAT_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_2_1", 68, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_2_1Suite() {}

    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;

    int16_t AbsMinCoolSetpointLimitStep5;
    int8_t MinSetpointDeadBand;
    int16_t AbsMaxCoolSetpointLimitStep6;
    int16_t MinCoolSetpointLimit;
    int16_t MaxCoolSetpointLimit;
    int16_t OccupiedCoolingSetpoint;
    int16_t AbsMinHeat;
    int16_t AbsMaxHeat;
    int16_t UnoccupiedCoolingSetpoint;

    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
    {
        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));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMinCoolSetpointLimitStep5 = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinSetpointDeadBand = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMaxCoolSetpointLimitStep6 = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinCoolSetpointLimit = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MaxCoolSetpointLimit = value;
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OccupiedCoolingSetpoint = value;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMinHeat = value;
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMaxHeat = value;
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                UnoccupiedCoolingSetpoint = value;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMinCoolSetpointLimitStep5 - MinSetpointDeadBand));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1575));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 63U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -25));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 25));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinCoolSetpointLimitStep5));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, OccupiedCoolingSetpoint - MinSetpointDeadBand));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinHeat));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMaxHeat));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, UnoccupiedCoolingSetpoint - MinSetpointDeadBand));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MinCoolSetpointLimit - MinSetpointDeadBand));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit - MinSetpointDeadBand));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinCoolSetpointLimitStep5));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMaxCoolSetpointLimitStep6));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 25));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Thermostat::ThermostatControlSequence value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1440U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap16", "bitmap16"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "epoch_s", "epoch_s"));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4U));
            }
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("ACCapacityformat", value, 0U));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
            }
            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;
        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, "Saving value for comparision in step 5 read AbsMinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Saving value for comparision in step 5 read attribute MinSetpointDeadBand attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Saving value for comparision in step 6 read AbsMaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Saving value for comparision in step 17 read MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Saving value for comparision in step 17 read MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Saving value for comparision in step 13 read attribute OccupiedCoolingSetpoint");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Saving value for comparision in step 15 read attribute AbsMinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Saving value for comparision in step 15 read attribute AbsMaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Saving value for comparision in step 16 read UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads mandatory attributes from DUT: LocalTemperature");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::LocalTemperature::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read OutdoorTemperature attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::OutdoorTemperature::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read Occupancy attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::Occupancy::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute AbsMinHeatSetpointLimit if TSTAT.S.F05 feature is supported");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003 && TSTAT.S.A0005 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read attribute AbsMinHeatSetpointLimit if TSTAT.S.F05 feature is supported");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003 && !TSTAT.S.A0005 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute AbsMinHeatSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Reads mandatory attributes from DUT: AbsMaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read attribute AbsMinCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute AbsMaxCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read PICoolingDemand attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::PICoolingDemand::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read PIHeatingDemand attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::PIHeatingDemand::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read HVACSystemTypeConfiguration attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::HVACSystemTypeConfiguration::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read LocalTemperatureCalibration attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::LocalTemperatureCalibration::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read attribute OccupiedCoolingSetpoint from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read attribute OccupiedCoolingSetpoint from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Read attribute OccupiedHeatingSetpoint if TSTAT.S.F05 feature is supported");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read attribute OccupiedHeatingSetpoint from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Read UnoccupiedCoolingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read UnoccupiedCoolingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.F02 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read UnoccupiedHeatingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02 && TSTAT.S.F05 && TSTAT.S.A0013"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read UnoccupiedHeatingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Reads attribute from DUT: MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015 && TSTAT.S.F05 && TSTAT.S.A0017"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Read attribute MinHeatSetpointLimit from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read attribute MaxHeatSetpointLimit from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Reads attribute from DUT: MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0016 && TSTAT.S.F05 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Read attribute MinCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0017 && TSTAT.S.A0018 && TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read attribute MinCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0017 && !TSTAT.S.A0018 && !TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Read attribute MaxCoolSetpointLimit from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0018 && TSTAT.S.A0006 && TSTAT.S.A0017"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read attribute MinSetpointDeadBand from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Read RemoteSensing attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::RemoteSensing::Id, true,
                                 chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Read attribute ControlSequenceOfOperation from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A001b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::ControlSequenceOfOperation::Id, true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read attribute SystemMode from DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A001c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::SystemMode::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Read ThermostatRunningMode attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A001e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ThermostatRunningMode::Id,
                                 true, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Reads constraints of optional attributes from DUT: StartOfWeek");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::StartOfWeek::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Reads optional attributes from DUT: NumberOfWeeklyTransitions");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::NumberOfWeeklyTransitions::Id, true, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Reads optional attributes from DUT: NumberOfDailyTransitions");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::NumberOfDailyTransitions::Id, true, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read TemperatureSetpointHold attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::TemperatureSetpointHold::Id, true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Read TemperatureSetpointHoldDuration attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0024"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::TemperatureSetpointHoldDuration::Id, true, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Read ThermostatProgrammingOperationMode attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0025"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::ThermostatProgrammingOperationMode::Id, true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Read ThermostatRunningState attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0029"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ThermostatRunningState::Id,
                                 true, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Read SetpointChangeSource attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::SetpointChangeSource::Id,
                                 true, chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read SetpointChangeAmount attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::SetpointChangeAmount::Id,
                                 true, chip::NullOptional);
        }
        case 52: {
            LogStep(52, "Read SetpointChangeSourceTimestamp attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0032"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::SetpointChangeSourceTimestamp::Id, true, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read OccupiedSetback attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::OccupiedSetback::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Read OccupiedSetbackMin attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::OccupiedSetbackMin::Id,
                                 true, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Read OccupiedSetbackMax attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::OccupiedSetbackMax::Id,
                                 true, chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Read UnoccupiedSetback attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::UnoccupiedSetback::Id,
                                 true, chip::NullOptional);
        }
        case 57: {
            LogStep(57, "Read UnoccupiedSetbackMin attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::UnoccupiedSetbackMin::Id,
                                 true, chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Read UnoccupiedSetbackMax attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::UnoccupiedSetbackMax::Id,
                                 true, chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Read EmergencyHeatDelta attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A003a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::EmergencyHeatDelta::Id,
                                 true, chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Read ACType attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0040"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACType::Id, true,
                                 chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Read ACCapacity attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0041"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACCapacity::Id, true,
                                 chip::NullOptional);
        }
        case 62: {
            LogStep(62, "Read ACRefrigerantType attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0042"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACRefrigerantType::Id,
                                 true, chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Read ACCompressorType attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0043"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACCompressorType::Id, true,
                                 chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Read ACErrorCode attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0044"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACErrorCode::Id, true,
                                 chip::NullOptional);
        }
        case 65: {
            LogStep(65, "Read ACLouverPosition attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0045"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACLouverPosition::Id, true,
                                 chip::NullOptional);
        }
        case 66: {
            LogStep(66, "Read ACCoilTemperature attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0046"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACCoilTemperature::Id,
                                 true, chip::NullOptional);
        }
        case 67: {
            LogStep(67, "Read ACCapacityFormat attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0047"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::ACCapacityformat::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_2_2Suite : public TestCommand
{
public:
    Test_TC_TSTAT_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_2_2", 162, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_2_2Suite() {}

    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;

    int16_t MinCoolSetpointLimit;
    int16_t MaxCoolSetpointLimit;
    int8_t MinSetpointDeadBand;
    int16_t MinHeatSetpointLimit;
    int16_t UnoccupiedCoolingSetpoint;
    int16_t MaxHeatSetpointLimit;
    int16_t OccupiedHeatingSetpoint;
    int16_t OccupiedCoolingSetpoint;
    int16_t AbsMinHeatSetpointLimitValue;
    int16_t AbsMaxHeatSetpointLimitValue;
    int16_t AbsMinCoolSetpointLimit;
    int16_t AbsMaxCoolSetpointLimit;

    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
    {
        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));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinCoolSetpointLimit = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MaxCoolSetpointLimit = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinSetpointDeadBand = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MinHeatSetpointLimit = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                UnoccupiedCoolingSetpoint = value;
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                MaxHeatSetpointLimit = value;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OccupiedHeatingSetpoint = value;
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OccupiedCoolingSetpoint = value;
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMinHeatSetpointLimitValue = value;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMaxHeatSetpointLimitValue = value;
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMinCoolSetpointLimit = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                AbsMaxCoolSetpointLimit = value;
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2500));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinHeatSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxHeatSetpointLimit));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 2100));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("unoccupiedCoolingSetpoint", value, 2500));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinHeatSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxHeatSetpointLimit));
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("unoccupiedHeatingSetpoint", value, 2500));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinHeatSetpointLimitValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxHeatSetpointLimit));
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minHeatSetpointLimit", value, 800));
            }
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinHeatSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMaxHeatSetpointLimitValue));
            }
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("maxHeatSetpointLimit", value, 2900));
            }
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, AbsMinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, MaxCoolSetpointLimit));
            }
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minCoolSetpointLimit", value, 2000));
            }
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, MinCoolSetpointLimit));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, AbsMaxCoolSetpointLimit));
            }
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("maxCoolSetpointLimit", value, 2000));
            }
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 120:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 121:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 127:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 128:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 129:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 25));
            }
            break;
        case 130:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 131:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minSetpointDeadBand", value, 5));
            }
            break;
        case 132:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 133:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 134:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 135:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 136:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Thermostat::ThermostatControlSequence value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("controlSequenceOfOperation", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 137:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 138:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Thermostat::ThermostatControlSequence value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("controlSequenceOfOperation", value, 2U));
            }
            break;
        case 139:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 140:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 141:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 142:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 143:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 1700));
            }
            break;
        case 144:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 145:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 146:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 2300));
            }
            break;
        case 147:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 148:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2300));
            }
            break;
        case 149:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 150:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 151:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2900));
            }
            break;
        case 152:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 153:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 154:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 155:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2300));
            }
            break;
        case 156:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 1700));
            }
            break;
        case 157:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 158:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 159:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 160:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2900));
            }
            break;
        case 161:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 2300));
            }
            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;
        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, "Saving value for comparision in step 2a read MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Saving value for comparision in step 2a read MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Saving value for comparision in step 2c read attribute MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Saving value for comparision in step 3a read MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Saving value for comparision in step 3 reads UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Saving value for comparision in step 3a read MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Saving value for comparision in step3c read attribute OccupiedHeatingSetpoint");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Saving value for comparision in step3c read attribute OccupiedCoolingSetpoint");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Saving value for comparision in step 6a read attribute AbsMinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Saving value for comparision in step 7a read attribute AbsMaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxHeatSetpointLimit::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Saving value for comparision in step 8a read attribute AbsMinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMinCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Saving value for comparision in step9a read attribute AbsMaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::AbsMaxCoolSetpointLimit::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute OccupiedCoolingSetpoint from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Reads OccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Writes a value back that is different but valid for OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Reads it back again to confirm the successful write of OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Writes OccupiedCoolingSetpoint to value below the MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 30;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Writes OccupiedCoolingSetpoint to value below the MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Writes OccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Writes OccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxCoolSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Writes the limit of MaxCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Writes the limit of MaxCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Writes the limit of MinCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.F05 && !TSTAT.S.A0017"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Writes the limit of MinCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.F05 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "Writes If TSTAT.S.F05(AUTO) LowerLimit = Max(MinCoolSetpointLimit, (OccupiedHeatingSetpoint + "
                    "MinSetpointDeadBand)) to OccupiedCoolingSetpoint attribute when Auto is enabled");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.A0011 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "Reads OccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Reads OccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.A0015 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Writes a value back that is different but valid for OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2100;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Reads it back again to confirm the successful write of OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Writes OccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Writes OccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 32: {
            LogStep(32, "Writes OccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4010;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Writes OccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxHeatSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.F05 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.F05 && TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 37: {
            LogStep(37,
                    "Writes If TSTAT.S.F05(AUTO) UpperLimit = Min(MaxHeatSetpointLimit, (OccupiedCoolingSetpoint - "
                    "MinSetpointDeadBand)) to OccupiedHeatingSetpoint attribute when Auto is enabled");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.A0011 && TSTAT.S.A0012 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 38: {
            LogStep(38, "Writes the limit of MinHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Writes the limit of MinHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Reads UnoccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Reads UnoccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Writes a value back that is different but valid for UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Reads it back again to confirm the successful write of UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Writes UnoccupiedCoolingSetpoint to value below the MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1002;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Writes UnoccupiedCoolingSetpoint to value below the MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0017 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 46: {
            LogStep(46, "Writes UnoccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4010;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Writes UnoccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxCoolSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Writes the limit of MaxCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0018 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Writes the limit of MaxCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 50: {
            LogStep(50,
                    "Writes If TSTAT.S.F05(AUTO) LowerLimit = Max(MinCoolSetpointLimit, (UnoccupiedCoolingSetpoint + "
                    "MinSetpointDeadBand)) to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0013 && TSTAT.S.F05 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 51: {
            LogStep(51, "Writes the limit of MinCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0017 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 52: {
            LogStep(52, "Writes the limit of MinCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && !TSTAT.S.A0017 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Writes the limit of MinCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Reads UnoccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Reads UnoccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0015 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Writes a value back that is different but valid for UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 57: {
            LogStep(57, "Reads it back again to confirm the successful write of UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Writes UnoccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Writes UnoccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0015 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 60: {
            LogStep(60, "Writes UnoccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4010;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Writes UnoccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxHeatSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 62: {
            LogStep(62, "Writes the limit of MaxHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0016 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Writes the limit of MaxHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Writes the limit of MaxHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0016 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 65: {
            LogStep(65,
                    "Writes If TSTAT.S.F05(AUTO) UpperLimit = Min(MaxHeatSetpointLimit, (UnoccupiedCoolingSetpoint - "
                    "MinSetpointDeadBand)) to UnoccupiedHeatingSetpoint attribute when Auto is enabled.");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0013 && TSTAT.S.F05 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 66: {
            LogStep(66, "Writes the limit of MinHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && !TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 67: {
            LogStep(67, "Writes the limit of MinHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00 && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 68: {
            LogStep(68, "Reads MinHeatSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.A0016 && TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Reads MinHeatSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && !TSTAT.S.A0016 && !TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 70: {
            LogStep(70, "Writes a value back that is different but valid for MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 800;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Reads it back again to confirm the successful write of MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 72: {
            LogStep(72, "Writes a value back that is different but violates the deadband");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015 && TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 73: {
            LogStep(73, "Writes MinHeatSetpointLimit to value below the AbsMinHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && !TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 100;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 74: {
            LogStep(74, "Writes MinHeatSetpointLimit to value below the AbsMinHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.A0003 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 75: {
            LogStep(75, "Writes MinHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4050;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 76: {
            LogStep(76, "Writes MinHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxHeatSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 77: {
            LogStep(77, "Writes the limit of MaxHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && !TSTAT.S.F05 && !TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "Writes the limit of MaxHeatSetpointLimit to MinHeatSetpointimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && !TSTAT.S.F05 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 79: {
            LogStep(79,
                    "Writes If TSTAT.S.F05(AUTO) UpperLimit = Min(MaxHeatSetpointLimit, (MinCoolSetpointLimit - "
                    "MinSetpointDeadBand)) to MinHeatSetpointLimit attribute when Auto is enabled");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && TSTAT.S.F05 && TSTAT.S.A0005 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 80: {
            LogStep(80, "Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && !TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 81: {
            LogStep(81, "Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && TSTAT.S.A0003"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = AbsMinHeatSetpointLimitValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 82: {
            LogStep(82, "Reads MaxHeatSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.F05 && TSTAT.S.A0004 && TSTAT.S.A0016"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 83: {
            LogStep(83, "Reads MaxHeatSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip(" TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.F05 && !TSTAT.S.A0004 && !TSTAT.S.A0016 "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 84: {
            LogStep(84, "Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 85: {
            LogStep(85, "Writes the limit of AbsMaxHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.A0015 && TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 86: {
            LogStep(86, "Writes a value back that is different but valid for MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2900;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 87: {
            LogStep(87, "Reads it back again to confirm the successful write of MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 88: {
            LogStep(88, "Writes MaxHeatSetpointLimit to value below the AbsMinHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.A0015"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 500;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 89: {
            LogStep(89, "Writes MaxHeatSetpointLimit to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && TSTAT.S.A0015 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 90: {
            LogStep(90, "Writes MaxHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.A0004"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 91: {
            LogStep(91, "Writes MaxHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && TSTAT.S.A0004"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(AbsMaxHeatSetpointLimitValue + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 92: {
            LogStep(92, "Writes the limit of AbsMaxHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.F05 && !TSTAT.S.A0004"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 93: {
            LogStep(93, "Writes the limit of AbsMaxHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05 && TSTAT.S.A0004"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = AbsMaxHeatSetpointLimitValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 94: {
            LogStep(94,
                    "Writes If TSTAT.S.F05(AUTO) UpperLimit = Min(AbsMaxHeatSetpointLimit, (MaxCoolSetpointLimit - "
                    "MinSetpointDeadBand)) to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && TSTAT.S.F05 && TSTAT.S.A0018 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 95: {
            LogStep(95, "Writes the limit of MinHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.A0015"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 96: {
            LogStep(96, "Writes the limit of MinHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && TSTAT.S.A0015"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinHeatSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 97: {
            LogStep(97, "Reads MinCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018 && TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 98: {
            LogStep(98, "Reads MinCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0018 && !TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 99: {
            LogStep(99, "Writes a value back that is different but valid for MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 100: {
            LogStep(100, "Reads it back again to confirm the successful write of MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 101: {
            LogStep(101, "Writes MinCoolSetpointLimit to value below the AbsMinCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 102: {
            LogStep(102, "Writes MinCoolSetpointLimit to value below the AbsMinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0005 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 103: {
            LogStep(103, "Writes MinCoolSetpointLimit to value above the MaxCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 104: {
            LogStep(104, "Writes MinCoolSetpointLimit to value above the MaxCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(MaxCoolSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 105: {
            LogStep(105, "Writes the limit of MaxCoolSetpointLimit to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 106: {
            LogStep(106, "Writes the limit of MaxCoolSetpointLimit to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0018"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MaxCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 107: {
            LogStep(107, "Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && !TSTAT.S.A0005 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 108: {
            LogStep(108, "Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0005 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = AbsMinCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 109: {
            LogStep(109,
                    "Writes If TSTAT.S.F05(AUTO) LowerLimit = Max(AbsMinCoolSetpointLimit, (MinHeatSetpointLimit + "
                    "MinSetpointDeadBand)) to MinCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017 && TSTAT.S.A0015 && TSTAT.S.F05 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 110: {
            LogStep(110, "Reads MaxCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0017 && TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 111: {
            LogStep(111, "Reads MaxCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0017 && !TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 112: {
            LogStep(112, "Writes a value back that is different but valid for MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 113: {
            LogStep(113, "Reads it back again to confirm the successful write of MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 114: {
            LogStep(114, "Writes MaxCoolSetpointLimit to value below the AbsMinCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0017"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 115: {
            LogStep(115, "Writes MaxCoolSetpointLimit to value below the AbsMinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0017 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 116: {
            LogStep(116, "Writes MaxCoolSetpointLimit to value above the MaxCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 4000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 117: {
            LogStep(117, "Writes MaxCoolSetpointLimit to value above the MaxCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = static_cast<int16_t>(AbsMaxCoolSetpointLimit + 1000);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 118: {
            LogStep(118, "Writes the limit of AbsMaxCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 119: {
            LogStep(119, "Writes the limit of AbsMaxCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = AbsMaxCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 120: {
            LogStep(120, "Writes the limit of MinCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0017 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 121: {
            LogStep(121, "Writes the limit of MinCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.A0017 && TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 122: {
            LogStep(122, "Writes the limit of MinCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0017 && !TSTAT.S.F05"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = MinCoolSetpointLimit;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 123: {
            LogStep(123,
                    "Writes If TSTAT.S.F05(AUTO) LowerLimit = Max(MinCoolSetpointLimit, (MaxHeatSetpointLimit + "
                    "MinSetpointDeadBand)) to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && TSTAT.S.A0016 && TSTAT.S.F05 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 124: {
            LogStep(124, "Writes (sets back) default value of MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 700;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 125: {
            LogStep(125, "Writes (sets back)default value of MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 126: {
            LogStep(126, "Writes MaxHeatSetpointLimit That meets the deadband of 2.5C");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0016 && !TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2950;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 127: {
            LogStep(127, "Writes (sets back) default value of MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 128: {
            LogStep(128, "Writes (sets back) default value of MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 129: {
            LogStep(129, "Reads MinSetpointDeadBand attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 130: {
            LogStep(130, "Writes a value back that is different but valid for MinSetpointDeadBand attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = 5;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 131: {
            LogStep(131, "Reads it back again to confirm the successful write of MinSetpointDeadBand attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                 true, chip::NullOptional);
        }
        case 132: {
            LogStep(132, "Writes the value below MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = -1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 133: {
            LogStep(133, "Writes the value above MinSetpointDeadBand ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = 30;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 134: {
            LogStep(134, "Writes the min limit of MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 135: {
            LogStep(135, "Writes the max limit of MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05 && TSTAT.S.M.MinSetpointDeadBandWritable"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int8_t value;
            value = 25;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinSetpointDeadBand::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 136: {
            LogStep(136, "Reads ControlSequenceOfOperation from Server DUT and verifies that the value is valid");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::ControlSequenceOfOperation::Id, true, chip::NullOptional);
        }
        case 137: {
            LogStep(137, "Write Attribute command for ControlSequenceOfOperation with a new valid value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::ThermostatControlSequence value;
            value = static_cast<chip::app::Clusters::Thermostat::ThermostatControlSequence>(2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::ControlSequenceOfOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 138: {
            LogStep(138, "Read it back again to confirm the successful write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::ControlSequenceOfOperation::Id, true, chip::NullOptional);
        }
        case 139: {
            LogStep(139, "Writes MaxHeatSetpointLimit attribute to default value of 2950 to meet deadband constraint");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2950;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 140: {
            LogStep(140, "Sets OccupiedCoolingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 141: {
            LogStep(141, "Sets OccupiedHeatingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 142: {
            LogStep(142, "Sends SetpointRaise Command Heat Only");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(0);
            value.amount = -30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 143: {
            LogStep(143, "Reads back OccupiedHeatingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 144: {
            LogStep(144, "Sets OccupiedHeatingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 145: {
            LogStep(145, "Sends SetpointRaise Command Heat Only");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(0);
            value.amount = 30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 146: {
            LogStep(146, "Reads back OccupiedHeatingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 147: {
            LogStep(147, "Sends SetpointRaise Command Cool Only");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(1);
            value.amount = -30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 148: {
            LogStep(148, "Reads back OccupiedCoolingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 149: {
            LogStep(149, "Sets OccupiedCoolingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 150: {
            LogStep(150, "Sends SetpointRaise Command Cool Only");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(1);
            value.amount = 30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 151: {
            LogStep(151, "Reads back OccupiedCoolingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 152: {
            LogStep(152, "Sets OccupiedCoolingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 153: {
            LogStep(153, "Sets OccupiedHeatingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 154: {
            LogStep(154, "Sends SetpointRaise Command Heat & Cool");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(2);
            value.amount = -30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 155: {
            LogStep(155, "Reads back OccupiedCoolingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 156: {
            LogStep(156, "Reads back OccupiedHeatingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 157: {
            LogStep(157, "Sets OccupiedCoolingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2600;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 158: {
            LogStep(158, "Sets OccupiedHeatingSetpoint to default value");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 2000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::OccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 159: {
            LogStep(159, "Sends SetpointRaise Command Heat & Cool");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::Thermostat::Commands::SetpointRaiseLower::Type value;
            value.mode   = static_cast<chip::app::Clusters::Thermostat::SetpointAdjustMode>(2);
            value.amount = 30;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Commands::SetpointRaiseLower::Id, value,
                               chip::NullOptional

            );
        }
        case 160: {
            LogStep(160, "Reads back OccupiedCoolingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 161: {
            LogStep(161, "Reads back OccupiedHeatingSetpoint to confirm the success of the write");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::OccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_1_1Suite : public TestCommand
{
public:
    Test_TC_TSUIC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSUIC_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSUIC_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 2U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH read ClusterRevision attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap attribute from the DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_2_1Suite : public TestCommand
{
public:
    Test_TC_TSUIC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSUIC_2_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSUIC_2_1Suite() {}

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            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;
        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, "Read the mandatory attribute: TemperatureDisplayMode");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: KeypadLockout");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the optional attribute: ScheduleProgrammingVisibility");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_2_2Suite : public TestCommand
{
public:
    Test_TC_TSUIC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSUIC_2_2", 37, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSUIC_2_2Suite() {}

    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureDisplayMode", value, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureDisplayMode", value, 1U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("temperatureDisplayMode", value, 1U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 0U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 1U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 2U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 3U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 4U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("keypadLockout", value, 5U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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("keypadLockout", value, 5U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("scheduleProgrammingVisibility", value, 0U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("scheduleProgrammingVisibility", value, 1U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("scheduleProgrammingVisibility", value, 1U));
            }
            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;
        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, "Writes a value of 0 to TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Verify device temperature displayed in °C");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH reads the TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Writes a value of 1 to TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Verify device temperature displayed in °F");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH reads the TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Writes a value of greater than 1 to TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads the TemperatureDisplayMode attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Writes a value of 0 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Verify all device functionality available to the user");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Writes a value of 1 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Verify device operates at Level 1 reduced functionality");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Writes a value of 2 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Verify device operates at Level 2 reduced functionality");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Writes a value of 3 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Verify device operates at Level 3 reduced functionality");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Writes a value of 4 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 4U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Verify device operates at Level 4 reduced functionality");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Writes a value of 5 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 5U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Verify device operates at least functionality level");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Writes a value of greater than 5 to KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 6U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads the KeypadLockout attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Writes a value of 0 to ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Verify local schedule programming functionality is enabled at the thermostat");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads the ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Writes a value of 1 to ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Verify local schedule programming functionality is disabled at the thermostat");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34, "TH reads the ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Writes a value of greater than 1 to ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                  ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH reads the ScheduleProgrammingVisibility attribute of DUT");
            VerifyOrDo(!ShouldSkip("TSUIC.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ThermostatUserInterfaceConfiguration::Id,
                                 ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_1_1Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_1_1", 17, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 13UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 59UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 60UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 61UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 62UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 21UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 22UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 23UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 24UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 27UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 29UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 30UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 31UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 32UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 33UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 34UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 35UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 36UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 37UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 38UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 39UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 40UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 41UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 42UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 43UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 44UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 45UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 46UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 47UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 48UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 49UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 50UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 51UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 52UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 53UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 54UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 55UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 56UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 57UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 58UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !DGTHREAD.S.F00 && !DGTHREAD.S.F01 && !DGTHREAD.S.F02 && !DGTHREAD.S.F03 "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DGTHREAD.S.F00(PKTCNT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given DGTHREAD.S.F01(ERRCNT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given DGTHREAD.S.F02(MLECNT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given DGTHREAD.S.F03(MACCNT) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads mandatory attributes in AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads Feature dependent attribute(DGTHREAD.S.F01(ERRCNT)) in attributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0006 && DGTHREAD.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads Feature dependent attribute (DGTHREAD.S.F02(MLECNT)) in attributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads Feature dependent attribute (DGTHREAD.S.F03(MACCNT)) in attributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the optional attribute (ActiveTimestamp) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0038"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the optional attribute (PendingTimestamp) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0039"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the optional attribute (Delay) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A003a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip(" !DGTHREAD.S.F01 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_1Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_1", 34, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::RoutingRole> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "octet_string", "octet_string"));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFault> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads Channel attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::Channel::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads RoutingRole attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RoutingRole::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads Network Name attribute value from DUT and Verify that Network name is of the type string");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::NetworkName::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4,
                    "Read NetworkName attribute from DUT and verify response value, If value is NULL then verify that RoutingRole "
                    "is set to 1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH reads PanId attribute value from DUT and Verify that PanId is of the type uint16");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::PanId::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "Read PanId attribute from DUT and verify response value, If value is NULL then verify that RoutingRole is set "
                    "to 1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads ExtendedPanId attribute value from DUT and Verify that ExtendedPanId is of the type uint64");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ExtendedPanId::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8,
                    "Read ExtendedPanId attribute from DUT and verify response value, If value is NULL then verify that "
                    "RoutingRole is set to 1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9,
                    "Read MeshLocalPrefix attribute from DUT and verify response value, If value is NULL then verify that "
                    "RoutingRole is set to 1");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "TH reads OverrunCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0006 && DGTHREAD.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(
                11,
                "read OverrunCount attribute from DUT and verify response value, If the Overruncount is greater than zero or not");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12,
                    "read NeighborTableList attribute from DUT and Verify that the NeighborTable List size is Zero or greater and "
                    "verify each node types");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13,
                    "Read RouteTable attribute from DUT and Verify that the RouteTableList List size is Zero or greater and verify "
                    "each node types");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TH reads PartitionId attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::PartitionId::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads Weighting attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::Weighting::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads DataVersion attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::DataVersion::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads StableDataVersion attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::StableDataVersion::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads LeaderRouterId attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::LeaderRouterId::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads DetachedRoleCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000e && DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::DetachedRoleCount::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads ChildRoleCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A000f && DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ChildRoleCount::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads RouterRoleCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0010 && DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RouterRoleCount::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads LeaderRoleCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0011 && DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::LeaderRoleCount::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads AttachAttemptCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0012 && DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::AttachAttemptCount::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads PartitionIdChangeCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0013 && DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::PartitionIdChangeCount::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads BetterPartitionAttachAttemptCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0014 && DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::BetterPartitionAttachAttemptCount::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH reads ParentChangeCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0015 && DGTHREAD.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ParentChangeCount::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads ActiveTimestamp attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0038"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ActiveTimestamp::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads PendingTimestamp attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0039"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::PendingTimestamp::Id, true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH reads Delay attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A003a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::Delay::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read SecurityPolicy struct attribute from DUT and Verify the each field");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A003b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads ChannelPage0Mask attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A003c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ChannelPage0Mask::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Read OperationalDatasetComponents struct attribute from DUT and Verify the each field");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGTHREAD.S.A003d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH reads ActiveNetworkFaults attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A003e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::ActiveNetworkFaultsList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_2Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_2", 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_DGTHREAD_2_2Suite() {}

    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
    {
        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));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            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;
        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, "TH reads TxTotalCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxTotalCount::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads TxUnicastCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxUnicastCount::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads TxBroadcastCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxBroadcastCount::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads TxAckRequestedCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxAckRequestedCount::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads TxAckedCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxAckedCount::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads TxNoAckRequestedCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxNoAckRequestedCount::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads TxDataCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxDataCount::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads TxDataPollCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxDataPollCount::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads TxBeaconCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxBeaconCount::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads TxBeaconRequestCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A001f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxBeaconRequestCount::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads TxOtherCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0020"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxOtherCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads TxRetryCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxRetryCount::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads TxDirectMaxRetryExpiryCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0022"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxDirectMaxRetryExpiryCount::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads TxIndirectMaxRetryExpiryCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxIndirectMaxRetryExpiryCount::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads TxErrCcaCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0024"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxErrCcaCount::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads TxErrAbortCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0025"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxErrAbortCount::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads TxErrBusyChannelCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0026"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::TxErrBusyChannelCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_3Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_3", 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_DGTHREAD_2_3Suite() {}

    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
    {
        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));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            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;
        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, "TH reads RxTotalCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0027"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxTotalCount::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads RxUnicastCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0028"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxUnicastCount::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads RxBroadcastCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0029"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxBroadcastCount::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads RxDataCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxDataCount::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads RxDataPollCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxDataPollCount::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads RxBeaconCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxBeaconCount::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads RxBeaconRequestCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxBeaconRequestCount::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads RxOtherCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxOtherCount::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads RxAddressFilteredCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A002f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxAddressFilteredCount::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads RxDestAddrFilteredCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxDestAddrFilteredCount::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads RxDuplicatedCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxDuplicatedCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads RxErrNoFrameCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0032"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrNoFrameCount::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads RxErrUnknownNeighborCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrUnknownNeighborCount::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads RxErrInvalidSrcAddrCount attribute value from DUT and verify data type");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0034"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrInvalidSrcAddrCount::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads RxErrSecCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0035"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrSecCount::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads RxErrFcsCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0036"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrFcsCount::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads RxErrOtherCount attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0037"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::RxErrOtherCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_4Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_4", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_2_4Suite() {}

    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
    {
        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));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("overrunCount", value, 0ULL));
            }
            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;
        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, "Sends ResetCounts command");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ThreadNetworkDiagnostics::Commands::ResetCounts::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                               ThreadNetworkDiagnostics::Commands::ResetCounts::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Read the Overruncount attribute");
            VerifyOrDo(!ShouldSkip("DGTHREAD.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), ThreadNetworkDiagnostics::Id,
                                 ThreadNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_1_1Suite : public TestCommand
{
public:
    Test_TC_ULABEL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_1_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "Read the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_1Suite : public TestCommand
{
public:
    Test_TC_ULABEL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_2_1", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_2Suite : public TestCommand
{
public:
    Test_TC_ULABEL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_2_2", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_2_2Suite() {}

    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
    {
        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::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("roomName", 8)));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("master bedroom 1", 16)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[1].label", iter_0.GetValue().label, chip::CharSpan("Orientation", 11)));
                    VerifyOrReturn(CheckValueAsString("labelList[1].value", iter_0.GetValue().value, chip::CharSpan("east", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("labelList[2].label", iter_0.GetValue().label, chip::CharSpan("floor", 5)));
                    VerifyOrReturn(CheckValueAsString("labelList[2].value", iter_0.GetValue().value, chip::CharSpan("2", 1)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 3));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[3].label", iter_0.GetValue().label, chip::CharSpan("roomType", 8)));
                    VerifyOrReturn(CheckValueAsString("labelList[3].value", iter_0.GetValue().value, chip::CharSpan("bedroom", 7)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 4));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 4));
            }
            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;
        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, "TH writes LabelList attribute from the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomNamegarbage: not in length on purpose", 8);
                listHolder_0->mList[0].value = chip::Span<const char>("master bedroom 1garbage: not in length on purpose", 16);

                listHolder_0->mList[1].label = chip::Span<const char>("Orientationgarbage: not in length on purpose", 11);
                listHolder_0->mList[1].value = chip::Span<const char>("eastgarbage: not in length on purpose", 4);

                listHolder_0->mList[2].label = chip::Span<const char>("floorgarbage: not in length on purpose", 5);
                listHolder_0->mList[2].value = chip::Span<const char>("2garbage: not in length on purpose", 1);

                listHolder_0->mList[3].label = chip::Span<const char>("roomTypegarbage: not in length on purpose", 8);
                listHolder_0->mList[3].value = chip::Span<const char>("bedroomgarbage: not in length on purpose", 7);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads LabelList attribute from the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_3Suite : public TestCommand
{
public:
    Test_TC_ULABEL_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_2_3", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_2_3Suite() {}

    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
    {
        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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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;
        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, "TH writes LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value =
                    chip::Span<const char>("17_bytesIsTooLongforuserlabelnotexpectedgarbage: not in length on purpose", 40);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH writes LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label =
                    chip::Span<const char>("17_bytesIsTooLongforuserlabelnotexpectedgarbage: not in length on purpose", 40);
                listHolder_0->mList[0].value = chip::Span<const char>("foobargarbage: not in length on purpose", 6);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_4Suite : public TestCommand
{
public:
    Test_TC_ULABEL_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_2_4", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ULABEL_2_4Suite() {}

    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
    {
        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::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("room", 4)));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("bedroom 1", 9)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[1].label", iter_0.GetValue().label, chip::CharSpan("Orientation", 11)));
                    VerifyOrReturn(CheckValueAsString("labelList[1].value", iter_0.GetValue().value, chip::CharSpan("east", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 2));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 1));
                }
            }
            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;
        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, "TH writes LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value = chip::Span<const char>("bedroom 1garbage: not in length on purpose", 9);

                listHolder_0->mList[1].label = chip::Span<const char>("Orientationgarbage: not in length on purpose", 11);
                listHolder_0->mList[1].value = chip::Span<const char>("eastgarbage: not in length on purpose", 4);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH writes LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("garbage: not in length on purpose", 0);
                listHolder_0->mList[0].value = chip::Span<const char>("garbage: not in length on purpose", 0);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads LabelList attribute of the DUT");
            VerifyOrDo(!ShouldSkip("ULABEL.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_1_1Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_1_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip("( !DGWIFI.S.F00 && !DGWIFI.S.F01 )"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DGWIFI.S.F00(PacketCounts) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given DGWIFI.S.F01(ErrorCounts) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads Feature dependent(DGWIFI.S.F00) attributes in attributeList from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads Feature dependent(DGWIFI.S.F01) attributes in attributeList from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads optional attribute (CurrentMaxRate) in AttributeList from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip(" !DGWIFI.S.F01 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads Feature dependent(DGWIFI.S.F01) command in AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_1Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_2_1", 14, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_2_1Suite() {}

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "octet_string", "octet_string"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -120));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 0));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            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;
        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, "TH reads BSSID attribute from DUT");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::Bssid::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads SecurityType attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::SecurityType::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads WiFiVersion attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::WiFiVersion::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads ChannelNumber attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::ChannelNumber::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads RSSI attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0004"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::Rssi::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads BeaconLostCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::BeaconLostCount::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads BeaconRxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("DGWIFI.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::BeaconRxCount::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Reads PacketMulticastRxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketMulticastRxCount::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Reads PacketMulticastTxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketMulticastTxCount::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Reads PacketUnicastRxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketUnicastRxCount::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Reads PacketUnicastTxCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketUnicastTxCount::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reads CurrentMaxRate attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::CurrentMaxRate::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Reads OverrunCount attribute constraints");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::OverrunCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_3Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_2_3", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_2_3Suite() {}

    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
    {
        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::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967295UL));
            }
            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;
        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, "TH sends ResetCounts command to DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WiFiNetworkDiagnostics::Commands::ResetCounts::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                               WiFiNetworkDiagnostics::Commands::ResetCounts::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads BeaconLostCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0005"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::BeaconLostCount::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads BeaconRxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0006"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::BeaconRxCount::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads PacketMulticastRxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0007"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketMulticastRxCount::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reads PacketMulticastTxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0008"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketMulticastTxCount::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reads PacketUnicastRxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0009"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketUnicastRxCount::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Reads PacketUnicastTxCount attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A000a"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), WiFiNetworkDiagnostics::Id,
                                 WiFiNetworkDiagnostics::Attributes::PacketUnicastTxCount::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_1_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_1_1", 19, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 10UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 13UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 23UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 8UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads from the DUT the (0xFFFD) ClusterRevision attribute");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afffd"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads from the DUT the (0xFFFC) FeatureMap attribute");
            VerifyOrDo(!ShouldSkip(" WNCV.S.Afffc && !WNCV.S.F00 && !WNCV.S.F01 && !WNCV.S.F02 && !WNCV.S.F03 && !WNCV.S.F04 "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given WNCV.S.F00(LF) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given  WNCV.S.F01(TL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given WNCV.S.F02(PA_LF) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given WNCV.S.F03(ABS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given WNCV.S.F04(PA_TL) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("WNCV.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads from the DUT the (0xFFFB) AttributeList attribute");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads optional attribute(SafetyStatus) in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afffb && WNCV.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 & WNCV.S.F03) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.F03 && WNCV.S.Afffb"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 ) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 & WNCV.S.F03) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.F03 && WNCV.S.Afffb"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 ) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.Afffb"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads from the DUT the (0xFFF9) AcceptedCommandList attribute");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff9"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads Feature dependent(WNCV.S.F00 & WNCV.S.F02) command in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff9 && WNCV.S.F00 && WNCV.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F03) command in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff9 && WNCV.S.F01 && WNCV.S.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F04) command in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff9 && WNCV.S.F01 && WNCV.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads from the DUT the (0xFFF8) GeneratedCommandList attribute");
            VerifyOrDo(!ShouldSkip("WNCV.S.Afff8"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_1", 26, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_2_1Suite() {}

    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;

    uint16_t InstalledOpenLimitLift;
    uint16_t InstalledClosedLimitLift;
    uint16_t InstalledOpenLimitTilt;
    uint16_t InstalledClosedLimitTilt;

    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
    {
        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));
            {
                chip::app::Clusters::WindowCovering::Type value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::WindowCovering::EndProductType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                InstalledOpenLimitLift = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                InstalledClosedLimitLift = value;
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                InstalledOpenLimitTilt = value;
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                InstalledClosedLimitTilt = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::SafetyStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap16", "bitmap16"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2047U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, InstalledOpenLimitLift));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, InstalledClosedLimitLift));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, InstalledOpenLimitTilt));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, InstalledClosedLimitTilt));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            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;
        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, "1a: read the RO mandatory attribute default: Type");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Type::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "1b: read the RO mandatory attribute default: ConfigStatus");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "1c: read the RO mandatory attribute default: OperationalStatus");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "1d: read the RO mandatory attribute default: EndProductType");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::EndProductType::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "1e: read the RW mandatory attribute default: Mode");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "1f: write a value into the RW mandatory attribute:: Mode");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "2a: read the RO optional attribute default: TargetPositionLiftPercent100ths");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "2b: read the RO optional attribute default: TargetPositionTiltPercent100ths");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "2c: read the RO optional attribute default: CurrentPositionLiftPercent100ths");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "2d: read the RO optional attribute default: CurrentPositionTiltPercent100ths");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2e: read the RO optional attribute default: InstalledOpenLimitLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0010"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::InstalledOpenLimitLift::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "2f: read the RO optional attribute default: InstalledClosedLimitLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::InstalledClosedLimitLift::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "2g: read the RO optional attribute default: InstalledOpenLimitTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0012"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::InstalledOpenLimitTilt::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "2h: read the RO optional attribute default: InstalledClosedLimitTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::InstalledClosedLimitTilt::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "3a: read the RO mandatory attribute default: SafetyStatus");
            VerifyOrDo(!ShouldSkip("WNCV.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::SafetyStatus::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3b: read the RO optional attribute default: PhysicalClosedLimitLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::PhysicalClosedLimitLift::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "3c: read the RO optional attribute default: PhysicalClosedLimitTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::PhysicalClosedLimitTilt::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "3d: read the RO optional attribute default: CurrentPositionLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0003 && !WNCV.S.A0010 && !WNCV.S.A0011"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLift::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "3d: read the RO optional attribute default: CurrentPositionLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0003 && WNCV.S.A0010 && WNCV.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLift::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "3e: read the RO optional attribute default: CurrentPositionTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0004 && !WNCV.S.A0012 && !WNCV.S.A0013"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTilt::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "3e: read the RO optional attribute default: CurrentPositionTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0004 && WNCV.S.A0012 && WNCV.S.A0013"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTilt::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "3f: read the RO optional attribute default: NumberOfActuationsLift");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::NumberOfActuationsLift::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "3g: read the RO optional attribute default: NumberOfActuationsTilt");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::NumberOfActuationsTilt::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "3h: read the RO optional attribute default: CurrentPositionLiftPercentage");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "3i:read the RO optional attribute default: CurrentPositionTiltPercentage");
            VerifyOrDo(!ShouldSkip("WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_2Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_2", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_2_2Suite() {}

    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
    {
        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));
            shouldContinue = true;
            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;
        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,
                    "Reads ConfigStatus attribute from DUT, if (PA & LF) value of bit 3 must be 1b else 0b & if (PA & TL) value of "
                    "bit 4 must be 1b else 0b");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && WNCV.S.A0007 && WNCV.S.F00 && WNCV.S.F02"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_3Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_3", 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_WNCV_2_3Suite() {}

    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::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> configStatusValA;
    chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> configStatusValB;

    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
    {
        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::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
                configStatusValA = value;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            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), EMBER_ZCL_STATUS_BUSY));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
                configStatusValB = value;
            }
            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));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127U));
            }
            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;
        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, "1a: TH set the Mode Attribute bit0 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(1U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "1b: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "1c: TH clear the Mode Attribute bit0 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "1d: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "2a: TH set the Mode Attribute bit1 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(2U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "2b: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "2c: If (ConfigStatus bit0 == 0) TH send DownOrClose command to the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "2d: TH clear the Mode Attribute bit1 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "2e: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "2f: TH reads the Mode Attribute from the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2g: TH send DownOrClose command to the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Calibration && WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "3a: TH set the Mode Attribute bit2 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(4U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "3b: TH send DownOrClose command to the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "3c: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "3d: TH clear the Mode Attribute bit2 of the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::WindowCovering::Mode>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::Mode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3e: TH send DownOrClose command to the DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "3f: TH reads ConfigStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_4Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_4", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_2_4Suite() {}

    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
    {
        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));
            shouldContinue = true;
            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;
        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, "Reads Type attribute from DUT");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && WNCV.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_5Suite : public TestCommand
{
public:
    Test_TC_WNCV_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_2_5", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_2_5Suite() {}

    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
    {
        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));
            {
                chip::app::Clusters::WindowCovering::EndProductType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 23U));
            }
            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;
        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, "TH reads EndProductType attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::EndProductType::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_1", 29, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_1Suite() {}

    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), 0U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), 0U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 2U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 8U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 4U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 8U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 32U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 16U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 32U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 99U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 99U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "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, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for 10 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "2: Subscribe to DUT reports on OperationalStatus attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                      WindowCovering::Attributes::OperationalStatus::Id, 4, 5, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 8: {
            LogStep(8, "2a: TH sends UpOrOpen command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "2b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "2e: TH leave the device moving for 2 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "3a: TH reads OperationalStatus attribute's bit 0..1");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && !WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && !WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "3a2: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "4a: TH sends a StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "4b: TH waits for 3 seconds the end of inertial movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "5a: TH waits for x seconds attributes update on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_2Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_2", 29, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_2Suite() {}

    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 99U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 99U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), 10000U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), 10000U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 1U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 8U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 4U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 4U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 8U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 32U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 16U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 16U));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 32U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent", "Percent"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "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, "1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for 10 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "2: Subscribe to DUT reports on OperationalStatus attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                      WindowCovering::Attributes::OperationalStatus::Id, 4, 5, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 8: {
            LogStep(8, "2a: TH sends DownOrClose command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "2b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "2e: TH leave the device moving for 2 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "3a: TH reads OperationalStatus attribute's bit 0..1");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && !WNCV.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a && !WNCV.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "3a2: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "4a: TH sends a StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "4b: TH waits for 3 seconds the end of inertial movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "5a: TH waits for x seconds attributes update on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_3Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_3", 17, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_3Suite() {}

    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::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionLift;
    chip::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionTilt;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap8", "bitmap8"));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                attrCurrentPositionLift = value;
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (attrCurrentPositionLift.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("targetPositionLiftPercent100ths", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                    VerifyOrReturn(
                        CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), attrCurrentPositionLift.Value()));
                }
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                attrCurrentPositionTilt = value;
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (attrCurrentPositionTilt.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("targetPositionTiltPercent100ths", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                    VerifyOrReturn(
                        CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), attrCurrentPositionTilt.Value()));
                }
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "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, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for 6-8 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: TH sends UpOrOpen command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "1d: TH Waits for 2 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "1e: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "1d: TH Waits for 2 seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "2: Subscribe to DUT reports on OperationalStatus attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                      WindowCovering::Attributes::OperationalStatus::Id, 4, 5, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 8: {
            LogStep(8, "2a: TH sends a StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "2b: TH waits for 3 seconds the end of inertial movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "2c: TH reads OperationalStatus attribute from DUT after a StopMotion");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "2d: TH waits for 100ms - 3s attributes update on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "2e: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "3b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute 3c: it Must be equal with "
                    "CurrentPositionLiftPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b && WNCV.S.A000e"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "4a: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16,
                    "4b: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute 4c: it Must be equal with "
                    "CurrentPositionTiltPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000c && WNCV.S.A000f && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_4Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_4", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fastMotionDuration", 0, UINT16_MAX, &mFastMotionDuration);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_4Suite() {}

    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> mFastMotionDuration;
    chip::Optional<uint16_t> mFullMotionDuration;
    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(), 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(), 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(), 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(), 0U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "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, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for fastMotionDuration seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "2a: TH sends UpOrOpen command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "2b: TH Waits for fullMotionDuration seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "2c: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_5Suite : public TestCommand
{
public:
    Test_TC_WNCV_3_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_3_5", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fastMotionDuration", 0, UINT16_MAX, &mFastMotionDuration);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_3_5Suite() {}

    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> mFastMotionDuration;
    chip::Optional<uint16_t> mFullMotionDuration;
    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(), 10000U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(), 100U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(), 10000U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(), 100U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "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, "1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH Waits for fastMotionDuration seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "2a: TH sends DownOrClose command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "2b: TH Waits for fullMotionDuration seconds movement(s) on the device");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "2c: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_1", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_1Suite() {}

    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> mFullMotionDuration;
    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), 2500U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(), 2500U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(), 25U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionLiftPercent100ths.Value()", value.Value(), 7520U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(), 7520U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(), 75U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "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, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH waits for x seconds movement(s) on the DUT");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "2a: TH sends GoToLiftPercentage command with 25 percent to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 2500U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "2b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "3a: TH set a timeout of X minutes for failure");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "3b: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "3c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "3d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "4a: TH sends GoToLiftPercentage command with 75.20 percent to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 7520U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "4b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "4c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "5a: TH waits for x seconds movement(s) on the DUT");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "5b: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "5c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "5d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_2Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_2", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("fullMotionDuration", 0, UINT16_MAX, &mFullMotionDuration);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_2Suite() {}

    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> mFullMotionDuration;
    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), 3000U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(), 3000U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(), 30U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("targetPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("targetPositionTiltPercent100ths.Value()", value.Value(), 6005U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(), 6005U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(), 60U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "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, "1a: TH sends DownOrClose command to preposition the DUT in the opposite direction");
            VerifyOrDo(!ShouldSkip("WNCV.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::DownOrClose::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1b: TH waits for x seconds movement(s) on the DUT");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "1c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "2a: TH sends GoToTiltPercentage command with 30 percent to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 3000U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "2b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "2c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "3a: TH set a timeout of X minutes for failure");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "3b: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "4a: TH sends GoToTiltPercentage command with 60.05 percent to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 6005U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "4b: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "4c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "5a: TH waits for x seconds movement(s) on the DUT");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "5b: TH reads OperationalStatus attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::OperationalStatus::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "5c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "5d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_3Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_3", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_3Suite() {}

    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::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionLiftPercent100ths;

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                attrCurrentPositionLiftPercent100ths = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionLiftPercentage.Value()", value.Value(),
                                          static_cast<uint8_t>(attrCurrentPositionLiftPercent100ths.Value() / 100)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "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, "1a: If (PA_LF & LF) TH reads CurrentPositionLiftPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2,
                    "1b 1c: If (PA_LF & LF) TH reads CurrentPositionLiftPercentage from DUT + assert "
                    "CurrentPositionLiftPercent100ths/100 equals CurrentPositionLiftPercentage");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008 && WNCV.S.A000e"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercentage::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "2b: TH sends GoToLiftPercentage command with BadParam to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 12288U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "3a: TH sends GoToLiftPercentage command with 10001 to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 10001U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "4a: TH sends GoToLiftPercentage command with 0xFFFF to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 65535U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_4Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_4", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_4Suite() {}

    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::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionTiltPercent100ths;

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                attrCurrentPositionTiltPercent100ths = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercentage", value));
                VerifyOrReturn(CheckValue("currentPositionTiltPercentage.Value()", value.Value(),
                                          static_cast<uint8_t>(attrCurrentPositionTiltPercent100ths.Value() / 100)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "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, "1a: If (PA_TL & TL) TH reads CurrentPositionTiltPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2,
                    "1b 1c: If (PA_LF & LF) TH reads CurrentPositionTiltPercentage from DUT + assert "
                    "CurrentPositionTiltPercent100ths/100 equals CurrentPositionTiltPercentage");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f && WNCV.S.A0009"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercentage::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "2b: TH sends GoToTiltPercentage command with BadParam to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 12288U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "3a: TH sends GoToTiltPercentage command with 10001 to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 10001U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "4a: TH sends GoToTiltPercentage command with 0xFFFF to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 65535U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_5Suite : public TestCommand
{
public:
    Test_TC_WNCV_4_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_4_5", 17, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_4_5Suite() {}

    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::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionLiftPercent100ths;
    chip::app::DataModel::Nullable<chip::Percent100ths> attrCurrentPositionTiltPercent100ths;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
                attrCurrentPositionLiftPercent100ths = value;
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 0U));
                attrCurrentPositionTiltPercent100ths = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (attrCurrentPositionLiftPercent100ths.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("currentPositionLiftPercent100ths", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("currentPositionLiftPercent100ths", value));
                    VerifyOrReturn(CheckValue("currentPositionLiftPercent100ths.Value()", value.Value(),
                                              attrCurrentPositionLiftPercent100ths.Value()));
                }
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::Percent100ths> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (attrCurrentPositionTiltPercent100ths.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("currentPositionTiltPercent100ths", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("currentPositionTiltPercent100ths", value));
                    VerifyOrReturn(CheckValue("currentPositionTiltPercent100ths.Value()", value.Value(),
                                              attrCurrentPositionTiltPercent100ths.Value()));
                }
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "0a: 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, "0b: TH sends UpOrOpen command to preposition the DUT");
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::UpOrOpen::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "1a: If (PA_LF & LF) TH sends GoToLiftPercentage command with 90%% to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.C05.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToLiftPercentage::Type value;
            value.liftPercent100thsValue = 9000U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "1b: TH Waits for 100ms-1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "1c: TH sends StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "1d: TH Waits for 100ms-1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 500UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "2a: If (PA_TL & TL) TH sends GoToTiltPercentage command with 90%% to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.C08.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::GoToTiltPercentage::Type value;
            value.tiltPercent100thsValue = 9000U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id,
                               value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "2b: TH Waits for 100ms-1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "2c: TH sends StopMotion command to DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::WindowCovering::Commands::StopMotion::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "2d: TH Waits for 100ms-1s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 500UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "3a: TH reads CurrentPositionLiftPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "3b: TH reads CurrentPositionTiltPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "3c: reboot/restart the DUT");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Reboot target device(DUT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "3d: 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 15: {
            LogStep(15, "3e: TH reads CurrentPositionLiftPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "3f: TH reads CurrentPositionTiltPercent100ths from DUT");
            VerifyOrDo(!ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id,
                                 WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_TargetNavigatorClusterSuite : public TestCommand
{
public:
    TV_TargetNavigatorClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_TargetNavigatorCluster", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_TargetNavigatorClusterSuite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::TargetNavigator::Structs::TargetInfoStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("targetList", iter_0, 0));
                    VerifyOrReturn(CheckValue("targetList[0].identifier", iter_0.GetValue().identifier, 1U));
                    VerifyOrReturn(
                        CheckValueAsString("targetList[0].name", iter_0.GetValue().name, chip::CharSpan("exampleName", 11)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("targetList", iter_0, 1));
                    VerifyOrReturn(CheckValue("targetList[1].identifier", iter_0.GetValue().identifier, 2U));
                    VerifyOrReturn(
                        CheckValueAsString("targetList[1].name", iter_0.GetValue().name, chip::CharSpan("exampleName", 11)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("targetList", iter_0, 2));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentTarget", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            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;
        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, "Read attribute Target Navigator list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Attributes::TargetList::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute current navigator target");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id,
                                 TargetNavigator::Attributes::CurrentTarget::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Navigate Target Request Command");
            ListFreer listFreer;
            chip::app::Clusters::TargetNavigator::Commands::NavigateTarget::Type value;
            value.target = 1U;
            value.data.Emplace();
            value.data.Value() = chip::Span<const char>("1garbage: not in length on purpose", 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TargetNavigator::Id, TargetNavigator::Commands::NavigateTarget::Id,
                               value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_AudioOutputClusterSuite : public TestCommand
{
public:
    TV_AudioOutputClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_AudioOutputCluster", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_AudioOutputClusterSuite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 0));
                    VerifyOrReturn(CheckValue("outputList[0].index", iter_0.GetValue().index, 1U));
                    VerifyOrReturn(CheckValue("outputList[0].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[0].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 1));
                    VerifyOrReturn(CheckValue("outputList[1].index", iter_0.GetValue().index, 2U));
                    VerifyOrReturn(CheckValue("outputList[1].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[1].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 2));
                    VerifyOrReturn(CheckValue("outputList[2].index", iter_0.GetValue().index, 3U));
                    VerifyOrReturn(CheckValue("outputList[2].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[2].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("outputList", iter_0, 3));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentOutput", value, 1U));
            }
            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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 0));
                    VerifyOrReturn(CheckValue("outputList[0].index", iter_0.GetValue().index, 1U));
                    VerifyOrReturn(CheckValue("outputList[0].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(
                        CheckValueAsString("outputList[0].name", iter_0.GetValue().name, chip::CharSpan("HDMI Test", 9)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 1));
                    VerifyOrReturn(CheckValue("outputList[1].index", iter_0.GetValue().index, 2U));
                    VerifyOrReturn(CheckValue("outputList[1].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[1].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("outputList", iter_0, 2));
                    VerifyOrReturn(CheckValue("outputList[2].index", iter_0.GetValue().index, 3U));
                    VerifyOrReturn(CheckValue("outputList[2].outputType", iter_0.GetValue().outputType, 0U));
                    VerifyOrReturn(CheckValueAsString("outputList[2].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("outputList", iter_0, 3));
                }
            }
            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;
        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, "Read attribute Audio Output list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::OutputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute current audio output");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::CurrentOutput::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Select Output Command");
            ListFreer listFreer;
            chip::app::Clusters::AudioOutput::Commands::SelectOutput::Type value;
            value.index = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Commands::SelectOutput::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Rename Output Command");
            ListFreer listFreer;
            chip::app::Clusters::AudioOutput::Commands::RenameOutput::Type value;
            value.index = 1U;
            value.name  = chip::Span<const char>("HDMI Testgarbage: not in length on purpose", 9);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Commands::RenameOutput::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Read attribute Audio Output list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::OutputList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_ApplicationLauncherClusterSuite : public TestCommand
{
public:
    TV_ApplicationLauncherClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_ApplicationLauncherCluster", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_ApplicationLauncherClusterSuite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("catalogList", iter_0, 0));
                    VerifyOrReturn(CheckValue("catalogList[0]", iter_0.GetValue(), 123U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("catalogList", iter_0, 1));
                    VerifyOrReturn(CheckValue("catalogList[1]", iter_0.GetValue(), 456U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("catalogList", iter_0, 2));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<
                    chip::app::Clusters::ApplicationLauncher::Structs::ApplicationEPStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("currentApp", value));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char("data"), 4)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char("data"), 4)));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char("data"), 4)));
            }
            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;
        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, "Read attribute Application Launcher list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::CatalogList::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute application launcher app");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                                 ApplicationLauncher::Attributes::CurrentApp::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Launch App Command");
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::LaunchApp::Type value;
            value.application.Emplace();

            value.application.Value().catalogVendorID = 123U;
            value.application.Value().applicationID = chip::Span<const char>("applicationIdgarbage: not in length on purpose", 13);

            value.data.Emplace();
            value.data.Value() = chip::ByteSpan(chip::Uint8::from_const_char("datagarbage: not in length on purpose"), 4);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id,
                               ApplicationLauncher::Commands::LaunchApp::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Stop App Command");
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::StopApp::Type value;
            value.application.Emplace();

            value.application.Value().catalogVendorID = 123U;
            value.application.Value().applicationID = chip::Span<const char>("applicationIdgarbage: not in length on purpose", 13);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id, ApplicationLauncher::Commands::StopApp::Id,
                               value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Hide App Command");
            ListFreer listFreer;
            chip::app::Clusters::ApplicationLauncher::Commands::HideApp::Type value;
            value.application.Emplace();

            value.application.Value().catalogVendorID = 123U;
            value.application.Value().applicationID = chip::Span<const char>("applicationIdgarbage: not in length on purpose", 13);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ApplicationLauncher::Id, ApplicationLauncher::Commands::HideApp::Id,
                               value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_KeypadInputClusterSuite : public TestCommand
{
public:
    TV_KeypadInputClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_KeypadInputCluster", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_KeypadInputClusterSuite() {}

    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
    {
        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));
            {
                chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            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;
        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, "Send Key Command");
            ListFreer listFreer;
            chip::app::Clusters::KeypadInput::Commands::SendKey::Type value;
            value.keyCode = static_cast<chip::app::Clusters::KeypadInput::CecKeyCode>(3);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Commands::SendKey::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_AccountLoginClusterSuite : public TestCommand
{
public:
    TV_AccountLoginClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_AccountLoginCluster", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_AccountLoginClusterSuite() {}

    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
    {
        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));
            {
                chip::app::Clusters::AccountLogin::Commands::GetSetupPINResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("setupPIN", value.setupPIN, chip::CharSpan("tempPin123", 10)));
            }
            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;
        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;
        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, "Get Setup PIN Command");
            ListFreer listFreer;
            chip::app::Clusters::AccountLogin::Commands::GetSetupPIN::Type value;
            value.tempAccountIdentifier = chip::Span<const char>("asdfgarbage: not in length on purpose", 4);
            return SendCommand(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Commands::GetSetupPIN::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Login Command");
            ListFreer listFreer;
            chip::app::Clusters::AccountLogin::Commands::Login::Type value;
            value.tempAccountIdentifier = chip::Span<const char>("asdfgarbage: not in length on purpose", 4);
            value.setupPIN              = chip::Span<const char>("tempPin123garbage: not in length on purpose", 10);
            return SendCommand(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Commands::Login::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Logout Command");
            ListFreer listFreer;
            chip::app::Clusters::AccountLogin::Commands::Logout::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), AccountLogin::Id, AccountLogin::Commands::Logout::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_WakeOnLanClusterSuite : public TestCommand
{
public:
    TV_WakeOnLanClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_WakeOnLanCluster", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_WakeOnLanClusterSuite() {}

    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
    {
        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));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 3));
            }
            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;
        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, "Read mac address");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WakeOnLan::Id, WakeOnLan::Attributes::MACAddress::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_ApplicationBasicClusterSuite : public TestCommand
{
public:
    TV_ApplicationBasicClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_ApplicationBasicCluster", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_ApplicationBasicClusterSuite() {}

    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
    {
        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));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("vendorName", value, chip::CharSpan("exampleVendorName1", 18)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorID", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("applicationName", value, chip::CharSpan("exampleName1", 12)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("productID", value, 1U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ApplicationBasic::Structs::ApplicationStruct::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("application.catalogVendorID", value.catalogVendorID, 123U));
                VerifyOrReturn(
                    CheckValueAsString("application.applicationID", value.applicationID, chip::CharSpan("applicationId", 13)));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("applicationVersion", value, chip::CharSpan("exampleVersion", 14)));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::VendorId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("allowedVendorList", iter_0, 0));
                    VerifyOrReturn(CheckValue("allowedVendorList[0]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("allowedVendorList", iter_0, 1));
                    VerifyOrReturn(CheckValue("allowedVendorList[1]", iter_0.GetValue(), 456U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("allowedVendorList", iter_0, 2));
                }
            }
            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;
        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, "Read attribute vendor name");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::VendorName::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute vendor id");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::VendorID::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute application name");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ApplicationName::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read attribute product id");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::ProductID::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read attribute application status");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::Status::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read attribute application status");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::Application::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read attribute application version");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::ApplicationVersion::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute application allowed vendor list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id,
                                 ApplicationBasic::Attributes::AllowedVendorList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_MediaPlaybackClusterSuite : public TestCommand
{
public:
    TV_MediaPlaybackClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_MediaPlaybackCluster", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_MediaPlaybackClusterSuite() {}

    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
    {
        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));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", value, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("startTime", value));
                VerifyOrReturn(CheckValue("startTime.Value()", value.Value(), 0ULL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("duration", value));
                VerifyOrReturn(CheckValue("duration.Value()", value.Value(), 80000ULL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValue("sampledPosition.Value().updatedAt", value.Value().updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 0ULL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 0.0f));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("seekRangeEnd", value));
                VerifyOrReturn(CheckValue("seekRangeEnd.Value()", value.Value(), 80000ULL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("seekRangeStart", value));
                VerifyOrReturn(CheckValue("seekRangeStart.Value()", value.Value(), 0ULL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValue("sampledPosition.Value().updatedAt", value.Value().updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 500ULL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValue("sampledPosition.Value().updatedAt", value.Value().updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 400ULL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("sampledPosition", value));
                VerifyOrReturn(CheckValue("sampledPosition.Value().updatedAt", value.Value().updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("sampledPosition.Value().position", value.Value().position));
                VerifyOrReturn(CheckValue("sampledPosition.Value().position.Value()", value.Value().position.Value(), 1000ULL));
            }
            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;
        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, "Read attribute playback state");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::CurrentState::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute start time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::StartTime::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute duration");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::Duration::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read attribute position");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read attribute playback speed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::PlaybackSpeed::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read attribute seek range end");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SeekRangeEnd::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read attribute seek range start");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SeekRangeStart::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Media Playback Play Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Play::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Play::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Media Playback Pause Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Pause::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Pause::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Media Playback Stop Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Stop::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Stop::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Media Playback Start Over Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::StartOver::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::StartOver::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Media Playback Previous Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Previous::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Previous::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Media Playback Next Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Next::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Next::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Media Playback Rewind Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Rewind::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Rewind::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Media Playback Fast Forward Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::FastForward::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::FastForward::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Media Playback Skip Forward Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::SkipForward::Type value;
            value.deltaPositionMilliseconds = 500ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::SkipForward::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Read attribute position after skip forward");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Media Playback Skip Backward Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::SkipBackward::Type value;
            value.deltaPositionMilliseconds = 100ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::SkipBackward::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read attribute position after skip backward");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Media Playback Seek Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaPlayback::Commands::Seek::Type value;
            value.position = 1000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Commands::Seek::Id, value,
                               chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Read attribute position after seek");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), MediaPlayback::Id, MediaPlayback::Attributes::SampledPosition::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_ChannelClusterSuite : public TestCommand
{
public:
    TV_ChannelClusterSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TV_ChannelCluster", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_ChannelClusterSuite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("channelList", iter_0, 0));
                    VerifyOrReturn(CheckValue("channelList[0].majorNumber", iter_0.GetValue().majorNumber, 6U));
                    VerifyOrReturn(CheckValue("channelList[0].minorNumber", iter_0.GetValue().minorNumber, 0U));
                    VerifyOrReturn(CheckValuePresent("channelList[0].name", iter_0.GetValue().name));
                    VerifyOrReturn(CheckValueAsString("channelList[0].name.Value()", iter_0.GetValue().name.Value(),
                                                      chip::CharSpan("ABC", 3)));
                    VerifyOrReturn(CheckValuePresent("channelList[0].callSign", iter_0.GetValue().callSign));
                    VerifyOrReturn(CheckValueAsString("channelList[0].callSign.Value()", iter_0.GetValue().callSign.Value(),
                                                      chip::CharSpan("KAAL-TV", 7)));
                    VerifyOrReturn(CheckValuePresent("channelList[0].affiliateCallSign", iter_0.GetValue().affiliateCallSign));
                    VerifyOrReturn(CheckValueAsString("channelList[0].affiliateCallSign.Value()",
                                                      iter_0.GetValue().affiliateCallSign.Value(), chip::CharSpan("KAAL", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("channelList", iter_0, 1));
                    VerifyOrReturn(CheckValue("channelList[1].majorNumber", iter_0.GetValue().majorNumber, 9U));
                    VerifyOrReturn(CheckValue("channelList[1].minorNumber", iter_0.GetValue().minorNumber, 1U));
                    VerifyOrReturn(CheckValuePresent("channelList[1].name", iter_0.GetValue().name));
                    VerifyOrReturn(CheckValueAsString("channelList[1].name.Value()", iter_0.GetValue().name.Value(),
                                                      chip::CharSpan("PBS", 3)));
                    VerifyOrReturn(CheckValuePresent("channelList[1].callSign", iter_0.GetValue().callSign));
                    VerifyOrReturn(CheckValueAsString("channelList[1].callSign.Value()", iter_0.GetValue().callSign.Value(),
                                                      chip::CharSpan("KCTS-TV", 7)));
                    VerifyOrReturn(CheckValuePresent("channelList[1].affiliateCallSign", iter_0.GetValue().affiliateCallSign));
                    VerifyOrReturn(CheckValueAsString("channelList[1].affiliateCallSign.Value()",
                                                      iter_0.GetValue().affiliateCallSign.Value(), chip::CharSpan("KCTS", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("channelList", iter_0, 2));
                    VerifyOrReturn(CheckValue("channelList[2].majorNumber", iter_0.GetValue().majorNumber, 9U));
                    VerifyOrReturn(CheckValue("channelList[2].minorNumber", iter_0.GetValue().minorNumber, 2U));
                    VerifyOrReturn(CheckValuePresent("channelList[2].name", iter_0.GetValue().name));
                    VerifyOrReturn(CheckValueAsString("channelList[2].name.Value()", iter_0.GetValue().name.Value(),
                                                      chip::CharSpan("PBS Kids", 8)));
                    VerifyOrReturn(CheckValuePresent("channelList[2].callSign", iter_0.GetValue().callSign));
                    VerifyOrReturn(CheckValueAsString("channelList[2].callSign.Value()", iter_0.GetValue().callSign.Value(),
                                                      chip::CharSpan("KCTS-TV", 7)));
                    VerifyOrReturn(CheckValuePresent("channelList[2].affiliateCallSign", iter_0.GetValue().affiliateCallSign));
                    VerifyOrReturn(CheckValueAsString("channelList[2].affiliateCallSign.Value()",
                                                      iter_0.GetValue().affiliateCallSign.Value(), chip::CharSpan("KCTS", 4)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("channelList", iter_0, 3));
                    VerifyOrReturn(CheckValue("channelList[3].majorNumber", iter_0.GetValue().majorNumber, 9U));
                    VerifyOrReturn(CheckValue("channelList[3].minorNumber", iter_0.GetValue().minorNumber, 3U));
                    VerifyOrReturn(CheckValuePresent("channelList[3].name", iter_0.GetValue().name));
                    VerifyOrReturn(CheckValueAsString("channelList[3].name.Value()", iter_0.GetValue().name.Value(),
                                                      chip::CharSpan("World Channel", 13)));
                    VerifyOrReturn(CheckValuePresent("channelList[3].callSign", iter_0.GetValue().callSign));
                    VerifyOrReturn(CheckValueAsString("channelList[3].callSign.Value()", iter_0.GetValue().callSign.Value(),
                                                      chip::CharSpan("KCTS-TV", 7)));
                    VerifyOrReturn(CheckValuePresent("channelList[3].affiliateCallSign", iter_0.GetValue().affiliateCallSign));
                    VerifyOrReturn(CheckValueAsString("channelList[3].affiliateCallSign.Value()",
                                                      iter_0.GetValue().affiliateCallSign.Value(), chip::CharSpan("KCTS", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("channelList", iter_0, 4));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::LineupInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lineup", value));
                VerifyOrReturn(
                    CheckValueAsString("lineup.Value().operatorName", value.Value().operatorName, chip::CharSpan("Comcast", 7)));
                VerifyOrReturn(CheckValuePresent("lineup.Value().lineupName", value.Value().lineupName));
                VerifyOrReturn(CheckValueAsString("lineup.Value().lineupName.Value()", value.Value().lineupName.Value(),
                                                  chip::CharSpan("Comcast King County", 19)));
                VerifyOrReturn(CheckValuePresent("lineup.Value().postalCode", value.Value().postalCode));
                VerifyOrReturn(CheckValueAsString("lineup.Value().postalCode.Value()", value.Value().postalCode.Value(),
                                                  chip::CharSpan("98052", 5)));
                VerifyOrReturn(CheckValue("lineup.Value().lineupInfoType", value.Value().lineupInfoType, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentChannel", value));
                VerifyOrReturn(CheckValue("currentChannel.Value().majorNumber", value.Value().majorNumber, 6U));
                VerifyOrReturn(CheckValue("currentChannel.Value().minorNumber", value.Value().minorNumber, 0U));
                VerifyOrReturn(CheckValuePresent("currentChannel.Value().name", value.Value().name));
                VerifyOrReturn(CheckValueAsString("currentChannel.Value().name.Value()", value.Value().name.Value(),
                                                  chip::CharSpan("ABC", 3)));
                VerifyOrReturn(CheckValuePresent("currentChannel.Value().callSign", value.Value().callSign));
                VerifyOrReturn(CheckValueAsString("currentChannel.Value().callSign.Value()", value.Value().callSign.Value(),
                                                  chip::CharSpan("KAAL-TV", 7)));
                VerifyOrReturn(CheckValuePresent("currentChannel.Value().affiliateCallSign", value.Value().affiliateCallSign));
                VerifyOrReturn(CheckValueAsString("currentChannel.Value().affiliateCallSign.Value()",
                                                  value.Value().affiliateCallSign.Value(), chip::CharSpan("KAAL", 4)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Channel::Commands::ChangeChannelResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("data response", 13)));
            }
            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;
        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;
        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, "Read attribute Channel list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::ChannelList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute channel lineup");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::Lineup::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute current channel");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::CurrentChannel::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Change Channel Command");
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::ChangeChannel::Type value;
            value.match = chip::Span<const char>("PBSgarbage: not in length on purpose", 3);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::ChangeChannel::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Change Channel By Number Command");
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::ChangeChannelByNumber::Type value;
            value.majorNumber = 6U;
            value.minorNumber = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::ChangeChannelByNumber::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Skip Channel Command");
            ListFreer listFreer;
            chip::app::Clusters::Channel::Commands::SkipChannel::Type value;
            value.count = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Commands::SkipChannel::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_LowPowerClusterSuite : public TestCommand
{
public:
    TV_LowPowerClusterSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TV_LowPowerCluster", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_LowPowerClusterSuite() {}

    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
    {
        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;
        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;
        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, "Sleep Input Status Command");
            ListFreer listFreer;
            chip::app::Clusters::LowPower::Commands::Sleep::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LowPower::Id, LowPower::Commands::Sleep::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_ContentLauncherClusterSuite : public TestCommand
{
public:
    TV_ContentLauncherClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_ContentLauncherCluster", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_ContentLauncherClusterSuite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptHeader", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("acceptHeader[0]", iter_0.GetValue(), chip::CharSpan("example", 7)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptHeader", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("acceptHeader[1]", iter_0.GetValue(), chip::CharSpan("example", 7)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptHeader", iter_0, 2));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("supportedStreamingProtocols", value, 0UL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ContentLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("exampleData", 11)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::ContentLauncher::Commands::LauncherResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("data", value.data));
                VerifyOrReturn(CheckValueAsString("data.Value()", value.data.Value(), chip::CharSpan("exampleData", 11)));
            }
            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;
        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, "Read attribute accept header list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Attributes::AcceptHeader::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute supported streaming protocols");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::SupportedStreamingProtocols::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Launch Content Command");
            ListFreer listFreer;
            chip::app::Clusters::ContentLauncher::Commands::LaunchContent::Type value;

            {
                auto * listHolder_1 = new ListHolder<chip::app::Clusters::ContentLauncher::Structs::ParameterStruct::Type>(1);
                listFreer.add(listHolder_1);

                listHolder_1->mList[0].type  = static_cast<chip::app::Clusters::ContentLauncher::ParameterEnum>(1);
                listHolder_1->mList[0].value = chip::Span<const char>("exampleValuegarbage: not in length on purpose", 12);
                listHolder_1->mList[0].externalIDList.Emplace();

                {
                    auto * listHolder_4 =
                        new ListHolder<chip::app::Clusters::ContentLauncher::Structs::AdditionalInfoStruct::Type>(1);
                    listFreer.add(listHolder_4);

                    listHolder_4->mList[0].name  = chip::Span<const char>("namegarbage: not in length on purpose", 4);
                    listHolder_4->mList[0].value = chip::Span<const char>("valuegarbage: not in length on purpose", 5);

                    listHolder_1->mList[0].externalIDList.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::ContentLauncher::Structs::AdditionalInfoStruct::Type>(
                            listHolder_4->mList, 1);
                }

                value.search.parameterList =
                    chip::app::DataModel::List<chip::app::Clusters::ContentLauncher::Structs::ParameterStruct::Type>(
                        listHolder_1->mList, 1);
            }

            value.autoPlay = true;
            value.data.Emplace();
            value.data.Value() = chip::Span<const char>("exampleDatagarbage: not in length on purpose", 11);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Commands::LaunchContent::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Launch URL Command");
            ListFreer listFreer;
            chip::app::Clusters::ContentLauncher::Commands::LaunchURL::Type value;
            value.contentURL = chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.displayString.Emplace();
            value.displayString.Value() = chip::Span<const char>("exampleDisplayStringgarbage: not in length on purpose", 20);
            value.brandingInformation.Emplace();

            value.brandingInformation.Value().providerName =
                chip::Span<const char>("exampleNamegarbage: not in length on purpose", 11);
            value.brandingInformation.Value().background.Emplace();

            value.brandingInformation.Value().background.Value().imageURL.Emplace();
            value.brandingInformation.Value().background.Value().imageURL.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().background.Value().color.Emplace();
            value.brandingInformation.Value().background.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().background.Value().size.Emplace();

            value.brandingInformation.Value().background.Value().size.Value().width  = 0;
            value.brandingInformation.Value().background.Value().size.Value().height = 0;
            value.brandingInformation.Value().background.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            value.brandingInformation.Value().logo.Emplace();

            value.brandingInformation.Value().logo.Value().imageURL.Emplace();
            value.brandingInformation.Value().logo.Value().imageURL.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().logo.Value().color.Emplace();
            value.brandingInformation.Value().logo.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().logo.Value().size.Emplace();

            value.brandingInformation.Value().logo.Value().size.Value().width  = 0;
            value.brandingInformation.Value().logo.Value().size.Value().height = 0;
            value.brandingInformation.Value().logo.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            value.brandingInformation.Value().progressBar.Emplace();

            value.brandingInformation.Value().progressBar.Value().imageURL.Emplace();
            value.brandingInformation.Value().progressBar.Value().imageURL.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().progressBar.Value().color.Emplace();
            value.brandingInformation.Value().progressBar.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().progressBar.Value().size.Emplace();

            value.brandingInformation.Value().progressBar.Value().size.Value().width  = 0;
            value.brandingInformation.Value().progressBar.Value().size.Value().height = 0;
            value.brandingInformation.Value().progressBar.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            value.brandingInformation.Value().splash.Emplace();

            value.brandingInformation.Value().splash.Value().imageURL.Emplace();
            value.brandingInformation.Value().splash.Value().imageURL.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().splash.Value().color.Emplace();
            value.brandingInformation.Value().splash.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().splash.Value().size.Emplace();

            value.brandingInformation.Value().splash.Value().size.Value().width  = 0;
            value.brandingInformation.Value().splash.Value().size.Value().height = 0;
            value.brandingInformation.Value().splash.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            value.brandingInformation.Value().waterMark.Emplace();

            value.brandingInformation.Value().waterMark.Value().imageURL.Emplace();
            value.brandingInformation.Value().waterMark.Value().imageURL.Value() =
                chip::Span<const char>("exampleUrlgarbage: not in length on purpose", 10);
            value.brandingInformation.Value().waterMark.Value().color.Emplace();
            value.brandingInformation.Value().waterMark.Value().color.Value() =
                chip::Span<const char>("exampleColorgarbage: not in length on purpose", 12);
            value.brandingInformation.Value().waterMark.Value().size.Emplace();

            value.brandingInformation.Value().waterMark.Value().size.Value().width  = 0;
            value.brandingInformation.Value().waterMark.Value().size.Value().height = 0;
            value.brandingInformation.Value().waterMark.Value().size.Value().metric =
                static_cast<chip::app::Clusters::ContentLauncher::MetricTypeEnum>(0);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id, ContentLauncher::Commands::LaunchURL::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TV_MediaInputClusterSuite : public TestCommand
{
public:
    TV_MediaInputClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TV_MediaInputCluster", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TV_MediaInputClusterSuite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("inputList", iter_0, 0));
                    VerifyOrReturn(CheckValue("inputList[0].index", iter_0.GetValue().index, 1U));
                    VerifyOrReturn(CheckValue("inputList[0].inputType", iter_0.GetValue().inputType, 4U));
                    VerifyOrReturn(CheckValueAsString("inputList[0].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckValueAsString("inputList[0].description", iter_0.GetValue().description,
                                                      chip::CharSpan("High-Definition Multimedia Interface", 36)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("inputList", iter_0, 1));
                    VerifyOrReturn(CheckValue("inputList[1].index", iter_0.GetValue().index, 2U));
                    VerifyOrReturn(CheckValue("inputList[1].inputType", iter_0.GetValue().inputType, 4U));
                    VerifyOrReturn(CheckValueAsString("inputList[1].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckValueAsString("inputList[1].description", iter_0.GetValue().description,
                                                      chip::CharSpan("High-Definition Multimedia Interface", 36)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("inputList", iter_0, 2));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentInput", value, 1U));
            }
            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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("inputList", iter_0, 0));
                    VerifyOrReturn(CheckValue("inputList[0].index", iter_0.GetValue().index, 1U));
                    VerifyOrReturn(CheckValue("inputList[0].inputType", iter_0.GetValue().inputType, 4U));
                    VerifyOrReturn(CheckValueAsString("inputList[0].name", iter_0.GetValue().name, chip::CharSpan("HDMI Test", 9)));
                    VerifyOrReturn(CheckValueAsString("inputList[0].description", iter_0.GetValue().description,
                                                      chip::CharSpan("High-Definition Multimedia Interface", 36)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("inputList", iter_0, 1));
                    VerifyOrReturn(CheckValue("inputList[1].index", iter_0.GetValue().index, 2U));
                    VerifyOrReturn(CheckValue("inputList[1].inputType", iter_0.GetValue().inputType, 4U));
                    VerifyOrReturn(CheckValueAsString("inputList[1].name", iter_0.GetValue().name, chip::CharSpan("HDMI", 4)));
                    VerifyOrReturn(CheckValueAsString("inputList[1].description", iter_0.GetValue().description,
                                                      chip::CharSpan("High-Definition Multimedia Interface", 36)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("inputList", iter_0, 2));
                }
            }
            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;
        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, "Read attribute media input list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read current media input");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::CurrentInput::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Select Input Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::SelectInput::Type value;
            value.index = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::SelectInput::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Hide Input Status Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::HideInputStatus::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::HideInputStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Show Input Status Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::ShowInputStatus::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::ShowInputStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Rename Input Command");
            ListFreer listFreer;
            chip::app::Clusters::MediaInput::Commands::RenameInput::Type value;
            value.index = 1U;
            value.name  = chip::Span<const char>("HDMI Testgarbage: not in length on purpose", 9);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Commands::RenameInput::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Read attribute media input list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::InputList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestCASERecoverySuite : public TestCommand
{
public:
    TestCASERecoverySuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestCASERecovery", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestCASERecoverySuite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("dataModelRevision", value, 1U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("dataModelRevision", value, 1U));
            }
            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;
        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, "Read an attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::DataModelRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reboot the server");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Re-get our session, but without expiring sesssions");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.expireExistingSession.Emplace();
            value.expireExistingSession.Value() = false;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Read an attribute again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::DataModelRevision::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Re-get our session, but without expiring sesssions");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.expireExistingSession.Emplace();
            value.expireExistingSession.Value() = false;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Read an attribute a third time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::DataModelRevision::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestClusterSuite : public TestCommand
{
public:
    TestClusterSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestCluster", 491, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestClusterSuite()
    {
        if (nullableOctetStrTestValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(nullableOctetStrTestValueBuffer);
            nullableOctetStrTestValueBuffer = nullptr;
        }
        if (nullableCharStringSaveBuffer != nullptr)
        {
            chip::Platform::MemoryFree(nullableCharStringSaveBuffer);
            nullableCharStringSaveBuffer = nullptr;
        }
    }

    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::app::DataModel::Nullable<bool> booValueNull;
    chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> nullableValue254;
    chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> nullableEnumAttr3;
    uint8_t * nullableOctetStrTestValueBuffer = nullptr;
    chip::app::DataModel::Nullable<chip::ByteSpan> nullableOctetStrTestValue;
    char * nullableCharStringSaveBuffer = nullptr;
    chip::app::DataModel::Nullable<chip::CharSpan> nullableCharStringSave;

    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
    {
        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), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestSpecificResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, 7U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, 20U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, 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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, 1));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, 0));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, 0U));
            }
            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::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, 255U));
            }
            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::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, 0U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, 0U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, 65535U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, 0U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 0UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 4294967295UL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 0UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, 0ULL));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, 18446744073709551615ULL));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, 0ULL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, 0U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, 255U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, 0U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, 0U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, 65535U));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, 0U));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, 0UL));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, 4294967295UL));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, 0UL));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, 0ULL));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, 18446744073709551615ULL));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, 0ULL));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, 0));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, 127));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, -128));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, 0));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, 0));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, 32767));
            }
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, -32768));
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, 0));
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, 0L));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, 2147483647L));
            }
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, -2147483648L));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, 0L));
            }
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, 0LL));
            }
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, 9223372036854775807LL));
            }
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, -9223372036854775807LL));
            }
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, 0LL));
            }
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 0.0f));
            }
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 0.1f));
            }
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 17000000000.0f));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 1.7e-10f));
            }
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatSingle", value, 0.0f));
            }
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 0));
            }
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 0.1234567890123));
            }
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 1.7e+200));
            }
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 1.7e-200));
            }
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                double value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("floatDouble", value, 0));
            }
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, 0U));
            }
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, 255U));
            }
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, 0U));
            }
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, 0U));
            }
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, 65535U));
            }
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, 0U));
            }
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
            }
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("Tes\000ti\000ng"), 9)));
            }
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value,
                                                  chip::ByteSpan(chip::Uint8::from_const_char("\x00\x01\x02\x03\x04\x05"), 6)));
            }
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value,
                                                  chip::ByteSpan(chip::Uint8::from_const_char("\x0d\x0a\xff\x22\xa0"), 5)));
            }
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("TestValue"), 9)));
            }
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("TestValue"), 9)));
            }
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("longOctetString", value, chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
            }
            break;
        case 120:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 121:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString(
                    "longOctetString", value,
                    chip::ByteSpan(
                        chip::Uint8::from_const_char(
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"),
                        300)));
            }
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("", 0)));
            }
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("☉T☉", 7)));
            }
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 127:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("☉T☉", 7)));
            }
            break;
        case 128:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 129:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("longCharString", value, chip::CharSpan("", 0)));
            }
            break;
        case 130:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 131:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString(
                    "longCharString", value,
                    chip::CharSpan(
                        "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                        "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                        "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉",
                        900)));
            }
            break;
        case 132:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 133:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[0]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[1]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[2]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 3));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[3]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listLongOctetString", iter_0, 4));
                }
            }
            break;
        case 134:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 135:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[0]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[1]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[2]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 3));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[3]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listLongOctetString", iter_0, 4));
                    VerifyOrReturn(CheckValueAsString(
                        "listLongOctetString[4]", iter_0.GetValue(),
                        chip::ByteSpan(chip::Uint8::from_const_char(
                                           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
                                           "789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                                           "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
                                           "56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                           "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012"
                                           "3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
                                       512)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listLongOctetString", iter_0, 5));
                }
            }
            break;
        case 136:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 137:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, 0ULL));
            }
            break;
        case 138:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 139:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, 18446744073709551615ULL));
            }
            break;
        case 140:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 141:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, 0ULL));
            }
            break;
        case 142:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, 0UL));
            }
            break;
        case 143:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 144:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, 4294967295UL));
            }
            break;
        case 145:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 146:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, 0UL));
            }
            break;
        case 147:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE));
            break;
        case 148:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE));
            break;
        case 149:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            break;
        case 150:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            break;
        case 151:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value, 0U));
            }
            break;
        case 152:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 153:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value, 17U));
            }
            break;
        case 154:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 155:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestEnumsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("arg1", value.arg1, 20003U));
                VerifyOrReturn(CheckValue("arg2", value.arg2, 1U));
            }
            break;
        case 156:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 157:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 158:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 159:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 160:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 161:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 162:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 163:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::SimpleStructResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("arg1.a", value.arg1.a, 17U));
                VerifyOrReturn(CheckValue("arg1.b", value.arg1.b, false));
                VerifyOrReturn(CheckValue("arg1.c", value.arg1.c, 2U));
                VerifyOrReturn(
                    CheckValueAsString("arg1.d", value.arg1.d, chip::ByteSpan(chip::Uint8::from_const_char("octet_string"), 12)));
                VerifyOrReturn(CheckValueAsString("arg1.e", value.arg1.e, chip::CharSpan("char_string", 11)));
                VerifyOrReturn(CheckValue("arg1.f", value.arg1.f, 1U));
                VerifyOrReturn(CheckValue("arg1.g", value.arg1.g, 0.1f));
                VerifyOrReturn(CheckValue("arg1.h", value.arg1.h, 0.1));
            }
            break;
        case 164:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 165:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 166:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.arg1.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 0));
                    VerifyOrReturn(CheckValue("arg1[0]", iter_0.GetValue(), 9U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 1));
                    VerifyOrReturn(CheckValue("arg1[1]", iter_0.GetValue(), 8U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 2));
                    VerifyOrReturn(CheckValue("arg1[2]", iter_0.GetValue(), 7U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 3));
                    VerifyOrReturn(CheckValue("arg1[3]", iter_0.GetValue(), 6U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 4));
                    VerifyOrReturn(CheckValue("arg1[4]", iter_0.GetValue(), 5U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 5));
                    VerifyOrReturn(CheckValue("arg1[5]", iter_0.GetValue(), 4U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 6));
                    VerifyOrReturn(CheckValue("arg1[6]", iter_0.GetValue(), 3U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 7));
                    VerifyOrReturn(CheckValue("arg1[7]", iter_0.GetValue(), 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.arg1)>("arg1", iter_0, 8));
                    VerifyOrReturn(CheckValue("arg1[8]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.arg1)>("arg1", iter_0, 9));
                }
            }
            break;
        case 167:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.arg1.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.arg1)>("arg1", iter_0, 0));
                }
            }
            break;
        case 168:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 169:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 170:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, true));
            }
            break;
        case 171:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::BooleanResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, false));
            }
            break;
        case 172:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 173:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 0));
                    VerifyOrReturn(CheckValue("listInt8u[0]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 1));
                    VerifyOrReturn(CheckValue("listInt8u[1]", iter_0.GetValue(), 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 2));
                    VerifyOrReturn(CheckValue("listInt8u[2]", iter_0.GetValue(), 3U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 3));
                    VerifyOrReturn(CheckValue("listInt8u[3]", iter_0.GetValue(), 4U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listInt8u", iter_0, 4));
                }
            }
            break;
        case 174:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 175:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listOctetString", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("listOctetString[0]", iter_0.GetValue(),
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test0"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listOctetString", iter_0, 1));
                    VerifyOrReturn(CheckValueAsString("listOctetString[1]", iter_0.GetValue(),
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test1"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listOctetString", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("listOctetString[2]", iter_0.GetValue(),
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test2"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listOctetString", iter_0, 3));
                    VerifyOrReturn(CheckValueAsString("listOctetString[3]", iter_0.GetValue(),
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test3"), 5)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listOctetString", iter_0, 4));
                }
            }
            break;
        case 176:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 177:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listStructOctetString", iter_0, 0));
                    VerifyOrReturn(CheckValue("listStructOctetString[0].member1", iter_0.GetValue().member1, 0ULL));
                    VerifyOrReturn(CheckValueAsString("listStructOctetString[0].member2", iter_0.GetValue().member2,
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test0"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listStructOctetString", iter_0, 1));
                    VerifyOrReturn(CheckValue("listStructOctetString[1].member1", iter_0.GetValue().member1, 1ULL));
                    VerifyOrReturn(CheckValueAsString("listStructOctetString[1].member2", iter_0.GetValue().member2,
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test1"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listStructOctetString", iter_0, 2));
                    VerifyOrReturn(CheckValue("listStructOctetString[2].member1", iter_0.GetValue().member1, 2ULL));
                    VerifyOrReturn(CheckValueAsString("listStructOctetString[2].member2", iter_0.GetValue().member2,
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test2"), 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listStructOctetString", iter_0, 3));
                    VerifyOrReturn(CheckValue("listStructOctetString[3].member1", iter_0.GetValue().member1, 3ULL));
                    VerifyOrReturn(CheckValueAsString("listStructOctetString[3].member2", iter_0.GetValue().member2,
                                                      chip::ByteSpan(chip::Uint8::from_const_char("Test3"), 5)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listStructOctetString", iter_0, 4));
                }
            }
            break;
        case 178:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("wasPresent", value.wasPresent, true));
                VerifyOrReturn(CheckValuePresent("wasNull", value.wasNull));
                VerifyOrReturn(CheckValue("wasNull.Value()", value.wasNull.Value(), false));
                VerifyOrReturn(CheckValuePresent("value", value.value));
                VerifyOrReturn(CheckValue("value.Value()", value.value.Value(), 5U));
                VerifyOrReturn(CheckValuePresent("originalValue", value.originalValue));
                VerifyOrReturn(CheckValueNonNull("originalValue.Value()", value.originalValue.Value()));
                VerifyOrReturn(CheckValue("originalValue.Value().Value()", value.originalValue.Value().Value(), 5U));
            }
            break;
        case 179:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("wasPresent", value.wasPresent, false));
            }
            break;
        case 180:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listNullablesAndOptionalsStruct", iter_0, 0));
                    VerifyOrReturn(CheckValueNull("listNullablesAndOptionalsStruct[0].nullableInt", iter_0.GetValue().nullableInt));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableString", iter_0.GetValue().nullableString));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableStruct", iter_0.GetValue().nullableStruct));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableList", iter_0.GetValue().nullableList));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listNullablesAndOptionalsStruct", iter_0, 1));
                }
            }
            break;
        case 181:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 182:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listNullablesAndOptionalsStruct", iter_0, 0));
                    VerifyOrReturn(CheckValueNull("listNullablesAndOptionalsStruct[0].nullableInt", iter_0.GetValue().nullableInt));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableString", iter_0.GetValue().nullableString));
                    VerifyOrReturn(
                        CheckValueNull("listNullablesAndOptionalsStruct[0].nullableStruct", iter_0.GetValue().nullableStruct));
                    VerifyOrReturn(
                        CheckValueNonNull("listNullablesAndOptionalsStruct[0].nullableList", iter_0.GetValue().nullableList));
                    {
                        auto iter_3 = iter_0.GetValue().nullableList.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().nullableList.Value())>(
                            "listNullablesAndOptionalsStruct[0].nullableList.Value()", iter_3, 0));
                        VerifyOrReturn(
                            CheckValue("listNullablesAndOptionalsStruct[0].nullableList.Value()[0]", iter_3.GetValue(), 1U));
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().nullableList.Value())>(
                            "listNullablesAndOptionalsStruct[0].nullableList.Value()", iter_3, 1));
                        VerifyOrReturn(
                            CheckValue("listNullablesAndOptionalsStruct[0].nullableList.Value()[1]", iter_3.GetValue(), 2U));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().nullableList.Value())>(
                            "listNullablesAndOptionalsStruct[0].nullableList.Value()", iter_3, 2));
                    }
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listNullablesAndOptionalsStruct", iter_0, 1));
                }
            }
            break;
        case 183:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 184:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBoolean", value));
                booValueNull = value;
            }
            break;
        case 185:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 186:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBoolean", value));
                VerifyOrReturn(CheckValue("nullableBoolean.Value()", value.Value(), true));
            }
            break;
        case 187:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<bool> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, booValueNull));
            }
            break;
        case 188:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 189:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap8", value));
                VerifyOrReturn(CheckValue("nullableBitmap8.Value()", value.Value(), 254U));
            }
            break;
        case 190:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 191:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap8", value));
                VerifyOrReturn(CheckValue("nullableBitmap8.Value()", value.Value(), 254U));
                nullableValue254 = value;
            }
            break;
        case 192:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 193:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBitmap8", value));
            }
            break;
        case 194:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, nullableValue254));
            }
            break;
        case 195:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 196:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap16", value));
                VerifyOrReturn(CheckValue("nullableBitmap16.Value()", value.Value(), 65534U));
            }
            break;
        case 197:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 198:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap16", value));
                VerifyOrReturn(CheckValue("nullableBitmap16.Value()", value.Value(), 65534U));
            }
            break;
        case 199:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 200:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBitmap16", value));
            }
            break;
        case 201:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 202:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap32", value));
                VerifyOrReturn(CheckValue("nullableBitmap32.Value()", value.Value(), 4294967294UL));
            }
            break;
        case 203:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 204:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap32", value));
                VerifyOrReturn(CheckValue("nullableBitmap32.Value()", value.Value(), 4294967294UL));
            }
            break;
        case 205:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 206:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBitmap32", value));
            }
            break;
        case 207:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 208:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap64", value));
                VerifyOrReturn(CheckValue("nullableBitmap64.Value()", value.Value(), 18446744073709551614ULL));
            }
            break;
        case 209:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 210:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableBitmap64", value));
                VerifyOrReturn(CheckValue("nullableBitmap64.Value()", value.Value(), 18446744073709551614ULL));
            }
            break;
        case 211:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 212:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableBitmap64", value));
            }
            break;
        case 213:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 214:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8u", value));
                VerifyOrReturn(CheckValue("nullableInt8u.Value()", value.Value(), 0U));
            }
            break;
        case 215:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 216:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8u", value));
                VerifyOrReturn(CheckValue("nullableInt8u.Value()", value.Value(), 254U));
            }
            break;
        case 217:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 218:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8u", value));
                VerifyOrReturn(CheckValue("nullableInt8u.Value()", value.Value(), 254U));
            }
            break;
        case 219:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("value", value));
            }
            break;
        case 220:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 221:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt8u", value));
            }
            break;
        case 222:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 223:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 254U));
            }
            break;
        case 224:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 225:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 254U));
            }
            break;
        case 226:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 129U));
            }
            break;
        case 227:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 228:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16u", value));
                VerifyOrReturn(CheckValue("nullableInt16u.Value()", value.Value(), 0U));
            }
            break;
        case 229:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 230:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16u", value));
                VerifyOrReturn(CheckValue("nullableInt16u.Value()", value.Value(), 65534U));
            }
            break;
        case 231:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 232:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16u", value));
                VerifyOrReturn(CheckValue("nullableInt16u.Value()", value.Value(), 65534U));
            }
            break;
        case 233:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 234:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt16u", value));
            }
            break;
        case 235:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 236:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 65534U));
            }
            break;
        case 237:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 238:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
            }
            break;
        case 239:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 32001U));
            }
            break;
        case 240:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 241:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32u", value));
                VerifyOrReturn(CheckValue("nullableInt32u.Value()", value.Value(), 0UL));
            }
            break;
        case 242:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 243:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32u", value));
                VerifyOrReturn(CheckValue("nullableInt32u.Value()", value.Value(), 4294967294UL));
            }
            break;
        case 244:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 245:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32u", value));
                VerifyOrReturn(CheckValue("nullableInt32u.Value()", value.Value(), 4294967294UL));
            }
            break;
        case 246:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 247:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt32u", value));
            }
            break;
        case 248:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967294UL));
            }
            break;
        case 249:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 4294967294UL));
            }
            break;
        case 250:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 251:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 4294967294UL));
            }
            break;
        case 252:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 2147483648UL));
            }
            break;
        case 253:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 254:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64u", value));
                VerifyOrReturn(CheckValue("nullableInt64u.Value()", value.Value(), 0ULL));
            }
            break;
        case 255:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 256:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64u", value));
                VerifyOrReturn(CheckValue("nullableInt64u.Value()", value.Value(), 18446744073709551614ULL));
            }
            break;
        case 257:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 258:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64u", value));
                VerifyOrReturn(CheckValue("nullableInt64u.Value()", value.Value(), 18446744073709551614ULL));
            }
            break;
        case 259:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 260:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt64u", value));
            }
            break;
        case 261:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0ULL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 18446744073709551614ULL));
            }
            break;
        case 262:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 18446744073709551614ULL));
            }
            break;
        case 263:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 264:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0ULL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 18446744073709551614ULL));
            }
            break;
        case 265:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 18000000000000000001ULL));
            }
            break;
        case 266:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 267:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8s", value));
                VerifyOrReturn(CheckValue("nullableInt8s.Value()", value.Value(), -127));
            }
            break;
        case 268:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 269:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8s", value));
                VerifyOrReturn(CheckValue("nullableInt8s.Value()", value.Value(), -127));
            }
            break;
        case 270:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 271:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt8s", value));
            }
            break;
        case 272:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -127));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127));
            }
            break;
        case 273:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -127));
            }
            break;
        case 274:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 275:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -127));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 127));
            }
            break;
        case 276:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -126));
            }
            break;
        case 277:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 278:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16s", value));
                VerifyOrReturn(CheckValue("nullableInt16s.Value()", value.Value(), -32767));
            }
            break;
        case 279:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 280:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt16s", value));
                VerifyOrReturn(CheckValue("nullableInt16s.Value()", value.Value(), -32767));
            }
            break;
        case 281:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 282:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt16s", value));
            }
            break;
        case 283:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32767));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 284:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -32767));
            }
            break;
        case 285:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 286:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -32767));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 287:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -32766));
            }
            break;
        case 288:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 289:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32s", value));
                VerifyOrReturn(CheckValue("nullableInt32s.Value()", value.Value(), -2147483647L));
            }
            break;
        case 290:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 291:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt32s", value));
                VerifyOrReturn(CheckValue("nullableInt32s.Value()", value.Value(), -2147483647L));
            }
            break;
        case 292:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 293:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt32s", value));
            }
            break;
        case 294:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -2147483647L));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2147483647L));
            }
            break;
        case 295:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -2147483647L));
            }
            break;
        case 296:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 297:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -2147483647L));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2147483647L));
            }
            break;
        case 298:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int32_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -2147483646L));
            }
            break;
        case 299:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 300:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64s", value));
                VerifyOrReturn(CheckValue("nullableInt64s.Value()", value.Value(), -9223372036854775807LL));
            }
            break;
        case 301:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 302:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt64s", value));
                VerifyOrReturn(CheckValue("nullableInt64s.Value()", value.Value(), -9223372036854775807LL));
            }
            break;
        case 303:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 304:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableInt64s", value));
            }
            break;
        case 305:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -9223372036854775807LL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9223372036854775807LL));
            }
            break;
        case 306:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -9223372036854775807LL));
            }
            break;
        case 307:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 308:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -9223372036854775807LL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9223372036854775807LL));
            }
            break;
        case 309:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int64_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, -9223372036854775806LL));
            }
            break;
        case 310:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 311:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatSingle", value));
                VerifyOrReturn(CheckValue("nullableFloatSingle.Value()", value.Value(), 0.1f));
            }
            break;
        case 312:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 313:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatSingle", value));
                VerifyOrReturn(CheckValue("nullableFloatSingle.Value()", value.Value(), INFINITY));
            }
            break;
        case 314:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 315:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatSingle", value));
                VerifyOrReturn(CheckValue("nullableFloatSingle.Value()", value.Value(), -INFINITY));
            }
            break;
        case 316:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 317:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableFloatSingle", value));
            }
            break;
        case 318:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 319:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<float> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatSingle", value));
                VerifyOrReturn(CheckValue("nullableFloatSingle.Value()", value.Value(), 0.0f));
            }
            break;
        case 320:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 321:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatDouble", value));
                VerifyOrReturn(CheckValue("nullableFloatDouble.Value()", value.Value(), 0.1234567890123));
            }
            break;
        case 322:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 323:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatDouble", value));
                VerifyOrReturn(CheckValue("nullableFloatDouble.Value()", value.Value(), INFINITY));
            }
            break;
        case 324:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 325:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatDouble", value));
                VerifyOrReturn(CheckValue("nullableFloatDouble.Value()", value.Value(), -INFINITY));
            }
            break;
        case 326:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 327:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableFloatDouble", value));
            }
            break;
        case 328:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 329:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<double> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableFloatDouble", value));
                VerifyOrReturn(CheckValue("nullableFloatDouble.Value()", value.Value(), 0));
            }
            break;
        case 330:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 331:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum8", value));
                VerifyOrReturn(CheckValue("nullableEnum8.Value()", value.Value(), 0U));
            }
            break;
        case 332:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 333:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum8", value));
                VerifyOrReturn(CheckValue("nullableEnum8.Value()", value.Value(), 254U));
            }
            break;
        case 334:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 335:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum8", value));
                VerifyOrReturn(CheckValue("nullableEnum8.Value()", value.Value(), 254U));
            }
            break;
        case 336:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 337:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableEnum8", value));
            }
            break;
        case 338:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 339:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum16", value));
                VerifyOrReturn(CheckValue("nullableEnum16.Value()", value.Value(), 0U));
            }
            break;
        case 340:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 341:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum16", value));
                VerifyOrReturn(CheckValue("nullableEnum16.Value()", value.Value(), 65534U));
            }
            break;
        case 342:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 343:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnum16", value));
                VerifyOrReturn(CheckValue("nullableEnum16.Value()", value.Value(), 65534U));
            }
            break;
        case 344:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 345:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableEnum16", value));
            }
            break;
        case 346:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 347:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnumAttr", value));
                VerifyOrReturn(CheckValue("nullableEnumAttr.Value()", value.Value(), 0U));
            }
            break;
        case 348:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 349:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnumAttr", value));
                VerifyOrReturn(CheckValue("nullableEnumAttr.Value()", value.Value(), 3U));
            }
            break;
        case 350:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 351:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableEnumAttr", value));
                VerifyOrReturn(CheckValue("nullableEnumAttr.Value()", value.Value(), 3U));
                nullableEnumAttr3 = value;
            }
            break;
        case 352:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 353:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableEnumAttr", value));
            }
            break;
        case 354:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, nullableEnumAttr3));
            }
            break;
        case 355:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableOctetString", value));
                VerifyOrReturn(CheckValueAsString("nullableOctetString.Value()", value.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
            }
            break;
        case 356:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 357:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableOctetString", value));
                VerifyOrReturn(CheckValueAsString("nullableOctetString.Value()", value.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char("TestValue"), 9)));
                if (value.IsNull())
                {
                    nullableOctetStrTestValue.SetNull();
                }
                else
                {
                    if (nullableOctetStrTestValueBuffer != nullptr)
                    {
                        chip::Platform::MemoryFree(nullableOctetStrTestValueBuffer);
                    }
                    nullableOctetStrTestValueBuffer = static_cast<uint8_t *>(chip::Platform::MemoryAlloc(value.Value().size()));
                    memcpy(nullableOctetStrTestValueBuffer, value.Value().data(), value.Value().size());
                    nullableOctetStrTestValue.SetNonNull(nullableOctetStrTestValueBuffer, value.Value().size());
                }
            }
            break;
        case 358:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 359:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableOctetString", value));
            }
            break;
        case 360:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 361:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableOctetString", value));
                VerifyOrReturn(CheckValueAsString("nullableOctetString.Value()", value.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
            }
            break;
        case 362:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, nullableOctetStrTestValue));
            }
            break;
        case 363:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableCharString", value));
                VerifyOrReturn(CheckValueAsString("nullableCharString.Value()", value.Value(), chip::CharSpan("", 0)));
            }
            break;
        case 364:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 365:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableCharString", value));
                VerifyOrReturn(CheckValueAsString("nullableCharString.Value()", value.Value(), chip::CharSpan("☉T☉", 7)));
                if (value.IsNull())
                {
                    nullableCharStringSave.SetNull();
                }
                else
                {
                    if (nullableCharStringSaveBuffer != nullptr)
                    {
                        chip::Platform::MemoryFree(nullableCharStringSaveBuffer);
                    }
                    nullableCharStringSaveBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.Value().size()));
                    memcpy(nullableCharStringSaveBuffer, value.Value().data(), value.Value().size());
                    nullableCharStringSave.SetNonNull(nullableCharStringSaveBuffer, value.Value().size());
                }
            }
            break;
        case 366:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (nullableCharStringSave.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("nullableCharString", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("nullableCharString", value));
                    VerifyOrReturn(CheckValueAsString("nullableCharString.Value()", value.Value(), nullableCharStringSave.Value()));
                }
            }
            break;
        case 367:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 368:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableCharString", value));
            }
            break;
        case 369:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 370:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableCharString", value));
                VerifyOrReturn(CheckValueAsString("nullableCharString.Value()", value.Value(), chip::CharSpan("", 0)));
            }
            break;
        case 371:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::CharSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, nullableCharStringSave));
            }
            break;
        case 372:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            break;
        case 373:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            break;
        case 374:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 375:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 376:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 0));
                    VerifyOrReturn(CheckValue("listInt8u[0]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 1));
                    VerifyOrReturn(CheckValue("listInt8u[1]", iter_0.GetValue(), 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 2));
                    VerifyOrReturn(CheckValue("listInt8u[2]", iter_0.GetValue(), 3U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 3));
                    VerifyOrReturn(CheckValue("listInt8u[3]", iter_0.GetValue(), 4U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listInt8u", iter_0, 4));
                }
            }
            break;
        case 377:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 378:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 0));
                    VerifyOrReturn(CheckValue("listInt8u[0]", iter_0.GetValue(), 5U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 1));
                    VerifyOrReturn(CheckValue("listInt8u[1]", iter_0.GetValue(), 6U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 2));
                    VerifyOrReturn(CheckValue("listInt8u[2]", iter_0.GetValue(), 7U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("listInt8u", iter_0, 3));
                    VerifyOrReturn(CheckValue("listInt8u[3]", iter_0.GetValue(), 8U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("listInt8u", iter_0, 4));
                }
            }
            shouldContinue = true;
            break;
        case 379:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 70U));
            }
            break;
        case 380:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 381:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 382:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 383:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 384:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 70U));
            }
            break;
        case 385:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 386:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 20U));
            }
            break;
        case 387:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 388:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 100U));
            }
            break;
        case 389:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 390:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8u", value, 50U));
            }
            break;
        case 391:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 200U));
            }
            break;
        case 392:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 393:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 394:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 395:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 396:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 200U));
            }
            break;
        case 397:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 398:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 100U));
            }
            break;
        case 399:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 400:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 1000U));
            }
            break;
        case 401:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 402:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16u", value, 500U));
            }
            break;
        case 403:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, -20));
            }
            break;
        case 404:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 405:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 406:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 407:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 408:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, -20));
            }
            break;
        case 409:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 410:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, -40));
            }
            break;
        case 411:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 412:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, 50));
            }
            break;
        case 413:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 414:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt8s", value, 6));
            }
            break;
        case 415:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, -100));
            }
            break;
        case 416:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 417:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 418:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 419:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 420:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, -100));
            }
            break;
        case 421:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 422:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, -150));
            }
            break;
        case 423:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 424:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, 200));
            }
            break;
        case 425:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 426:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("rangeRestrictedInt16s", value, 7));
            }
            break;
        case 427:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 70U));
            }
            break;
        case 428:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 429:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 430:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 431:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 432:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 70U));
            }
            break;
        case 433:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 434:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 20U));
            }
            break;
        case 435:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 436:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 100U));
            }
            break;
        case 437:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 438:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8u.Value()", value.Value(), 50U));
            }
            break;
        case 439:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 440:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableRangeRestrictedInt8u", value));
            }
            break;
        case 441:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 200U));
            }
            break;
        case 442:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 443:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 444:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 445:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 446:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 200U));
            }
            break;
        case 447:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 448:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 100U));
            }
            break;
        case 449:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 450:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 1000U));
            }
            break;
        case 451:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 452:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16u", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16u.Value()", value.Value(), 500U));
            }
            break;
        case 453:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 454:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableRangeRestrictedInt16u", value));
            }
            break;
        case 455:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), -20));
            }
            break;
        case 456:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 457:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 458:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 459:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 460:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), -20));
            }
            break;
        case 461:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 462:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), -40));
            }
            break;
        case 463:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 464:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), 50));
            }
            break;
        case 465:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 466:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt8s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt8s.Value()", value.Value(), 6));
            }
            break;
        case 467:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 468:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableRangeRestrictedInt8s", value));
            }
            break;
        case 469:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), -100));
            }
            break;
        case 470:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 471:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 472:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 473:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 474:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), -100));
            }
            break;
        case 475:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 476:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), -150));
            }
            break;
        case 477:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 478:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), 200));
            }
            break;
        case 479:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 480:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableRangeRestrictedInt16s", value));
                VerifyOrReturn(CheckValue("nullableRangeRestrictedInt16s.Value()", value.Value(), 7));
            }
            break;
        case 481:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 482:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("nullableRangeRestrictedInt16s", value));
            }
            break;
        case 483:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
            break;
        case 484:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 485:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
            break;
        case 486:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 487:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("acceptedCommandList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 1));
                    VerifyOrReturn(CheckValue("acceptedCommandList[1]", iter_0.GetValue(), 1UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 2));
                    VerifyOrReturn(CheckValue("acceptedCommandList[2]", iter_0.GetValue(), 2UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 3));
                    VerifyOrReturn(CheckValue("acceptedCommandList[3]", iter_0.GetValue(), 4UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 4));
                    VerifyOrReturn(CheckValue("acceptedCommandList[4]", iter_0.GetValue(), 7UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 5));
                    VerifyOrReturn(CheckValue("acceptedCommandList[5]", iter_0.GetValue(), 8UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 6));
                    VerifyOrReturn(CheckValue("acceptedCommandList[6]", iter_0.GetValue(), 9UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 7));
                    VerifyOrReturn(CheckValue("acceptedCommandList[7]", iter_0.GetValue(), 10UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 8));
                    VerifyOrReturn(CheckValue("acceptedCommandList[8]", iter_0.GetValue(), 11UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 9));
                    VerifyOrReturn(CheckValue("acceptedCommandList[9]", iter_0.GetValue(), 12UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 10));
                    VerifyOrReturn(CheckValue("acceptedCommandList[10]", iter_0.GetValue(), 13UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 11));
                    VerifyOrReturn(CheckValue("acceptedCommandList[11]", iter_0.GetValue(), 14UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 12));
                    VerifyOrReturn(CheckValue("acceptedCommandList[12]", iter_0.GetValue(), 15UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 13));
                    VerifyOrReturn(CheckValue("acceptedCommandList[13]", iter_0.GetValue(), 17UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 14));
                    VerifyOrReturn(CheckValue("acceptedCommandList[14]", iter_0.GetValue(), 18UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 15));
                    VerifyOrReturn(CheckValue("acceptedCommandList[15]", iter_0.GetValue(), 19UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 16));
                    VerifyOrReturn(CheckValue("acceptedCommandList[16]", iter_0.GetValue(), 20UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acceptedCommandList", iter_0, 17));
                    VerifyOrReturn(CheckValue("acceptedCommandList[17]", iter_0.GetValue(), 21UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 18));
                }
            }
            break;
        case 488:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("generatedCommandList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 1));
                    VerifyOrReturn(CheckValue("generatedCommandList[1]", iter_0.GetValue(), 1UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 2));
                    VerifyOrReturn(CheckValue("generatedCommandList[2]", iter_0.GetValue(), 4UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 3));
                    VerifyOrReturn(CheckValue("generatedCommandList[3]", iter_0.GetValue(), 5UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 4));
                    VerifyOrReturn(CheckValue("generatedCommandList[4]", iter_0.GetValue(), 6UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 5));
                    VerifyOrReturn(CheckValue("generatedCommandList[5]", iter_0.GetValue(), 8UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 6));
                    VerifyOrReturn(CheckValue("generatedCommandList[6]", iter_0.GetValue(), 9UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 7));
                    VerifyOrReturn(CheckValue("generatedCommandList[7]", iter_0.GetValue(), 10UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 8));
                    VerifyOrReturn(CheckValue("generatedCommandList[8]", iter_0.GetValue(), 11UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 9));
                }
            }
            break;
        case 489:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 490:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Structs::SimpleStruct::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("structAttr.a", value.a, 5U));
                VerifyOrReturn(CheckValue("structAttr.b", value.b, true));
                VerifyOrReturn(CheckValue("structAttr.c", value.c, 2U));
                VerifyOrReturn(CheckValueAsString("structAttr.d", value.d, chip::ByteSpan(chip::Uint8::from_const_char("abc"), 3)));
                VerifyOrReturn(CheckValueAsString("structAttr.e", value.e, chip::CharSpan("", 0)));
                VerifyOrReturn(CheckValue("structAttr.f", value.f, 17U));
                VerifyOrReturn(CheckValue("structAttr.g", value.g, 1.5f));
                VerifyOrReturn(CheckValue("structAttr.h", value.h, 3.14159265358979));
            }
            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;
        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, "Send Test Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::Test::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Test Not Handled Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNotHandled::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestNotHandled::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send Test Specific Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestSpecific::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestSpecific::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Send failing Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 250U;
            value.arg2 = 6U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read attribute BOOLEAN Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write attribute BOOLEAN True");
            ListFreer listFreer;
            bool value;
            value = 1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute BOOLEAN True");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write attribute BOOLEAN False");
            ListFreer listFreer;
            bool value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read attribute BOOLEAN False");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read attribute BITMAP8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write attribute BITMAP8 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(255U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute BITMAP8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Write attribute BITMAP8 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute BITMAP8 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read attribute BITMAP16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write attribute BITMAP16 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(65535U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute BITMAP16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Write attribute BITMAP16 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read attribute BITMAP16 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Write attribute BITMAP32 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(4294967295UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read attribute BITMAP32 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Write attribute BITMAP32 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(0UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Read attribute BITMAP32 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Write attribute BITMAP64 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(18446744073709551615ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read attribute BITMAP64 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Write attribute BITMAP64 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(0ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read attribute BITMAP64 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Read attribute INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Write attribute INT8U Max Value");
            ListFreer listFreer;
            uint8_t value;
            value = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read attribute INT8U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Write attribute INT8U Min Value");
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Read attribute INT8U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read attribute INT16U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Write attribute INT16U Max Value");
            ListFreer listFreer;
            uint16_t value;
            value = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read attribute INT16U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Write attribute INT16U Min Value");
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Read attribute INT16U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read attribute INT32U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Write attribute INT32U Max Value");
            ListFreer listFreer;
            uint32_t value;
            value = 4294967295UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Read attribute INT32U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Write attribute INT32U Min Value");
            ListFreer listFreer;
            uint32_t value;
            value = 0UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Read attribute INT32U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read attribute INT64U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Write attribute INT64U Max Value");
            ListFreer listFreer;
            uint64_t value;
            value = 18446744073709551615ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Read attribute INT64U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Write attribute INT64U Min Value");
            ListFreer listFreer;
            uint64_t value;
            value = 0ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Read attribute INT64U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 52: {
            LogStep(52, "Write attribute INT8S Max Value");
            ListFreer listFreer;
            int8_t value;
            value = 127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read attribute INT8S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Write attribute INT8S Min Value");
            ListFreer listFreer;
            int8_t value;
            value = -128;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Read attribute INT8S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Write attribute INT8S Default Value");
            ListFreer listFreer;
            int8_t value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 57: {
            LogStep(57, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Write attribute INT16S Max Value");
            ListFreer listFreer;
            int16_t value;
            value = 32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Read attribute INT16S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Write attribute INT16S Min Value");
            ListFreer listFreer;
            int16_t value;
            value = -32768;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 62: {
            LogStep(62, "Read attribute INT16S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Write attribute INT16S Default Value");
            ListFreer listFreer;
            int16_t value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 65: {
            LogStep(65, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 66: {
            LogStep(66, "Write attribute INT32S Max Value");
            ListFreer listFreer;
            int32_t value;
            value = 2147483647L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 67: {
            LogStep(67, "Read attribute INT32S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 68: {
            LogStep(68, "Write attribute INT32S Min Value");
            ListFreer listFreer;
            int32_t value;
            value = -2147483648L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Read attribute INT32S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 70: {
            LogStep(70, "Write attribute INT32S Default Value");
            ListFreer listFreer;
            int32_t value;
            value = 0L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 72: {
            LogStep(72, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 73: {
            LogStep(73, "Write attribute INT64S Max Value");
            ListFreer listFreer;
            int64_t value;
            value = 9223372036854775807LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 74: {
            LogStep(74, "Read attribute INT64S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 75: {
            LogStep(75, "Write attribute INT64S Min Value");
            ListFreer listFreer;
            int64_t value;
            value = -9223372036854775807LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 76: {
            LogStep(76, "Read attribute INT64S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 77: {
            LogStep(77, "Write attribute INT64S Default Value");
            ListFreer listFreer;
            int64_t value;
            value = 0LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 79: {
            LogStep(79, "Read attribute SINGLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 80: {
            LogStep(80, "Write attribute SINGLE medium Value");
            ListFreer listFreer;
            float value;
            value = 0.1f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 81: {
            LogStep(81, "Read attribute SINGLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 82: {
            LogStep(82, "Write attribute SINGLE large Value");
            ListFreer listFreer;
            float value;
            value = 17000000000.0f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 83: {
            LogStep(83, "Read attribute SINGLE large Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 84: {
            LogStep(84, "Write attribute SINGLE small Value");
            ListFreer listFreer;
            float value;
            value = 1.7e-10f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 85: {
            LogStep(85, "Read attribute SINGLE small Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 86: {
            LogStep(86, "Write attribute SINGLE Default Value");
            ListFreer listFreer;
            float value;
            value = 0.0f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 87: {
            LogStep(87, "Read attribute SINGLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 88: {
            LogStep(88, "Read attribute DOUBLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 89: {
            LogStep(89, "Write attribute DOUBLE medium Value");
            ListFreer listFreer;
            double value;
            value = 0.1234567890123;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 90: {
            LogStep(90, "Read attribute DOUBLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 91: {
            LogStep(91, "Write attribute DOUBLE large Value");
            ListFreer listFreer;
            double value;
            value = 1.7e+200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 92: {
            LogStep(92, "Read attribute DOUBLE large Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 93: {
            LogStep(93, "Write attribute DOUBLE small Value");
            ListFreer listFreer;
            double value;
            value = 1.7e-200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 94: {
            LogStep(94, "Read attribute DOUBLE small Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 95: {
            LogStep(95, "Write attribute DOUBLE Default Value");
            ListFreer listFreer;
            double value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 96: {
            LogStep(96, "Read attribute DOUBLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 97: {
            LogStep(97, "Read attribute ENUM8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 98: {
            LogStep(98, "Write attribute ENUM8 Max Value");
            ListFreer listFreer;
            uint8_t value;
            value = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 99: {
            LogStep(99, "Read attribute ENUM8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 100: {
            LogStep(100, "Write attribute ENUM8 Min Value");
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 101: {
            LogStep(101, "Read attribute ENUM8 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 102: {
            LogStep(102, "Read attribute ENUM16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 103: {
            LogStep(103, "Write attribute ENUM16 Max Value");
            ListFreer listFreer;
            uint16_t value;
            value = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 104: {
            LogStep(104, "Read attribute ENUM16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 105: {
            LogStep(105, "Write attribute ENUM16 Min Value");
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 106: {
            LogStep(106, "Read attribute ENUM16 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 107: {
            LogStep(107, "Read attribute OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 108: {
            LogStep(108, "Write attribute OCTET_STRING with embedded null");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("Tes\000ti\000nggarbage: not in length on purpose"), 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 109: {
            LogStep(109, "Read attribute OCTET_STRING with embedded null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 110: {
            LogStep(110, "Write attribute OCTET_STRING with hex: format");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("\x00\x01\x02\x03\x04\x05garbage: not in length on purpose"), 6);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 111: {
            LogStep(111, "Read attribute OCTET_STRING with hex: format");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 112: {
            LogStep(112, "Write attribute OCTET_STRING with weird chars");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("\015\012\377\042\240garbage: not in length on purpose"), 5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 113: {
            LogStep(113, "Read attribute OCTET_STRING with weird chars");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 114: {
            LogStep(114, "Write attribute OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("TestValuegarbage: not in length on purpose"), 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 115: {
            LogStep(115, "Read attribute OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 116: {
            LogStep(116, "Write attribute OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("TestValueLongerThan10garbage: not in length on purpose"), 21);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 117: {
            LogStep(117, "Read attribute OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 118: {
            LogStep(118, "Write attribute OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("garbage: not in length on purpose"), 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 119: {
            LogStep(119, "Read attribute LONG_OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 120: {
            LogStep(120, "Write attribute LONG_OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(
                chip::Uint8::from_const_char("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                                             "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                                             "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                                             "111111111111111111111111111111111111111111111garbage: not in length on purpose"),
                300);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 121: {
            LogStep(121, "Read attribute LONG_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 122: {
            LogStep(122, "Write attribute LONG_OCTET_STRING");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("garbage: not in length on purpose"), 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 123: {
            LogStep(123, "Read attribute CHAR_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 124: {
            LogStep(124, "Write attribute CHAR_STRING");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("☉T☉garbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 125: {
            LogStep(125, "Read attribute CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 126: {
            LogStep(126, "Write attribute CHAR_STRING - Value too long");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("☉TestValueLongerThan10☉garbage: not in length on purpose", 27);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 127: {
            LogStep(127, "Read attribute CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 128: {
            LogStep(128, "Write attribute CHAR_STRING - Empty");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 129: {
            LogStep(129, "Read attribute LONG_CHAR_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongCharString::Id, true,
                                 chip::NullOptional);
        }
        case 130: {
            LogStep(130, "Write attribute LONG_CHAR_STRING");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>(
                "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉garbage: not in length on purpose",
                900);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 131: {
            LogStep(131, "Read attribute LONG_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongCharString::Id, true,
                                 chip::NullOptional);
        }
        case 132: {
            LogStep(132, "Write attribute LONG_CHAR_STRING");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::LongCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 133: {
            LogStep(133, "Read attribute LIST_LONG_OCTET_STRING (for chunked read)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListLongOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 134: {
            LogStep(134, "Write attribute LIST_LONG_OCTET_STRING (for chunked write)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::ByteSpan> value;

            {
                auto * listHolder_0 = new ListHolder<chip::ByteSpan>(5);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[1] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[2] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[3] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[4] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                value = chip::app::DataModel::List<chip::ByteSpan>(listHolder_0->mList, 5);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListLongOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 135: {
            LogStep(135, "Read attribute LIST_LONG_OCTET_STRING (for chunked read)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListLongOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 136: {
            LogStep(136, "Write attribute LIST_LONG_OCTET_STRING (for chunked write)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::ByteSpan> value;

            {
                auto * listHolder_0 = new ListHolder<chip::ByteSpan>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[1] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[2] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                listHolder_0->mList[3] = chip::ByteSpan(
                    chip::Uint8::from_const_char(
                        "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                        "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                        "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                        "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                        "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefgarbage: not in "
                        "length on purpose"),
                    512);
                value = chip::app::DataModel::List<chip::ByteSpan>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListLongOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 137: {
            LogStep(137, "Read attribute EPOCH_US Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 138: {
            LogStep(138, "Write attribute EPOCH_US Max Value");
            ListFreer listFreer;
            uint64_t value;
            value = 18446744073709551615ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 139: {
            LogStep(139, "Read attribute EPOCH_US Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 140: {
            LogStep(140, "Write attribute EPOCH_US Min Value");
            ListFreer listFreer;
            uint64_t value;
            value = 0ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 141: {
            LogStep(141, "Read attribute EPOCH_US Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 142: {
            LogStep(142, "Read attribute EPOCH_S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 143: {
            LogStep(143, "Write attribute EPOCH_S Max Value");
            ListFreer listFreer;
            uint32_t value;
            value = 4294967295UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 144: {
            LogStep(144, "Read attribute EPOCH_S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 145: {
            LogStep(145, "Write attribute EPOCH_S Min Value");
            ListFreer listFreer;
            uint32_t value;
            value = 0UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 146: {
            LogStep(146, "Read attribute EPOCH_S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 147: {
            LogStep(147, "Read attribute UNSUPPORTED");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Unsupported::Id, true,
                                 chip::NullOptional);
        }
        case 148: {
            LogStep(148, "Writeattribute UNSUPPORTED");
            ListFreer listFreer;
            bool value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Unsupported::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 149: {
            LogStep(149, "Send Test Command to unsupported endpoint");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(200), UnitTesting::Id, UnitTesting::Commands::Test::Id, value,
                               chip::NullOptional

            );
        }
        case 150: {
            LogStep(150, "Send Test Command to unsupported cluster");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), UnitTesting::Id, UnitTesting::Commands::Test::Id, value,
                               chip::NullOptional

            );
        }
        case 151: {
            LogStep(151, "Read attribute vendor_id Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 152: {
            LogStep(152, "Write attribute vendor_id");
            ListFreer listFreer;
            chip::VendorId value;
            value = static_cast<chip::VendorId>(17);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 153: {
            LogStep(153, "Read attribute vendor_id");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 154: {
            LogStep(154, "Restore attribute vendor_id");
            ListFreer listFreer;
            chip::VendorId value;
            value = static_cast<chip::VendorId>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 155: {
            LogStep(155, "Send a command with a vendor_id and enum");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEnumsRequest::Type value;
            value.arg1 = static_cast<chip::VendorId>(20003);
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEnumsRequest::Id, value,
                               chip::NullOptional

            );
        }
        case 156: {
            LogStep(156, "Send a command with a vendor_id and invalid enum");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEnumsRequest::Type value;
            value.arg1 = static_cast<chip::VendorId>(20003);
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(101);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEnumsRequest::Id, value,
                               chip::NullOptional

            );
        }
        case 157: {
            LogStep(157, "Send Test Command With Struct Argument and arg1.b is true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;
            value.arg1.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.g = 0.0f;
            value.arg1.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 158: {
            LogStep(158, "Send Test Command With Struct Argument and arg1.b is false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = false;
            value.arg1.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.g = 0.0f;
            value.arg1.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 159: {
            LogStep(159, "Send Test Command With Nested Struct Argument and arg1.c.b is true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNestedStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;

            value.arg1.c.a = 0U;
            value.arg1.c.b = true;
            value.arg1.c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.c.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNestedStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 160: {
            LogStep(160, "Send Test Command With Nested Struct Argument arg1.c.b is false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNestedStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;

            value.arg1.c.a = 0U;
            value.arg1.c.b = false;
            value.arg1.c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.c.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNestedStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 161: {
            LogStep(161, "Send Test Command With Nested Struct List Argument and all fields b of arg1.d are true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNestedStructListArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;

            value.arg1.c.a = 0U;
            value.arg1.c.b = true;
            value.arg1.c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.c.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            {
                auto * listHolder_1 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                listFreer.add(listHolder_1);

                listHolder_1->mList[0].a = 1U;
                listHolder_1->mList[0].b = true;
                listHolder_1->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_1->mList[0].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_1->mList[0].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                listHolder_1->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_1->mList[0].g = 0.0f;
                listHolder_1->mList[0].h = 0;

                listHolder_1->mList[1].a = 2U;
                listHolder_1->mList[1].b = true;
                listHolder_1->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_1->mList[1].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_1->mList[1].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                listHolder_1->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_1->mList[1].g = 0.0f;
                listHolder_1->mList[1].h = 0;

                value.arg1.d = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                    listHolder_1->mList, 2);
            }

            {
                auto * listHolder_1 = new ListHolder<uint32_t>(3);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] = 1UL;
                listHolder_1->mList[1] = 2UL;
                listHolder_1->mList[2] = 3UL;
                value.arg1.e           = chip::app::DataModel::List<uint32_t>(listHolder_1->mList, 3);
            }

            {
                auto * listHolder_1 = new ListHolder<chip::ByteSpan>(3);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_string_1garbage: not in length on purpose"), 14);
                listHolder_1->mList[1] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octect_string_2garbage: not in length on purpose"), 15);
                listHolder_1->mList[2] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_string_3garbage: not in length on purpose"), 14);
                value.arg1.f = chip::app::DataModel::List<chip::ByteSpan>(listHolder_1->mList, 3);
            }

            {
                auto * listHolder_1 = new ListHolder<uint8_t>(2);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] = 0U;
                listHolder_1->mList[1] = 255U;
                value.arg1.g           = chip::app::DataModel::List<uint8_t>(listHolder_1->mList, 2);
            }

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNestedStructListArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 162: {
            LogStep(162, "Send Test Command With Nested Struct List Argument and some fields b of arg1.d are false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNestedStructListArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;

            value.arg1.c.a = 0U;
            value.arg1.c.b = true;
            value.arg1.c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.c.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            {
                auto * listHolder_1 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                listFreer.add(listHolder_1);

                listHolder_1->mList[0].a = 1U;
                listHolder_1->mList[0].b = true;
                listHolder_1->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_1->mList[0].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_1->mList[0].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                listHolder_1->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_1->mList[0].g = 0.0f;
                listHolder_1->mList[0].h = 0;

                listHolder_1->mList[1].a = 2U;
                listHolder_1->mList[1].b = false;
                listHolder_1->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_1->mList[1].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_1->mList[1].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                listHolder_1->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_1->mList[1].g = 0.0f;
                listHolder_1->mList[1].h = 0;

                value.arg1.d = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                    listHolder_1->mList, 2);
            }

            {
                auto * listHolder_1 = new ListHolder<uint32_t>(3);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] = 1UL;
                listHolder_1->mList[1] = 2UL;
                listHolder_1->mList[2] = 3UL;
                value.arg1.e           = chip::app::DataModel::List<uint32_t>(listHolder_1->mList, 3);
            }

            {
                auto * listHolder_1 = new ListHolder<chip::ByteSpan>(3);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_string_1garbage: not in length on purpose"), 14);
                listHolder_1->mList[1] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octect_string_2garbage: not in length on purpose"), 15);
                listHolder_1->mList[2] =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_string_3garbage: not in length on purpose"), 14);
                value.arg1.f = chip::app::DataModel::List<chip::ByteSpan>(listHolder_1->mList, 3);
            }

            {
                auto * listHolder_1 = new ListHolder<uint8_t>(2);
                listFreer.add(listHolder_1);
                listHolder_1->mList[0] = 0U;
                listHolder_1->mList[1] = 255U;
                value.arg1.g           = chip::app::DataModel::List<uint8_t>(listHolder_1->mList, 2);
            }

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNestedStructListArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 163: {
            LogStep(163, "Send Test Command With Struct Argument and see what we get back");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::SimpleStructEchoRequest::Type value;

            value.arg1.a = 17U;
            value.arg1.b = false;
            value.arg1.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg1.d = chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
            value.arg1.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
            value.arg1.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
            value.arg1.g = 0.1f;
            value.arg1.h = 0.1;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::SimpleStructEchoRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 164: {
            LogStep(164, "Send Test Command With List of INT8U and none of them is set to 0");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListInt8UArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(9);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                listHolder_0->mList[4] = 5U;
                listHolder_0->mList[5] = 6U;
                listHolder_0->mList[6] = 7U;
                listHolder_0->mList[7] = 8U;
                listHolder_0->mList[8] = 9U;
                value.arg1             = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 9);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListInt8UArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 165: {
            LogStep(165, "Send Test Command With List of INT8U and one of them is set to 0");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListInt8UArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(10);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                listHolder_0->mList[4] = 5U;
                listHolder_0->mList[5] = 6U;
                listHolder_0->mList[6] = 7U;
                listHolder_0->mList[7] = 8U;
                listHolder_0->mList[8] = 9U;
                listHolder_0->mList[9] = 0U;
                value.arg1             = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 10);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListInt8UArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 166: {
            LogStep(166, "Send Test Command With List of INT8U and get it reversed");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(9);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                listHolder_0->mList[4] = 5U;
                listHolder_0->mList[5] = 6U;
                listHolder_0->mList[6] = 7U;
                listHolder_0->mList[7] = 8U;
                listHolder_0->mList[8] = 9U;
                value.arg1             = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 9);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListInt8UReverseRequest::Id, value, chip::NullOptional

            );
        }
        case 167: {
            LogStep(167, "Send Test Command With empty List of INT8U and get an empty list back");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListInt8UReverseRequest::Type value;

            value.arg1 = chip::app::DataModel::List<uint8_t>();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListInt8UReverseRequest::Id, value, chip::NullOptional

            );
        }
        case 168: {
            LogStep(168, "Send Test Command With List of Struct Argument and arg1.b of first item is true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListStructArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].a = 0U;
                listHolder_0->mList[0].b = true;
                listHolder_0->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                listHolder_0->mList[0].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("first_octet_stringgarbage: not in length on purpose"), 18);
                listHolder_0->mList[0].e = chip::Span<const char>("first_char_stringgarbage: not in length on purpose", 17);
                listHolder_0->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[0].g = 0.0f;
                listHolder_0->mList[0].h = 0;

                listHolder_0->mList[1].a = 1U;
                listHolder_0->mList[1].b = true;
                listHolder_0->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_0->mList[1].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("second_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_0->mList[1].e = chip::Span<const char>("second_char_stringgarbage: not in length on purpose", 18);
                listHolder_0->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[1].g = 0.0f;
                listHolder_0->mList[1].h = 0;

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 169: {
            LogStep(169, "Send Test Command With List of Struct Argument and arg1.b of first item is false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListStructArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].a = 1U;
                listHolder_0->mList[0].b = true;
                listHolder_0->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                listHolder_0->mList[0].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("second_octet_stringgarbage: not in length on purpose"), 19);
                listHolder_0->mList[0].e = chip::Span<const char>("second_char_stringgarbage: not in length on purpose", 18);
                listHolder_0->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[0].g = 0.0f;
                listHolder_0->mList[0].h = 0;

                listHolder_0->mList[1].a = 0U;
                listHolder_0->mList[1].b = false;
                listHolder_0->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                listHolder_0->mList[1].d =
                    chip::ByteSpan(chip::Uint8::from_const_char("first_octet_stringgarbage: not in length on purpose"), 18);
                listHolder_0->mList[1].e = chip::Span<const char>("first_char_stringgarbage: not in length on purpose", 17);
                listHolder_0->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[1].g = 0.0f;
                listHolder_0->mList[1].h = 0;

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListStructArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 170: {
            LogStep(170,
                    "Send Test Command With List of Nested Struct List Argument and all fields b of elements of arg1.d are true");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListNestedStructListArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::NestedStructList::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].a = 0U;
                listHolder_0->mList[0].b = true;

                listHolder_0->mList[0].c.a = 0U;
                listHolder_0->mList[0].c.b = true;
                listHolder_0->mList[0].c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                listHolder_0->mList[0].c.d =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
                listHolder_0->mList[0].c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
                listHolder_0->mList[0].c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[0].c.g = 0.0f;
                listHolder_0->mList[0].c.h = 0;

                {
                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                    listFreer.add(listHolder_2);

                    listHolder_2->mList[0].a = 1U;
                    listHolder_2->mList[0].b = true;
                    listHolder_2->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                    listHolder_2->mList[0].d =
                        chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                    listHolder_2->mList[0].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                    listHolder_2->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                    listHolder_2->mList[0].g = 0.0f;
                    listHolder_2->mList[0].h = 0;

                    listHolder_2->mList[1].a = 2U;
                    listHolder_2->mList[1].b = true;
                    listHolder_2->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                    listHolder_2->mList[1].d =
                        chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                    listHolder_2->mList[1].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                    listHolder_2->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                    listHolder_2->mList[1].g = 0.0f;
                    listHolder_2->mList[1].h = 0;

                    listHolder_0->mList[0].d =
                        chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                            listHolder_2->mList, 2);
                }

                {
                    auto * listHolder_2 = new ListHolder<uint32_t>(3);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0]   = 1UL;
                    listHolder_2->mList[1]   = 2UL;
                    listHolder_2->mList[2]   = 3UL;
                    listHolder_0->mList[0].e = chip::app::DataModel::List<uint32_t>(listHolder_2->mList, 3);
                }

                {
                    auto * listHolder_2 = new ListHolder<chip::ByteSpan>(3);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octet_string_1garbage: not in length on purpose"), 14);
                    listHolder_2->mList[1] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octect_string_2garbage: not in length on purpose"), 15);
                    listHolder_2->mList[2] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octet_string_3garbage: not in length on purpose"), 14);
                    listHolder_0->mList[0].f = chip::app::DataModel::List<chip::ByteSpan>(listHolder_2->mList, 3);
                }

                {
                    auto * listHolder_2 = new ListHolder<uint8_t>(2);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0]   = 0U;
                    listHolder_2->mList[1]   = 255U;
                    listHolder_0->mList[0].g = chip::app::DataModel::List<uint8_t>(listHolder_2->mList, 2);
                }

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::NestedStructList::Type>(
                    listHolder_0->mList, 1);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListNestedStructListArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 171: {
            LogStep(171, "Send Test Command With Nested Struct List Argument and some fields b of elements of arg1.d are false");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestListNestedStructListArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::NestedStructList::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].a = 0U;
                listHolder_0->mList[0].b = true;

                listHolder_0->mList[0].c.a = 0U;
                listHolder_0->mList[0].c.b = true;
                listHolder_0->mList[0].c.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                listHolder_0->mList[0].c.d =
                    chip::ByteSpan(chip::Uint8::from_const_char("octet_stringgarbage: not in length on purpose"), 12);
                listHolder_0->mList[0].c.e = chip::Span<const char>("char_stringgarbage: not in length on purpose", 11);
                listHolder_0->mList[0].c.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                listHolder_0->mList[0].c.g = 0.0f;
                listHolder_0->mList[0].c.h = 0;

                {
                    auto * listHolder_2 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(2);
                    listFreer.add(listHolder_2);

                    listHolder_2->mList[0].a = 1U;
                    listHolder_2->mList[0].b = true;
                    listHolder_2->mList[0].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                    listHolder_2->mList[0].d =
                        chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                    listHolder_2->mList[0].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                    listHolder_2->mList[0].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                    listHolder_2->mList[0].g = 0.0f;
                    listHolder_2->mList[0].h = 0;

                    listHolder_2->mList[1].a = 2U;
                    listHolder_2->mList[1].b = false;
                    listHolder_2->mList[1].c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
                    listHolder_2->mList[1].d =
                        chip::ByteSpan(chip::Uint8::from_const_char("nested_octet_stringgarbage: not in length on purpose"), 19);
                    listHolder_2->mList[1].e = chip::Span<const char>("nested_char_stringgarbage: not in length on purpose", 18);
                    listHolder_2->mList[1].f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(1U);
                    listHolder_2->mList[1].g = 0.0f;
                    listHolder_2->mList[1].h = 0;

                    listHolder_0->mList[0].d =
                        chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type>(
                            listHolder_2->mList, 2);
                }

                {
                    auto * listHolder_2 = new ListHolder<uint32_t>(3);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0]   = 1UL;
                    listHolder_2->mList[1]   = 2UL;
                    listHolder_2->mList[2]   = 3UL;
                    listHolder_0->mList[0].e = chip::app::DataModel::List<uint32_t>(listHolder_2->mList, 3);
                }

                {
                    auto * listHolder_2 = new ListHolder<chip::ByteSpan>(3);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octet_string_1garbage: not in length on purpose"), 14);
                    listHolder_2->mList[1] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octect_string_2garbage: not in length on purpose"), 15);
                    listHolder_2->mList[2] =
                        chip::ByteSpan(chip::Uint8::from_const_char("octet_string_3garbage: not in length on purpose"), 14);
                    listHolder_0->mList[0].f = chip::app::DataModel::List<chip::ByteSpan>(listHolder_2->mList, 3);
                }

                {
                    auto * listHolder_2 = new ListHolder<uint8_t>(2);
                    listFreer.add(listHolder_2);
                    listHolder_2->mList[0]   = 0U;
                    listHolder_2->mList[1]   = 255U;
                    listHolder_0->mList[0].g = chip::app::DataModel::List<uint8_t>(listHolder_2->mList, 2);
                }

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::NestedStructList::Type>(
                    listHolder_0->mList, 1);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestListNestedStructListArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 172: {
            LogStep(172, "Write attribute LIST With List of INT8U and none of them is set to 0");
            ListFreer listFreer;
            chip::app::DataModel::List<const uint8_t> value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                value                  = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 173: {
            LogStep(173, "Read attribute LIST With List of INT8U");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 174: {
            LogStep(174, "Write attribute LIST With List of OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::ByteSpan> value;

            {
                auto * listHolder_0 = new ListHolder<chip::ByteSpan>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = chip::ByteSpan(chip::Uint8::from_const_char("Test0garbage: not in length on purpose"), 5);
                listHolder_0->mList[1] = chip::ByteSpan(chip::Uint8::from_const_char("Test1garbage: not in length on purpose"), 5);
                listHolder_0->mList[2] = chip::ByteSpan(chip::Uint8::from_const_char("Test2garbage: not in length on purpose"), 5);
                listHolder_0->mList[3] = chip::ByteSpan(chip::Uint8::from_const_char("Test3garbage: not in length on purpose"), 5);
                value                  = chip::app::DataModel::List<chip::ByteSpan>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 175: {
            LogStep(175, "Read attribute LIST With List of OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 176: {
            LogStep(176, "Write attribute LIST With List of LIST_STRUCT_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].member1 = 0ULL;
                listHolder_0->mList[0].member2 =
                    chip::ByteSpan(chip::Uint8::from_const_char("Test0garbage: not in length on purpose"), 5);

                listHolder_0->mList[1].member1 = 1ULL;
                listHolder_0->mList[1].member2 =
                    chip::ByteSpan(chip::Uint8::from_const_char("Test1garbage: not in length on purpose"), 5);

                listHolder_0->mList[2].member1 = 2ULL;
                listHolder_0->mList[2].member2 =
                    chip::ByteSpan(chip::Uint8::from_const_char("Test2garbage: not in length on purpose"), 5);

                listHolder_0->mList[3].member1 = 3ULL;
                listHolder_0->mList[3].member2 =
                    chip::ByteSpan(chip::Uint8::from_const_char("Test3garbage: not in length on purpose"), 5);

                value = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::Type>(
                    listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::ListStructOctetString::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 177: {
            LogStep(177, "Read attribute LIST With List of LIST_STRUCT_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::ListStructOctetString::Id, true, chip::NullOptional);
        }
        case 178: {
            LogStep(178, "Send Test Command with optional arg set.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalRequest::Type value;
            value.arg1.Emplace();
            value.arg1.Value().SetNonNull();
            value.arg1.Value().Value() = 5U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNullableOptionalRequest::Id, value, chip::NullOptional

            );
        }
        case 179: {
            LogStep(179, "Send Test Command without its optional arg.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNullableOptionalRequest::Id, value, chip::NullOptional

            );
        }
        case 180: {
            LogStep(180, "Read list of structs containing nullables and optionals");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::ListNullablesAndOptionalsStruct::Id, true, chip::NullOptional);
        }
        case 181: {
            LogStep(181, "Write list of structs containing nullables and optionals");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].nullableInt.SetNull();
                listHolder_0->mList[0].nullableString.SetNull();
                listHolder_0->mList[0].nullableStruct.SetNull();
                listHolder_0->mList[0].nullableList.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0] = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(1);
                    listHolder_3->mList[1] = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
                    listHolder_0->mList[0].nullableList.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::UnitTesting::SimpleEnum>(listHolder_3->mList, 2);
                }

                value = chip::app::DataModel::List<chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::ListNullablesAndOptionalsStruct::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 182: {
            LogStep(182, "Read list of structs containing nullables and optionals after writing");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::ListNullablesAndOptionalsStruct::Id, true, chip::NullOptional);
        }
        case 183: {
            LogStep(183, "Write attribute NULLABLE_BOOLEAN null");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<bool> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 184: {
            LogStep(184, "Read attribute NULLABLE_BOOLEAN null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 185: {
            LogStep(185, "Write attribute NULLABLE_BOOLEAN True");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<bool> value;
            value.SetNonNull();
            value.Value() = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 186: {
            LogStep(186, "Read attribute NULLABLE_BOOLEAN True");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 187: {
            LogStep(187, "Read attribute NULLABLE_BOOLEAN not null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 188: {
            LogStep(188, "Write attribute NULLABLE_BITMAP8 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(254U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 189: {
            LogStep(189, "Read attribute NULLABLE_BITMAP8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                 true, chip::NullOptional);
        }
        case 190: {
            LogStep(190, "Write attribute NULLABLE_BITMAP8 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(255U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 191: {
            LogStep(191, "Read attribute NULLABLE_BITMAP8 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                 true, chip::NullOptional);
        }
        case 192: {
            LogStep(192, "Write attribute NULLABLE_BITMAP8 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 193: {
            LogStep(193, "Read attribute NULLABLE_BITMAP8 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                 true, chip::NullOptional);
        }
        case 194: {
            LogStep(194, "Read attribute NULLABLE_BITMAP8 not 254 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap8::Id,
                                 true, chip::NullOptional);
        }
        case 195: {
            LogStep(195, "Write attribute NULLABLE_BITMAP16 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(65534U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 196: {
            LogStep(196, "Read attribute NULLABLE_BITMAP16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                 true, chip::NullOptional);
        }
        case 197: {
            LogStep(197, "Write attribute NULLABLE_BITMAP16 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(65535U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 198: {
            LogStep(198, "Read attribute NULLABLE_BITMAP16 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                 true, chip::NullOptional);
        }
        case 199: {
            LogStep(199, "Write attribute NULLABLE_BITMAP16 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 200: {
            LogStep(200, "Read attribute NULLABLE_BITMAP16 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap16::Id,
                                 true, chip::NullOptional);
        }
        case 201: {
            LogStep(201, "Write attribute NULLABLE_BITMAP32 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(4294967294UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 202: {
            LogStep(202, "Read attribute NULLABLE_BITMAP32 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                 true, chip::NullOptional);
        }
        case 203: {
            LogStep(203, "Write attribute NULLABLE_BITMAP32 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(4294967295UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 204: {
            LogStep(204, "Read attribute NULLABLE_BITMAP32 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                 true, chip::NullOptional);
        }
        case 205: {
            LogStep(205, "Write attribute NULLABLE_BITMAP32 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 206: {
            LogStep(206, "Read attribute NULLABLE_BITMAP32 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap32::Id,
                                 true, chip::NullOptional);
        }
        case 207: {
            LogStep(207, "Write attribute NULLABLE_BITMAP64 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(18446744073709551614ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 208: {
            LogStep(208, "Read attribute NULLABLE_BITMAP64 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                 true, chip::NullOptional);
        }
        case 209: {
            LogStep(209, "Write attribute NULLABLE_BITMAP64 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(18446744073709551615ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 210: {
            LogStep(210, "Read attribute NULLABLE_BITMAP64 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                 true, chip::NullOptional);
        }
        case 211: {
            LogStep(211, "Write attribute NULLABLE_BITMAP64 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 212: {
            LogStep(212, "Read attribute NULLABLE_BITMAP64 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableBitmap64::Id,
                                 true, chip::NullOptional);
        }
        case 213: {
            LogStep(213, "Write attribute NULLABLE_INT8U Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 214: {
            LogStep(214, "Read attribute NULLABLE_INT8U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 215: {
            LogStep(215, "Write attribute NULLABLE_INT8U Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 254U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 216: {
            LogStep(216, "Read attribute NULLABLE_INT8U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 217: {
            LogStep(217, "Write attribute NULLABLE_INT8U Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 218: {
            LogStep(218, "Read attribute NULLABLE_INT8U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 219: {
            LogStep(219, "Read attribute NULLABLE_INT8U unchanged Value with constraint");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 220: {
            LogStep(220, "Write attribute NULLABLE_INT8U null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 221: {
            LogStep(221, "Read attribute NULLABLE_INT8U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 222: {
            LogStep(222, "Read attribute NULLABLE_INT8U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 223: {
            LogStep(223, "Read attribute NULLABLE_INT8U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 224: {
            LogStep(224, "Write attribute NULLABLE_INT8U Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 128U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 225: {
            LogStep(225, "Read attribute NULLABLE_INT8U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 226: {
            LogStep(226, "Read attribute NULLABLE_INT8U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 227: {
            LogStep(227, "Write attribute NULLABLE_INT16U Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 228: {
            LogStep(228, "Read attribute NULLABLE_INT16U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 229: {
            LogStep(229, "Write attribute NULLABLE_INT16U Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65534U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 230: {
            LogStep(230, "Read attribute NULLABLE_INT16U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 231: {
            LogStep(231, "Write attribute NULLABLE_INT16U Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 232: {
            LogStep(232, "Read attribute NULLABLE_INT16U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 233: {
            LogStep(233, "Write attribute NULLABLE_INT16U null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 234: {
            LogStep(234, "Read attribute NULLABLE_INT16U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 235: {
            LogStep(235, "Read attribute NULLABLE_INT16U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 236: {
            LogStep(236, "Read attribute NULLABLE_INT16U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 237: {
            LogStep(237, "Write attribute NULLABLE_INT16U Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 32000U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 238: {
            LogStep(238, "Read attribute NULLABLE_INT16U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 239: {
            LogStep(239, "Read attribute NULLABLE_INT16U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 240: {
            LogStep(240, "Write attribute NULLABLE_INT32U Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 0UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 241: {
            LogStep(241, "Read attribute NULLABLE_INT32U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 242: {
            LogStep(242, "Write attribute NULLABLE_INT32U Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 4294967294UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 243: {
            LogStep(243, "Read attribute NULLABLE_INT32U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 244: {
            LogStep(244, "Write attribute NULLABLE_INT32U Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 4294967295UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 245: {
            LogStep(245, "Read attribute NULLABLE_INT32U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 246: {
            LogStep(246, "Write attribute NULLABLE_INT32U null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 247: {
            LogStep(247, "Read attribute NULLABLE_INT32U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 248: {
            LogStep(248, "Read attribute NULLABLE_INT32U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 249: {
            LogStep(249, "Read attribute NULLABLE_INT32U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 250: {
            LogStep(250, "Write attribute NULLABLE_INT32U Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint32_t> value;
            value.SetNonNull();
            value.Value() = 2147483647UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 251: {
            LogStep(251, "Read attribute NULLABLE_INT32U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 252: {
            LogStep(252, "Read attribute NULLABLE_INT32U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 253: {
            LogStep(253, "Write attribute NULLABLE_INT64U Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNonNull();
            value.Value() = 0ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 254: {
            LogStep(254, "Read attribute NULLABLE_INT64U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 255: {
            LogStep(255, "Write attribute NULLABLE_INT64U Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNonNull();
            value.Value() = 18446744073709551614ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 256: {
            LogStep(256, "Read attribute NULLABLE_INT64U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 257: {
            LogStep(257, "Write attribute NULLABLE_INT64U Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNonNull();
            value.Value() = 18446744073709551615ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 258: {
            LogStep(258, "Read attribute NULLABLE_INT64U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 259: {
            LogStep(259, "Write attribute NULLABLE_INT64U null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 260: {
            LogStep(260, "Read attribute NULLABLE_INT64U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 261: {
            LogStep(261, "Read attribute NULLABLE_INT64U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 262: {
            LogStep(262, "Read attribute NULLABLE_INT64U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 263: {
            LogStep(263, "Write attribute NULLABLE_INT64U Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint64_t> value;
            value.SetNonNull();
            value.Value() = 18000000000000000000ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 264: {
            LogStep(264, "Read attribute NULLABLE_INT64U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 265: {
            LogStep(265, "Read attribute NULLABLE_INT64U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 266: {
            LogStep(266, "Write attribute NULLABLE_INT8S Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 267: {
            LogStep(267, "Read attribute NULLABLE_INT8S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 268: {
            LogStep(268, "Write attribute NULLABLE_INT8S Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -128;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 269: {
            LogStep(269, "Read attribute NULLABLE_INT8S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 270: {
            LogStep(270, "Write attribute NULLABLE_INT8S null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 271: {
            LogStep(271, "Read attribute NULLABLE_INT8S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 272: {
            LogStep(272, "Read attribute NULLABLE_INT8S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 273: {
            LogStep(273, "Read attribute NULLABLE_INT8S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 274: {
            LogStep(274, "Write attribute NULLABLE_INT8S Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 275: {
            LogStep(275, "Read attribute NULLABLE_INT8S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 276: {
            LogStep(276, "Read attribute NULLABLE_INT8S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 277: {
            LogStep(277, "Write attribute NULLABLE_INT16S Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 278: {
            LogStep(278, "Read attribute NULLABLE_INT16S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 279: {
            LogStep(279, "Write attribute NULLABLE_INT16S Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -32768;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 280: {
            LogStep(280, "Read attribute NULLABLE_INT16S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 281: {
            LogStep(281, "Write attribute NULLABLE_INT16S null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 282: {
            LogStep(282, "Read attribute NULLABLE_INT16S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 283: {
            LogStep(283, "Read attribute NULLABLE_INT16S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 284: {
            LogStep(284, "Read attribute NULLABLE_INT16S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 285: {
            LogStep(285, "Write attribute NULLABLE_INT16S Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 286: {
            LogStep(286, "Read attribute NULLABLE_INT16S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 287: {
            LogStep(287, "Read attribute NULLABLE_INT16S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 288: {
            LogStep(288, "Write attribute NULLABLE_INT32S Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int32_t> value;
            value.SetNonNull();
            value.Value() = -2147483647L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 289: {
            LogStep(289, "Read attribute NULLABLE_INT32S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 290: {
            LogStep(290, "Write attribute NULLABLE_INT32S Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int32_t> value;
            value.SetNonNull();
            value.Value() = -2147483648L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 291: {
            LogStep(291, "Read attribute NULLABLE_INT32S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 292: {
            LogStep(292, "Write attribute NULLABLE_INT32S null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int32_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 293: {
            LogStep(293, "Read attribute NULLABLE_INT32S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 294: {
            LogStep(294, "Read attribute NULLABLE_INT32S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 295: {
            LogStep(295, "Read attribute NULLABLE_INT32S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 296: {
            LogStep(296, "Write attribute NULLABLE_INT32S Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int32_t> value;
            value.SetNonNull();
            value.Value() = -2147483647L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 297: {
            LogStep(297, "Read attribute NULLABLE_INT32S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 298: {
            LogStep(298, "Read attribute NULLABLE_INT32S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 299: {
            LogStep(299, "Write attribute NULLABLE_INT64S Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int64_t> value;
            value.SetNonNull();
            value.Value() = -9223372036854775807LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 300: {
            LogStep(300, "Read attribute NULLABLE_INT64S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 301: {
            LogStep(301, "Write attribute NULLABLE_INT64S Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int64_t> value;
            value.SetNonNull();
            value.Value() = static_cast<int64_t>(-9223372036854775807LL - 1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 302: {
            LogStep(302, "Read attribute NULLABLE_INT64S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 303: {
            LogStep(303, "Write attribute NULLABLE_INT64S null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int64_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 304: {
            LogStep(304, "Read attribute NULLABLE_INT64S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 305: {
            LogStep(305, "Read attribute NULLABLE_INT64S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 306: {
            LogStep(306, "Read attribute NULLABLE_INT64S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 307: {
            LogStep(307, "Write attribute NULLABLE_INT64S Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int64_t> value;
            value.SetNonNull();
            value.Value() = -9223372036854775807LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 308: {
            LogStep(308, "Read attribute NULLABLE_INT64S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 309: {
            LogStep(309, "Read attribute NULLABLE_INT64S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 310: {
            LogStep(310, "Write attribute NULLABLE_SINGLE medium Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNonNull();
            value.Value() = 0.1f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 311: {
            LogStep(311, "Read attribute NULLABLE_SINGLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 312: {
            LogStep(312, "Write attribute NULLABLE_SINGLE largest Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNonNull();
            value.Value() = INFINITY;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 313: {
            LogStep(313, "Read attribute NULLABLE_SINGLE largest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 314: {
            LogStep(314, "Write attribute NULLABLE_SINGLE smallest Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNonNull();
            value.Value() = -INFINITY;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 315: {
            LogStep(315, "Read attribute NULLABLE_SINGLE smallest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 316: {
            LogStep(316, "Write attribute NULLABLE_SINGLE null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 317: {
            LogStep(317, "Read attribute NULLABLE_SINGLE null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 318: {
            LogStep(318, "Write attribute NULLABLE_SINGLE 0 Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<float> value;
            value.SetNonNull();
            value.Value() = 0.0f;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 319: {
            LogStep(319, "Read attribute NULLABLE_SINGLE 0 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatSingle::Id,
                                 true, chip::NullOptional);
        }
        case 320: {
            LogStep(320, "Write attribute NULLABLE_DOUBLE medium Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNonNull();
            value.Value() = 0.1234567890123;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 321: {
            LogStep(321, "Read attribute NULLABLE_DOUBLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 322: {
            LogStep(322, "Write attribute NULLABLE_DOUBLE largest Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNonNull();
            value.Value() = INFINITY;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 323: {
            LogStep(323, "Read attribute NULLABLE_DOUBLE largest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 324: {
            LogStep(324, "Write attribute NULLABLE_DOUBLE smallest Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNonNull();
            value.Value() = -INFINITY;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 325: {
            LogStep(325, "Read attribute NULLABLE_DOUBLE smallest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 326: {
            LogStep(326, "Write attribute NULLABLE_DOUBLE null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 327: {
            LogStep(327, "Read attribute NULLABLE_DOUBLE null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 328: {
            LogStep(328, "Write attribute NULLABLE_DOUBLE 0 Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<double> value;
            value.SetNonNull();
            value.Value() = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 329: {
            LogStep(329, "Read attribute NULLABLE_DOUBLE 0 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableFloatDouble::Id,
                                 true, chip::NullOptional);
        }
        case 330: {
            LogStep(330, "Write attribute NULLABLE_ENUM8 Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 331: {
            LogStep(331, "Read attribute NULLABLE_ENUM8 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id, true,
                                 chip::NullOptional);
        }
        case 332: {
            LogStep(332, "Write attribute NULLABLE_ENUM8 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 254U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 333: {
            LogStep(333, "Read attribute NULLABLE_ENUM8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id, true,
                                 chip::NullOptional);
        }
        case 334: {
            LogStep(334, "Write attribute NULLABLE_ENUM8 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 335: {
            LogStep(335, "Read attribute NULLABLE_ENUM8 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id, true,
                                 chip::NullOptional);
        }
        case 336: {
            LogStep(336, "Write attribute NULLABLE_ENUM8 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 337: {
            LogStep(337, "Read attribute NULLABLE_ENUM8 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum8::Id, true,
                                 chip::NullOptional);
        }
        case 338: {
            LogStep(338, "Write attribute NULLABLE_ENUM16 Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 339: {
            LogStep(339, "Read attribute NULLABLE_ENUM16 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id, true,
                                 chip::NullOptional);
        }
        case 340: {
            LogStep(340, "Write attribute NULLABLE_ENUM16 Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65534U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 341: {
            LogStep(341, "Read attribute NULLABLE_ENUM16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id, true,
                                 chip::NullOptional);
        }
        case 342: {
            LogStep(342, "Write attribute NULLABLE_ENUM16 Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 343: {
            LogStep(343, "Read attribute NULLABLE_ENUM16 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id, true,
                                 chip::NullOptional);
        }
        case 344: {
            LogStep(344, "Write attribute NULLABLE_ENUM16 null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 345: {
            LogStep(345, "Read attribute NULLABLE_ENUM16 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnum16::Id, true,
                                 chip::NullOptional);
        }
        case 346: {
            LogStep(346, "Write attribute NULLABLE_SIMPLE_ENUM Min Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 347: {
            LogStep(347, "Read attribute NULLABLE_SIMPLE_ENUM Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 348: {
            LogStep(348, "Write attribute NULLABLE_SIMPLE_ENUM Max Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 349: {
            LogStep(349, "Read attribute NULLABLE_SIMPLE_ENUM Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 350: {
            LogStep(350, "Write attribute NULLABLE_SIMPLE_ENUM Invalid Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(255);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 351: {
            LogStep(351, "Read attribute NULLABLE_SIMPLE_ENUM unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 352: {
            LogStep(352, "Write attribute NULLABLE_SIMPLE_ENUM null Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 353: {
            LogStep(353, "Read attribute NULLABLE_SIMPLE_ENUM null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 354: {
            LogStep(354, "Read attribute NULLABLE_SIMPLE_ENUM not 3 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 355: {
            LogStep(355, "Read attribute NULLABLE_OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 356: {
            LogStep(356, "Write attribute NULLABLE_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            value.SetNonNull();
            value.Value() = chip::ByteSpan(chip::Uint8::from_const_char("TestValuegarbage: not in length on purpose"), 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 357: {
            LogStep(357, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 358: {
            LogStep(358, "Write attribute NULLABLE_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 359: {
            LogStep(359, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 360: {
            LogStep(360, "Write attribute NULLABLE_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            value.SetNonNull();
            value.Value() = chip::ByteSpan(chip::Uint8::from_const_char("garbage: not in length on purpose"), 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 361: {
            LogStep(361, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 362: {
            LogStep(362, "Read attribute NULLABLE_OCTET_STRING not TestValue");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 363: {
            LogStep(363, "Read attribute NULLABLE_CHAR_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 364: {
            LogStep(364, "Write attribute NULLABLE_CHAR_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::CharSpan> value;
            value.SetNonNull();
            value.Value() = chip::Span<const char>("☉T☉garbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 365: {
            LogStep(365, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 366: {
            LogStep(366, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 367: {
            LogStep(367, "Write attribute NULLABLE_CHAR_STRING - Value too long");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::CharSpan> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 368: {
            LogStep(368, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 369: {
            LogStep(369, "Write attribute NULLABLE_CHAR_STRING - Empty");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::CharSpan> value;
            value.SetNonNull();
            value.Value() = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 370: {
            LogStep(370, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 371: {
            LogStep(371, "Read attribute NULLABLE_CHAR_STRING not ☉T☉");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 372: {
            LogStep(372, "Read attribute from nonexistent endpoint.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(200), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 373: {
            LogStep(373, "Read attribute from nonexistent cluster.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 374: {
            LogStep(374, "Send a command that takes an optional parameter but do not set it.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestSimpleOptionalArgumentRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestSimpleOptionalArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 375: {
            LogStep(375, "Send a command that takes an optional parameter but do not set it.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestSimpleOptionalArgumentRequest::Type value;
            value.arg1.Emplace();
            value.arg1.Value() = 1;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestSimpleOptionalArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 376: {
            LogStep(376, "Subscribe to list attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, 2, 5,
                                      true, chip::NullOptional, chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 377: {
            LogStep(377, "Write subscribed-to list attribute");
            ListFreer listFreer;
            chip::app::DataModel::List<const uint8_t> value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 5U;
                listHolder_0->mList[1] = 6U;
                listHolder_0->mList[2] = 7U;
                listHolder_0->mList[3] = 8U;
                value                  = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 378: {
            LogStep(378, "Check for list attribute report");
            return WaitForReport();
        }
        case 379: {
            LogStep(379, "Read range-restricted unsigned 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 380: {
            LogStep(380, "Write min value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 381: {
            LogStep(381, "Write just-below-range value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 19U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 382: {
            LogStep(382, "Write just-above-range value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 101U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 383: {
            LogStep(383, "Write max value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 255U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 384: {
            LogStep(384, "Verify range-restricted unsigned 8-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 385: {
            LogStep(385, "Write min valid value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 20U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 386: {
            LogStep(386, "Verify range-restricted unsigned 8-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 387: {
            LogStep(387, "Write max valid value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 100U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 388: {
            LogStep(388, "Verify range-restricted unsigned 8-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 389: {
            LogStep(389, "Write middle valid value to a range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            uint8_t value;
            value = 50U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8u::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 390: {
            LogStep(390, "Verify range-restricted unsigned 8-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 391: {
            LogStep(391, "Read range-restricted unsigned 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 392: {
            LogStep(392, "Write min value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 393: {
            LogStep(393, "Write just-below-range value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 99U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 394: {
            LogStep(394, "Write just-above-range value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 1001U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 395: {
            LogStep(395, "Write max value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 65535U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 396: {
            LogStep(396, "Verify range-restricted unsigned 16-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 397: {
            LogStep(397, "Write min valid value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 100U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 398: {
            LogStep(398, "Verify range-restricted unsigned 16-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 399: {
            LogStep(399, "Write max valid value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 1000U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 400: {
            LogStep(400, "Verify range-restricted unsigned 16-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 401: {
            LogStep(401, "Write middle valid value to a range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            uint16_t value;
            value = 500U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 402: {
            LogStep(402, "Verify range-restricted unsigned 16-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 403: {
            LogStep(403, "Read range-restricted signed 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 404: {
            LogStep(404, "Write min value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = -128;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 405: {
            LogStep(405, "Write just-below-range value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = -41;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 406: {
            LogStep(406, "Write just-above-range value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = 51;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 407: {
            LogStep(407, "Write max value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = 127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 408: {
            LogStep(408, "Verify range-restricted signed 8-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 409: {
            LogStep(409, "Write min valid value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = -40;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 410: {
            LogStep(410, "Verify range-restricted signed 8-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 411: {
            LogStep(411, "Write max valid value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = 50;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 412: {
            LogStep(412, "Verify range-restricted signed 8-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 413: {
            LogStep(413, "Write middle valid value to a range-restricted signed 8-bit integer");
            ListFreer listFreer;
            int8_t value;
            value = 6;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt8s::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 414: {
            LogStep(414, "Verify range-restricted signed 8-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 415: {
            LogStep(415, "Read range-restricted signed 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 416: {
            LogStep(416, "Write min value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = -32768;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 417: {
            LogStep(417, "Write just-below-range value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = -151;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 418: {
            LogStep(418, "Write just-above-range value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = 201;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 419: {
            LogStep(419, "Write max value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = 32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 420: {
            LogStep(420, "Verify range-restricted signed 16-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 421: {
            LogStep(421, "Write min valid value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = -150;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 422: {
            LogStep(422, "Verify range-restricted signed 16-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 423: {
            LogStep(423, "Write max valid value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = 200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 424: {
            LogStep(424, "Verify range-restricted signed 16-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 425: {
            LogStep(425, "Write middle valid value to a range-restricted signed 16-bit integer");
            ListFreer listFreer;
            int16_t value;
            value = 7;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::RangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 426: {
            LogStep(426, "Verify range-restricted signed 16-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 427: {
            LogStep(427, "Read nullable range-restricted unsigned 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 428: {
            LogStep(428, "Write min value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 429: {
            LogStep(429, "Write just-below-range value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 19U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 430: {
            LogStep(430, "Write just-above-range value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 101U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 431: {
            LogStep(431, "Write max value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 254U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 432: {
            LogStep(432, "Verify nullable range-restricted unsigned 8-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 433: {
            LogStep(433, "Write min valid value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 20U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 434: {
            LogStep(434, "Verify nullable range-restricted unsigned 8-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 435: {
            LogStep(435, "Write max valid value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 100U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 436: {
            LogStep(436, "Verify nullable range-restricted unsigned 8-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 437: {
            LogStep(437, "Write middle valid value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 50U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 438: {
            LogStep(438, "Verify nullable range-restricted unsigned 8-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 439: {
            LogStep(439, "Write null value to a nullable range-restricted unsigned 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 440: {
            LogStep(440, "Verify nullable range-restricted unsigned 8-bit integer value is null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 441: {
            LogStep(441, "Read nullable range-restricted unsigned 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 442: {
            LogStep(442, "Write min value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 443: {
            LogStep(443, "Write just-below-range value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 99U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 444: {
            LogStep(444, "Write just-above-range value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 1001U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 445: {
            LogStep(445, "Write max value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 65534U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 446: {
            LogStep(446, "Verify nullable range-restricted unsigned 16-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 447: {
            LogStep(447, "Write min valid value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 100U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 448: {
            LogStep(448, "Verify nullable range-restricted unsigned 16-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 449: {
            LogStep(449, "Write max valid value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 1000U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 450: {
            LogStep(450, "Verify nullable range-restricted unsigned 16-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 451: {
            LogStep(451, "Write middle valid value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNonNull();
            value.Value() = 500U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 452: {
            LogStep(452, "Verify nullable range-restricted unsigned 16-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 453: {
            LogStep(453, "Write null value to a nullable range-restricted unsigned 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 454: {
            LogStep(454, "Verify nullable range-restricted unsigned 16-bit integer value is null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 455: {
            LogStep(455, "Read nullable range-restricted signed 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 456: {
            LogStep(456, "Write min value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 457: {
            LogStep(457, "Write just-below-range value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -41;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 458: {
            LogStep(458, "Write just-above-range value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = 51;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 459: {
            LogStep(459, "Write max value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = 127;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 460: {
            LogStep(460, "Verify nullable range-restricted signed 8-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 461: {
            LogStep(461, "Write min valid value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = -40;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 462: {
            LogStep(462, "Verify nullable range-restricted signed 8-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 463: {
            LogStep(463, "Write max valid value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = 50;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 464: {
            LogStep(464, "Verify nullable range-restricted signed 8-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 465: {
            LogStep(465, "Write middle valid value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNonNull();
            value.Value() = 6;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 466: {
            LogStep(466, "Verify nullable range-restricted signed 8-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 467: {
            LogStep(467, "Write null value to a nullable range-restricted signed 8-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 468: {
            LogStep(468, "Verify nullable range-restricted signed 8-bit integer value is at null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 469: {
            LogStep(469, "Read nullable range-restricted signed 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 470: {
            LogStep(470, "Write min value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 471: {
            LogStep(471, "Write just-below-range value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -151;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 472: {
            LogStep(472, "Write just-above-range value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = 201;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 473: {
            LogStep(473, "Write max value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = 32767;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 474: {
            LogStep(474, "Verify nullable range-restricted signed 16-bit integer value has not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 475: {
            LogStep(475, "Write min valid value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = -150;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 476: {
            LogStep(476, "Verify nullable range-restricted signed 16-bit integer value is at min valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 477: {
            LogStep(477, "Write max valid value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = 200;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 478: {
            LogStep(478, "Verify nullable range-restricted signed 16-bit integer value is at max valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 479: {
            LogStep(479, "Write middle valid value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNonNull();
            value.Value() = 7;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 480: {
            LogStep(480, "Verify nullable range-restricted signed 16-bit integer value is at mid valid");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 481: {
            LogStep(481, "Write null value to a nullable range-restricted signed 16-bit integer");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<int16_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                  UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 482: {
            LogStep(482, "Verify nullable range-restricted signed 16-bit integer value is null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                 UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 483: {
            LogStep(483, "Write attribute that returns general status on write");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::GeneralErrorBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 484: {
            LogStep(484, "Write attribute that returns cluster-specific status on write");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ClusterErrorBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 485: {
            LogStep(485, "Read attribute that returns general status on read");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::GeneralErrorBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 486: {
            LogStep(486, "read attribute that returns cluster-specific status on read");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ClusterErrorBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 487: {
            LogStep(487, "read AcceptedCommandList attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 488: {
            LogStep(488, "read GeneratedCommandList attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 489: {
            LogStep(489, "Write struct-typed attribute");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Structs::SimpleStruct::Type value;

            value.a = 5U;
            value.b = true;
            value.c = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.d = chip::ByteSpan(chip::Uint8::from_const_char("abcgarbage: not in length on purpose"), 3);
            value.e = chip::Span<const char>("garbage: not in length on purpose", 0);
            value.f = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::SimpleBitmap>>(17U);
            value.g = 1.5f;
            value.h = 3.14159265358979;

            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::StructAttr::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 490: {
            LogStep(490, "Read struct-typed attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::StructAttr::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestClusterComplexTypesSuite : public TestCommand
{
public:
    TestClusterComplexTypesSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestClusterComplexTypes", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestClusterComplexTypesSuite() {}

    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
    {
        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));
            {
                chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("wasPresent", value.wasPresent, true));
                VerifyOrReturn(CheckValuePresent("wasNull", value.wasNull));
                VerifyOrReturn(CheckValue("wasNull.Value()", value.wasNull.Value(), true));
                VerifyOrReturn(CheckValuePresent("originalValue", value.originalValue));
                VerifyOrReturn(CheckValueNull("originalValue.Value()", value.originalValue.Value()));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NEEDS_TIMED_INTERACTION));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("timedWriteBoolean", value, false));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NEEDS_TIMED_INTERACTION));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("timedWriteBoolean", value, false));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("timedWriteBoolean", value, false));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("timedWriteBoolean", value, true));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, false));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, false));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, true));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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, "Send Test Command with optional arg set to null.");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestNullableOptionalRequest::Type value;
            value.arg1.Emplace();
            value.arg1.Value().SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                               UnitTesting::Commands::TestNullableOptionalRequest::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send command that needs timed invoke without a timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TimedInvokeRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TimedInvokeRequest::Id,
                               value, chip::NullOptional, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send command that needs timed invoke with a long timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TimedInvokeRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TimedInvokeRequest::Id,
                               value, chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Send command that needs timed invoke with a too-short timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TimedInvokeRequest::Type value;
            ReturnErrorOnFailure(SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                             UnitTesting::Commands::TimedInvokeRequest::Id, value, chip::Optional<uint16_t>(1),
                                             chip::NullOptional

                                             ));

            using namespace chip::System::Clock::Literals;
            return BusyWaitFor(100_ms);
        }
        case 5: {
            LogStep(5, "Send command that does not need timed invoke with a long timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::Test::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Send command that does not need timed invoke with a too-short timeout value");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::Test::Type value;
            ReturnErrorOnFailure(SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::Test::Id,
                                             value, chip::Optional<uint16_t>(1), chip::NullOptional

                                             ));

            using namespace chip::System::Clock::Literals;
            return BusyWaitFor(100_ms);
        }
        case 7: {
            LogStep(7, "Read attribute that needs timed write initial state");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Write attribute that needs timed write without a timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read attribute that needs timed write state unchanged 1");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Write attribute that needs timed write with a too-short timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            ReturnErrorOnFailure(WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                                UnitTesting::Attributes::TimedWriteBoolean::Id, value, chip::Optional<uint16_t>(1),
                                                chip::NullOptional, chip::NullOptional));

            using namespace chip::System::Clock::Literals;
            return BusyWaitFor(100_ms);
        }
        case 11: {
            LogStep(11, "Read attribute that needs timed write state unchanged 2");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write attribute that needs timed write with a long timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                  value, chip::Optional<uint16_t>(10000), chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute that needs timed write state changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Write attribute that needs timed write reset to default");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::TimedWriteBoolean::Id,
                                  value, chip::Optional<uint16_t>(10000), chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute that does not need timed write initial value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Write attribute that does not need timed write with a too-short timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            ReturnErrorOnFailure(WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id,
                                                UnitTesting::Attributes::Boolean::Id, value, chip::Optional<uint16_t>(1),
                                                chip::NullOptional, chip::NullOptional));

            using namespace chip::System::Clock::Literals;
            return BusyWaitFor(100_ms);
        }
        case 17: {
            LogStep(17, "Read attribute that does not need timed write unchanged value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Write attribute that does not need timed write with a long timeout value");
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::Optional<uint16_t>(10000), chip::NullOptional, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read attribute that does not need timed write changed value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Write attribute that does not need timed write reset to default");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestConstraintsSuite : public TestCommand
{
public:
    TestConstraintsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestConstraints", 55, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestConstraintsSuite() {}

    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
    {
        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::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintContains("value", value, 2U));
                VerifyOrReturn(CheckConstraintContains("value", value, 3U));
                VerifyOrReturn(CheckConstraintContains("value", value, 4U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintExcludes("value", value, 0U));
                VerifyOrReturn(CheckConstraintExcludes("value", value, 5U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 5UL));
                VerifyOrReturn(CheckConstraintHasMasksClear("value", value, 2UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 5UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 5UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 5UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            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));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 5UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, 6UL));
            }
            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;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 5));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 20));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintStartsWith("value", value, "**"));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintEndsWith("value", value, "**"));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, true));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, false));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, true));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, false));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, false));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, false));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, true));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, true));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, true));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, true));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, true));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, false));
            }
            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::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, false));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, true));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsUpperCase("value", value, true));
                VerifyOrReturn(CheckConstraintIsLowerCase("value", value, true));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsHexString("value", value, false));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintIsHexString("value", value, true));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableInt8u", value));
                VerifyOrReturn(CheckValue("nullableInt8u.Value()", value.Value(), 0U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("nullableOctetString", value));
                VerifyOrReturn(CheckValueAsString("nullableOctetString.Value()", value.Value(),
                                                  chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::ByteSpan> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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, "Write attribute LIST With List of INT8U");
            ListFreer listFreer;
            chip::app::DataModel::List<const uint8_t> value;

            {
                auto * listHolder_0 = new ListHolder<uint8_t>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 2U;
                listHolder_0->mList[2] = 3U;
                listHolder_0->mList[3] = 4U;
                value                  = chip::app::DataModel::List<uint8_t>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute LIST With Partial List of INT8U that should be in it");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute LIST With Partial List of INT8U that should not be included");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Write attribute LIST Back to Default Value");
            ListFreer listFreer;
            chip::app::DataModel::List<const uint8_t> value;

            value = chip::app::DataModel::List<uint8_t>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Write attribute BITMAP32 with MaskVal1 and MaskVal3");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(5UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal2 is not set");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal1 is set");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal3 is set");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure Maskval1 and MaskVal3 are set");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write attribute BITMAP32 Back to Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(0UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write attribute INT32U Value");
            ListFreer listFreer;
            uint32_t value;
            value = 5UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute INT32U Value MinValue Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read attribute INT32U Value MaxValue Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute INT32U Value NotValue Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Write attribute INT32U Value Back to Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = 0UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("** Test **garbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute CHAR_STRING Value MinLength Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read attribute CHAR_STRING Value MaxLength Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read attribute CHAR_STRING Value StartsWith Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read attribute CHAR_STRING Value EndsWith Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("lowercasegarbage: not in length on purpose", 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("UPPERCASEgarbage: not in length on purpose", 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("lowUPPERgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Write attribute CHAR_STRING Value with only digits");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("1234567890garbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Write attribute CHAR_STRING Value with only non-letters");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("12.4,76:garbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Write attribute CHAR_STRING Value with uppercase letters and symbols");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("ABC;.* garbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Write attribute CHAR_STRING Value with lowercase letters and symbols");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("abc;.* garbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Write attribute CHAR_STRING Value which is empty");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("ABCDEF012Vgarbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Read attribute CHAR_STRING Value isHexString Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Write attribute CHAR_STRING Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("ABCDEF0123garbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read attribute CHAR_STRING Value isHexString Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Write attribute CHAR_STRING Value Back to Default Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Read attribute NULLABLE_INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Write attribute NULLABLE_INT8U with a value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Read attribute NULLABLE_INT8U with a value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Write attribute NULLABLE_INT8U without a value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Read attribute NULLABLE_INT8U with a value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Write attribute NULLABLE_INT8U back to Default Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Read attribute NULLABLE_OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Write attribute NULLABLE_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            value.SetNonNull();
            value.Value() = chip::ByteSpan(chip::Uint8::from_const_char("TestValuegarbage: not in length on purpose"), 9);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 52: {
            LogStep(52, "Write attribute NULLABLE_OCTET_STRING");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Write attribute NULLABLE_OCTET_STRING back to Default Value");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            value.SetNonNull();
            value.Value() = chip::ByteSpan(chip::Uint8::from_const_char("garbage: not in length on purpose"), 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestDelayCommandsSuite : public TestCommand
{
public:
    TestDelayCommandsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestDelayCommands", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestDelayCommandsSuite() {}

    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
    {
        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));
            shouldContinue = true;
            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;
        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, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestEventsSuite : public TestCommand
{
public:
    TestEventsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestEvents", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestEventsSuite() {}

    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;

    uint64_t eventNumber;

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 1:
            switch (mTestSubStepIndex)
            {
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 2:
            switch (mTestSubStepIndex)
            {
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                eventNumber = value.value;
            }
            break;
        case 4:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 2U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 5:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 2U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 6:
            switch (mTestSubStepIndex)
            {
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, static_cast<uint64_t>(eventNumber + 1)));
            }
            break;
        case 8:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 2U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                mTestSubStepIndex++;
                break;
            case 1:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 3U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, false));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 9:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 2U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                mTestSubStepIndex++;
                break;
            case 1:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 3U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 1U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, false));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("value", value.value, static_cast<uint64_t>(eventNumber + 2)));
            }
            break;
        case 11:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("testEvent.arg1", value.arg1, 4U));
                    VerifyOrReturn(CheckValue("testEvent.arg2", value.arg2, 3U));
                    VerifyOrReturn(CheckValue("testEvent.arg3", value.arg3, true));
                }
                shouldContinue = true;
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            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;
        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, "Check there is no event on the target endpoint");
            mTestSubStepCount = 0;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Check reading events from an invalid endpoint");
            mTestSubStepCount = 0;
            return ReadEvent(kIdentityAlpha, GetEndpoint(0), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Generate an event on the accessory");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventRequest::Type value;
            value.arg1 = 1U;
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(2);
            value.arg3 = true;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEmitTestEventRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Read the event back");
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the event with eventNumber set to the event value");
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::Optional<chip::EventNumber>(eventNumber));
        }
        case 6: {
            LogStep(6, "Read the event with eventNumber set to the event value + 1");
            mTestSubStepCount = 0;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::Optional<chip::EventNumber>(eventNumber + 1));
        }
        case 7: {
            LogStep(7, "Generate a second event on the accessory");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventRequest::Type value;
            value.arg1 = 3U;
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(1);
            value.arg3 = false;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEmitTestEventRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Read the event back");
            mTestSubStepCount = 2;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Subscribe to the event");
            mTestSubStepCount = 2;
            return SubscribeEvent(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Events::TestEvent::Id, 3, 5, false,
                                  chip::NullOptional, chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Generate a third event on the accessory");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestEmitTestEventRequest::Type value;
            value.arg1 = 4U;
            value.arg2 = static_cast<chip::app::Clusters::UnitTesting::SimpleEnum>(3);
            value.arg3 = true;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestEmitTestEventRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Check for event report");
            mTestSubStepCount = 1;
            return WaitForReport();
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestDiscoverySuite : public TestCommand
{
public:
    TestDiscoverySuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestDiscovery", 30, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("shortDiscriminator", 0, UINT16_MAX, &mShortDiscriminator);
        AddArgument("vendorId", 0, UINT16_MAX, &mVendorId);
        AddArgument("productId", 0, UINT16_MAX, &mProductId);
        AddArgument("deviceType", 0, UINT16_MAX, &mDeviceType);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestDiscoverySuite()
    {
        if (deviceInstanceNameBeforeRebootBuffer != nullptr)
        {
            chip::Platform::MemoryFree(deviceInstanceNameBeforeRebootBuffer);
            deviceInstanceNameBeforeRebootBuffer = nullptr;
        }
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<uint16_t> mShortDiscriminator;
    chip::Optional<uint16_t> mVendorId;
    chip::Optional<uint16_t> mProductId;
    chip::Optional<uint16_t> mDeviceType;
    chip::Optional<uint16_t> mTimeout;

    char * deviceInstanceNameBeforeRebootBuffer = nullptr;
    chip::CharSpan deviceInstanceNameBeforeReboot;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value.instanceName", value.instanceName, 16));
                VerifyOrReturn(CheckConstraintMaxLength("value.instanceName", value.instanceName, 16));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.instanceName", value.instanceName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.instanceName", value.instanceName, true));
                if (deviceInstanceNameBeforeRebootBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(deviceInstanceNameBeforeRebootBuffer);
                }
                deviceInstanceNameBeforeRebootBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.instanceName.size()));
                memcpy(deviceInstanceNameBeforeRebootBuffer, value.instanceName.data(), value.instanceName.size());
                deviceInstanceNameBeforeReboot = chip::CharSpan(deviceInstanceNameBeforeRebootBuffer, value.instanceName.size());
            }
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value.hostName", value.hostName, 12));
                VerifyOrReturn(CheckConstraintMaxLength("value.hostName", value.hostName, 16));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.hostName", value.hostName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.hostName", value.hostName, true));
            }
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value.hostName", value.hostName, 16));
                VerifyOrReturn(CheckConstraintMaxLength("value.hostName", value.hostName, 16));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.hostName", value.hostName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.hostName", value.hostName, true));
            }
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("longDiscriminator", value.longDiscriminator,
                                          mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U));
                VerifyOrReturn(CheckConstraintMinValue("value.longDiscriminator", value.longDiscriminator, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value.longDiscriminator", value.longDiscriminator, 4096U));
            }
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value.vendorId, mVendorId.HasValue() ? mVendorId.Value() : 65521U));
            }
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (value.mrpRetryIntervalIdle.HasValue())
                {
                    VerifyOrReturn(
                        CheckConstraintMinValue("value.mrpRetryIntervalIdle.Value()", value.mrpRetryIntervalIdle.Value(), 0UL));
                    VerifyOrReturn(CheckConstraintMaxValue("value.mrpRetryIntervalIdle.Value()", value.mrpRetryIntervalIdle.Value(),
                                                           3600000UL));
                }
            }
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (value.mrpRetryIntervalActive.HasValue())
                {
                    VerifyOrReturn(
                        CheckConstraintMinValue("value.mrpRetryIntervalActive.Value()", value.mrpRetryIntervalActive.Value(), 0UL));
                    VerifyOrReturn(CheckConstraintMaxValue("value.mrpRetryIntervalActive.Value()",
                                                           value.mrpRetryIntervalActive.Value(), 3600000UL));
                }
            }
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("commissioningMode", value.commissioningMode, 1U));
            }
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("deviceType", value.deviceType, mDeviceType.HasValue() ? mDeviceType.Value() : 65535UL));
            }
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxLength("value.deviceName", value.deviceName, 32));
            }
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxValue("value.rotatingIdLen", value.rotatingIdLen, 100ULL));
            }
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value.pairingHint", value.pairingHint, 0U));
            }
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMaxLength("value.pairingInstruction", value.pairingInstruction, 128));
            }
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value.numIPs", value.numIPs, 1U));
            }
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DiscoveryCommands::Commands::DiscoveryCommandResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinLength("value.instanceName", value.instanceName, 16));
                VerifyOrReturn(CheckConstraintMaxLength("value.instanceName", value.instanceName, 16));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.instanceName", value.instanceName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.instanceName", value.instanceName, true));
                VerifyOrReturn(CheckConstraintNotValue("value.instanceName", value.instanceName, deviceInstanceNameBeforeReboot));
            }
            shouldContinue = true;
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Stop target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Start target device with the provided discriminator for basic commissioning advertisement");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            return Start(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "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 3: {
            LogStep(3, "Open Commissioning Window with too-short timeout");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 120U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Open Commissioning Window with too-long timeout");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 1000U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Open Commissioning Window");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check Instance Name");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Check Hostname");
            VerifyOrDo(!ShouldSkip("(MCORE.COM.WIFI || MCORE.COM.ETH) && !MCORE.COM.THR"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Check Hostname");
            VerifyOrDo(!ShouldSkip("(!MCORE.COM.WIFI && !MCORE.COM.ETH) && MCORE.COM.THR"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Check Long Discriminator _L");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByLongDiscriminator::Type value;
            value.value = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840ULL;
            return FindCommissionableByLongDiscriminator(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Check Short Discriminator (_S)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByShortDiscriminator::Type value;
            value.value = mShortDiscriminator.HasValue() ? mShortDiscriminator.Value() : 15ULL;
            return FindCommissionableByShortDiscriminator(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Check Commissioning Mode (_CM)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByCommissioningMode::Type value;
            return FindCommissionableByCommissioningMode(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "Check Vendor ID (_V)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.VENDOR_SUBTYPE"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByVendorId::Type value;
            value.value = mVendorId.HasValue() ? mVendorId.Value() : 65521ULL;
            return FindCommissionableByVendorId(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Check Device Type ID (_T)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.DEVTYPE_SUBTYPE"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByDeviceType::Type value;
            value.value = mDeviceType.HasValue() ? mDeviceType.Value() : 65535ULL;
            return FindCommissionableByDeviceType(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TXT key for discriminator (D)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "TXT key for Vendor ID and Product ID (VP)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.VP_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "Optional TXT key for MRP Sleepy Idle Interval (SII)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.SII_COMM_DISCOVERY_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Optional TXT key for MRP Sleepy Active Interval (SAI)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.SAI_COMM_DISCOVERY_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TXT key for commissioning mode (CM)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Optional TXT key for device type (DT)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.DT_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Optional TXT key for device name (DN)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.DN_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Optional TXT key for rotating device identifier (RI)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.RI_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "Optional TXT key for pairing hint (PH)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.PH_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "Optional TXT key for pairing instructions (PI)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.PI_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "Check IPs");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "Stop target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "Start target device with the provided discriminator for basic commissioning advertisement");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            return Start(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "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 28: {
            LogStep(28, "Open Commissioning Window");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Check Instance Name");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestLogCommandsSuite : public TestCommand
{
public:
    TestLogCommandsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestLogCommands", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestLogCommandsSuite() {}

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Log a simple message");
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::Log::Type value;
            value.message = chip::Span<const char>("This is a simple messagegarbage: not in length on purpose", 24);
            return Log(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Do a simple user prompt message");
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("This is a simple messagegarbage: not in length on purpose", 24);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSaveAsSuite : public TestCommand
{
public:
    TestSaveAsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestSaveAs", 110, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSaveAsSuite()
    {
        if (readAttributeCharStringDefaultValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readAttributeCharStringDefaultValueBuffer);
            readAttributeCharStringDefaultValueBuffer = nullptr;
        }
        if (readAttributeCharStringNotDefaultValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readAttributeCharStringNotDefaultValueBuffer);
            readAttributeCharStringNotDefaultValueBuffer = nullptr;
        }
        if (readAttributeOctetStringDefaultValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readAttributeOctetStringDefaultValueBuffer);
            readAttributeOctetStringDefaultValueBuffer = nullptr;
        }
        if (readAttributeOctetStringNotDefaultValueBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readAttributeOctetStringNotDefaultValueBuffer);
            readAttributeOctetStringNotDefaultValueBuffer = nullptr;
        }
    }

    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;

    uint8_t TestAddArgumentDefaultValue;
    bool readAttributeBooleanDefaultValue;
    chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> readAttributeBitmap8DefaultValue;
    chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> readAttributeBitmap16DefaultValue;
    chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> readAttributeBitmap32DefaultValue;
    chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> readAttributeBitmap64DefaultValue;
    uint8_t readAttributeInt8uDefaultValue;
    uint16_t readAttributeInt16uDefaultValue;
    uint32_t readAttributeInt32uDefaultValue;
    uint64_t readAttributeInt64uDefaultValue;
    int8_t readAttributeInt8sDefaultValue;
    int16_t readAttributeInt16sDefaultValue;
    int32_t readAttributeInt32sDefaultValue;
    int64_t readAttributeInt64sDefaultValue;
    uint8_t readAttributeEnum8DefaultValue;
    uint16_t readAttributeEnum16DefaultValue;
    uint64_t readAttributeEpochUSDefaultValue;
    uint32_t readAttributeEpochSDefaultValue;
    chip::VendorId readAttributeVendorIdDefaultValue;
    char * readAttributeCharStringDefaultValueBuffer = nullptr;
    chip::CharSpan readAttributeCharStringDefaultValue;
    char * readAttributeCharStringNotDefaultValueBuffer = nullptr;
    chip::CharSpan readAttributeCharStringNotDefaultValue;
    uint8_t * readAttributeOctetStringDefaultValueBuffer = nullptr;
    chip::ByteSpan readAttributeOctetStringDefaultValue;
    uint8_t * readAttributeOctetStringNotDefaultValueBuffer = nullptr;
    chip::ByteSpan readAttributeOctetStringNotDefaultValue;

    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
    {
        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));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, 20U));
                TestAddArgumentDefaultValue = value.returnValue;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, TestAddArgumentDefaultValue));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value.returnValue", value.returnValue, TestAddArgumentDefaultValue));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, 0));
                readAttributeBooleanDefaultValue = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBooleanDefaultValue));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("boolean", value, readAttributeBooleanDefaultValue));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, 0U));
                readAttributeBitmap8DefaultValue = value;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBitmap8DefaultValue));
            }
            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::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap8", value, readAttributeBitmap8DefaultValue));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, 0U));
                readAttributeBitmap16DefaultValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBitmap16DefaultValue));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap16", value, readAttributeBitmap16DefaultValue));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, 0UL));
                readAttributeBitmap32DefaultValue = value;
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBitmap32DefaultValue));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap32", value, readAttributeBitmap32DefaultValue));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, 0ULL));
                readAttributeBitmap64DefaultValue = value;
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeBitmap64DefaultValue));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("bitmap64", value, readAttributeBitmap64DefaultValue));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, 0U));
                readAttributeInt8uDefaultValue = value;
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt8uDefaultValue));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8u", value, readAttributeInt8uDefaultValue));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, 0U));
                readAttributeInt16uDefaultValue = value;
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt16uDefaultValue));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16u", value, readAttributeInt16uDefaultValue));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, 0UL));
                readAttributeInt32uDefaultValue = value;
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt32uDefaultValue));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32u", value, readAttributeInt32uDefaultValue));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, 0ULL));
                readAttributeInt64uDefaultValue = value;
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt64uDefaultValue));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64u", value, readAttributeInt64uDefaultValue));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, 0));
                readAttributeInt8sDefaultValue = value;
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt8sDefaultValue));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int8s", value, readAttributeInt8sDefaultValue));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, 0));
                readAttributeInt16sDefaultValue = value;
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt16sDefaultValue));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int16s", value, readAttributeInt16sDefaultValue));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, 0L));
                readAttributeInt32sDefaultValue = value;
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt32sDefaultValue));
            }
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int32s", value, readAttributeInt32sDefaultValue));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, 0LL));
                readAttributeInt64sDefaultValue = value;
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeInt64sDefaultValue));
            }
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("int64s", value, readAttributeInt64sDefaultValue));
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, 0U));
                readAttributeEnum8DefaultValue = value;
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeEnum8DefaultValue));
            }
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum8", value, readAttributeEnum8DefaultValue));
            }
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, 0U));
                readAttributeEnum16DefaultValue = value;
            }
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeEnum16DefaultValue));
            }
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enum16", value, readAttributeEnum16DefaultValue));
            }
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, 0ULL));
                readAttributeEpochUSDefaultValue = value;
            }
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeEpochUSDefaultValue));
            }
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochUs", value, readAttributeEpochUSDefaultValue));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, 0UL));
                readAttributeEpochSDefaultValue = value;
            }
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeEpochSDefaultValue));
            }
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("epochS", value, readAttributeEpochSDefaultValue));
            }
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value, 0U));
                readAttributeVendorIdDefaultValue = value;
            }
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeVendorIdDefaultValue));
            }
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::VendorId value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("vendorId", value, readAttributeVendorIdDefaultValue));
            }
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("", 0)));
                if (readAttributeCharStringDefaultValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readAttributeCharStringDefaultValueBuffer);
                }
                readAttributeCharStringDefaultValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readAttributeCharStringDefaultValueBuffer, value.data(), value.size());
                readAttributeCharStringDefaultValue = chip::CharSpan(readAttributeCharStringDefaultValueBuffer, value.size());
            }
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, readAttributeCharStringDefaultValue));
            }
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("NotDefault", 10)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeCharStringDefaultValue));
                if (readAttributeCharStringNotDefaultValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readAttributeCharStringNotDefaultValueBuffer);
                }
                readAttributeCharStringNotDefaultValueBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readAttributeCharStringNotDefaultValueBuffer, value.data(), value.size());
                readAttributeCharStringNotDefaultValue = chip::CharSpan(readAttributeCharStringNotDefaultValueBuffer, value.size());
            }
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, readAttributeCharStringNotDefaultValue));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeCharStringDefaultValue));
            }
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("charString", value, chip::CharSpan("NotDefault", 10)));
            }
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char(""), 0)));
                if (readAttributeOctetStringDefaultValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readAttributeOctetStringDefaultValueBuffer);
                }
                readAttributeOctetStringDefaultValueBuffer = static_cast<uint8_t *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readAttributeOctetStringDefaultValueBuffer, value.data(), value.size());
                readAttributeOctetStringDefaultValue = chip::ByteSpan(readAttributeOctetStringDefaultValueBuffer, value.size());
            }
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value, readAttributeOctetStringDefaultValue));
            }
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("NotDefault"), 10)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeOctetStringDefaultValue));
                if (readAttributeOctetStringNotDefaultValueBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readAttributeOctetStringNotDefaultValueBuffer);
                }
                readAttributeOctetStringNotDefaultValueBuffer = static_cast<uint8_t *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readAttributeOctetStringNotDefaultValueBuffer, value.data(), value.size());
                readAttributeOctetStringNotDefaultValue =
                    chip::ByteSpan(readAttributeOctetStringNotDefaultValueBuffer, value.size());
            }
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("octetString", value, readAttributeOctetStringNotDefaultValue));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readAttributeOctetStringDefaultValue));
            }
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::ByteSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValueAsString("octetString", value, chip::ByteSpan(chip::Uint8::from_const_char("NotDefault"), 10)));
            }
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = TestAddArgumentDefaultValue;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Read attribute BOOLEAN Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write attribute BOOLEAN Not Default Value");
            ListFreer listFreer;
            bool value;
            value = 1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read attribute BOOLEAN Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write attribute BOOLEAN DefaultValue");
            ListFreer listFreer;
            bool value;
            value = readAttributeBooleanDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute BOOLEAN False");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read attribute BITMAP8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Write attribute BITMAP8 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>>(1U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read attribute BITMAP8 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write attribute BITMAP8 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
            value = readAttributeBitmap8DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute BITMAP8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read attribute BITMAP16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Write attribute BITMAP16 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>>(1U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read attribute BITMAP16 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write attribute BITMAP16 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
            value = readAttributeBitmap16DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute BITMAP16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Write attribute BITMAP32 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>>(1UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read attribute BITMAP32 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Write attribute BITMAP32 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            value = readAttributeBitmap32DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Write attribute BITMAP64 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>>(1ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Write attribute BITMAP64 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
            value = readAttributeBitmap64DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read attribute INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Write attribute INT8U Not Default Value");
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Read attribute INT8U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Write attribute INT8U Default Value");
            ListFreer listFreer;
            uint8_t value;
            value = readAttributeInt8uDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read attribute INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Read attribute INT16U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Write attribute INT16U Not Default Value");
            ListFreer listFreer;
            uint16_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read attribute INT16U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Write attribute INT16U Default Value");
            ListFreer listFreer;
            uint16_t value;
            value = readAttributeInt16uDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read attribute INT16U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Read attribute INT32U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Write attribute INT32U Not Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = 1UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read attribute INT32U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Write attribute INT32U Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = readAttributeInt32uDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Read attribute INT32U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Read attribute INT64U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Write attribute INT64U Not Default Value");
            ListFreer listFreer;
            uint64_t value;
            value = 1ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read attribute INT64U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Write attribute INT64U Default Value");
            ListFreer listFreer;
            uint64_t value;
            value = readAttributeInt64uDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Read attribute INT64U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Write attribute INT8S Not Default Value");
            ListFreer listFreer;
            int8_t value;
            value = 1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read attribute INT8S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 52: {
            LogStep(52, "Write attribute INT8S Default Value");
            ListFreer listFreer;
            int8_t value;
            value = readAttributeInt8sDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Write attribute INT16S Not Default Value");
            ListFreer listFreer;
            int16_t value;
            value = 1;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Read attribute INT16S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 57: {
            LogStep(57, "Write attribute INT16S Default Value");
            ListFreer listFreer;
            int16_t value;
            value = readAttributeInt16sDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Write attribute INT32S Not Default Value");
            ListFreer listFreer;
            int32_t value;
            value = 1L;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Read attribute INT32S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 62: {
            LogStep(62, "Write attribute INT32S Default Value");
            ListFreer listFreer;
            int32_t value;
            value = readAttributeInt32sDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 65: {
            LogStep(65, "Write attribute INTS Not Default Value");
            ListFreer listFreer;
            int64_t value;
            value = 1LL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 66: {
            LogStep(66, "Read attribute INT64S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 67: {
            LogStep(67, "Write attribute INT64S Default Value");
            ListFreer listFreer;
            int64_t value;
            value = readAttributeInt64sDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 68: {
            LogStep(68, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Read attribute ENUM8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 70: {
            LogStep(70, "Write attribute ENUM8 Not Default Value");
            ListFreer listFreer;
            uint8_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Read attribute ENUM8 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 72: {
            LogStep(72, "Write attribute ENUM8 Default Value");
            ListFreer listFreer;
            uint8_t value;
            value = readAttributeEnum8DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 73: {
            LogStep(73, "Read attribute ENUM8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 74: {
            LogStep(74, "Read attribute ENUM16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 75: {
            LogStep(75, "Write attribute ENUM16 Not Default Value");
            ListFreer listFreer;
            uint16_t value;
            value = 1U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 76: {
            LogStep(76, "Read attribute ENUM16 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 77: {
            LogStep(77, "Write attribute ENUM16 Default Value");
            ListFreer listFreer;
            uint16_t value;
            value = readAttributeEnum16DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "Read attribute ENUM16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 79: {
            LogStep(79, "Read attribute EPOCH_US Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 80: {
            LogStep(80, "Write attribute EPOCH_US Not Default Value");
            ListFreer listFreer;
            uint64_t value;
            value = 1ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 81: {
            LogStep(81, "Read attribute EPOCH_US Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 82: {
            LogStep(82, "Write attribute EPOCH_US Default Value");
            ListFreer listFreer;
            uint64_t value;
            value = readAttributeEpochUSDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 83: {
            LogStep(83, "Read attribute EPOCH_US Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 84: {
            LogStep(84, "Read attribute EPOCH_S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 85: {
            LogStep(85, "Write attribute EPOCH_S Not Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = 1UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 86: {
            LogStep(86, "Read attribute EPOCH_S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 87: {
            LogStep(87, "Write attribute EPOCH_S Default Value");
            ListFreer listFreer;
            uint32_t value;
            value = readAttributeEpochSDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 88: {
            LogStep(88, "Read attribute EPOCH_S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 89: {
            LogStep(89, "Read attribute vendor_id Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 90: {
            LogStep(90, "Write attribute vendor_id Not Default Value");
            ListFreer listFreer;
            chip::VendorId value;
            value = static_cast<chip::VendorId>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 91: {
            LogStep(91, "Read attribute vendor_id Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 92: {
            LogStep(92, "Write attribute vendor_id Default Value");
            ListFreer listFreer;
            chip::VendorId value;
            value = readAttributeVendorIdDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 93: {
            LogStep(93, "Read attribute vendor_id Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 94: {
            LogStep(94, "Read attribute char_string Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 95: {
            LogStep(95, "Read attribute char_string Default Value and compare to saved value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 96: {
            LogStep(96, "Write attribute char_string Not Default Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("NotDefaultgarbage: not in length on purpose", 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 97: {
            LogStep(97, "Read attribute char_string Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 98: {
            LogStep(98, "Read attribute char_string Not Default Value and compare to saved value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 99: {
            LogStep(99, "Write attribute char_string Not Default Value from saved value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = readAttributeCharStringNotDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 100: {
            LogStep(100, "Read attribute char_string Not Default Value and compare to expected value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 101: {
            LogStep(101, "Write attribute char_string Default Value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = readAttributeCharStringDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 102: {
            LogStep(102, "Read attribute octet_string Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 103: {
            LogStep(103, "Read attribute octet_string Default Value and compare to saved value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 104: {
            LogStep(104, "Write attribute octet_string Not Default Value");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = chip::ByteSpan(chip::Uint8::from_const_char("NotDefaultgarbage: not in length on purpose"), 10);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 105: {
            LogStep(105, "Read attribute octet_string Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 106: {
            LogStep(106, "Read attribute octet_string Not Default Value and compare to saved value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 107: {
            LogStep(107, "Write attribute octet_string Not Default Value from saved value");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = readAttributeOctetStringNotDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 108: {
            LogStep(108, "Read attribute octet_string Not Default Value and compare to expected value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, true,
                                 chip::NullOptional);
        }
        case 109: {
            LogStep(109, "Write attribute octet_string Default Value");
            ListFreer listFreer;
            chip::ByteSpan value;
            value = readAttributeOctetStringDefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestConfigVariablesSuite : public TestCommand
{
public:
    TestConfigVariablesSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestConfigVariables", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("arg1", 0, UINT8_MAX, &mArg1);
        AddArgument("returnValueWithArg1", 0, UINT8_MAX, &mReturnValueWithArg1);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestConfigVariablesSuite() {}

    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<uint8_t> mArg1;
    chip::Optional<uint8_t> mReturnValueWithArg1;
    chip::Optional<uint16_t> mTimeout;

    uint8_t TestAddArgumentDefaultValue;

    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
    {
        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));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue, 20U));
                TestAddArgumentDefaultValue = value.returnValue;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("returnValue", value.returnValue,
                                          mReturnValueWithArg1.HasValue() ? mReturnValueWithArg1.Value() : 25U));
            }
            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;
        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, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::UnitTesting::Commands::TestAddArguments::Type value;
            value.arg1 = mArg1.HasValue() ? mArg1.Value() : 5U;
            value.arg2 = TestAddArgumentDefaultValue;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), UnitTesting::Id, UnitTesting::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestDescriptorClusterSuite : public TestCommand
{
public:
    TestDescriptorClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestDescriptorCluster", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestDescriptorClusterSuite() {}

    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
    {
        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));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Descriptor::Structs::DeviceTypeStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("deviceTypeList", iter_0, 0));
                    VerifyOrReturn(CheckValue("deviceTypeList[0].deviceType", iter_0.GetValue().deviceType, 22UL));
                    VerifyOrReturn(CheckValue("deviceTypeList[0].revision", iter_0.GetValue().revision, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("deviceTypeList", iter_0, 1));
                }
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ClusterId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 0));
                    VerifyOrReturn(CheckValue("serverList[0]", iter_0.GetValue(), 3UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 1));
                    VerifyOrReturn(CheckValue("serverList[1]", iter_0.GetValue(), 4UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 2));
                    VerifyOrReturn(CheckValue("serverList[2]", iter_0.GetValue(), 29UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 3));
                    VerifyOrReturn(CheckValue("serverList[3]", iter_0.GetValue(), 30UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 4));
                    VerifyOrReturn(CheckValue("serverList[4]", iter_0.GetValue(), 31UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 5));
                    VerifyOrReturn(CheckValue("serverList[5]", iter_0.GetValue(), 40UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 6));
                    VerifyOrReturn(CheckValue("serverList[6]", iter_0.GetValue(), 42UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 7));
                    VerifyOrReturn(CheckValue("serverList[7]", iter_0.GetValue(), 43UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 8));
                    VerifyOrReturn(CheckValue("serverList[8]", iter_0.GetValue(), 44UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 9));
                    VerifyOrReturn(CheckValue("serverList[9]", iter_0.GetValue(), 45UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 10));
                    VerifyOrReturn(CheckValue("serverList[10]", iter_0.GetValue(), 46UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 11));
                    VerifyOrReturn(CheckValue("serverList[11]", iter_0.GetValue(), 47UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 12));
                    VerifyOrReturn(CheckValue("serverList[12]", iter_0.GetValue(), 48UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 13));
                    VerifyOrReturn(CheckValue("serverList[13]", iter_0.GetValue(), 49UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 14));
                    VerifyOrReturn(CheckValue("serverList[14]", iter_0.GetValue(), 50UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 15));
                    VerifyOrReturn(CheckValue("serverList[15]", iter_0.GetValue(), 51UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 16));
                    VerifyOrReturn(CheckValue("serverList[16]", iter_0.GetValue(), 52UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 17));
                    VerifyOrReturn(CheckValue("serverList[17]", iter_0.GetValue(), 53UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 18));
                    VerifyOrReturn(CheckValue("serverList[18]", iter_0.GetValue(), 54UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 19));
                    VerifyOrReturn(CheckValue("serverList[19]", iter_0.GetValue(), 55UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 20));
                    VerifyOrReturn(CheckValue("serverList[20]", iter_0.GetValue(), 60UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 21));
                    VerifyOrReturn(CheckValue("serverList[21]", iter_0.GetValue(), 62UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 22));
                    VerifyOrReturn(CheckValue("serverList[22]", iter_0.GetValue(), 63UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 23));
                    VerifyOrReturn(CheckValue("serverList[23]", iter_0.GetValue(), 64UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 24));
                    VerifyOrReturn(CheckValue("serverList[24]", iter_0.GetValue(), 65UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 25));
                    VerifyOrReturn(CheckValue("serverList[25]", iter_0.GetValue(), 70UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 26));
                    VerifyOrReturn(CheckValue("serverList[26]", iter_0.GetValue(), 1029UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("serverList", iter_0, 27));
                    VerifyOrReturn(CheckValue("serverList[27]", iter_0.GetValue(), 4294048774UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("serverList", iter_0, 28));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::ClusterId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("clientList", iter_0, 0));
                    VerifyOrReturn(CheckValue("clientList[0]", iter_0.GetValue(), 41UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("clientList", iter_0, 1));
                }
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::EndpointId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("partsList", iter_0, 0));
                    VerifyOrReturn(CheckValue("partsList[0]", iter_0.GetValue(), 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("partsList", iter_0, 1));
                    VerifyOrReturn(CheckValue("partsList[1]", iter_0.GetValue(), 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("partsList", iter_0, 2));
                }
            }
            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;
        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, "Read attribute Device list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::DeviceTypeList::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read attribute Server list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::ServerList::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read attribute Client list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::ClientList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read attribute Parts list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Descriptor::Id, Descriptor::Attributes::PartsList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestBasicInformationSuite : public TestCommand
{
public:
    TestBasicInformationSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestBasicInformation", 19, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestBasicInformationSuite() {}

    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
    {
        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));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("location", value, chip::CharSpan("XX", 2)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("location", value, chip::CharSpan("US", 2)));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 0));
                    VerifyOrReturn(CheckValue("attributeList[0]", iter_0.GetValue(), 0UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 1));
                    VerifyOrReturn(CheckValue("attributeList[1]", iter_0.GetValue(), 1UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 2));
                    VerifyOrReturn(CheckValue("attributeList[2]", iter_0.GetValue(), 2UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 3));
                    VerifyOrReturn(CheckValue("attributeList[3]", iter_0.GetValue(), 3UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 4));
                    VerifyOrReturn(CheckValue("attributeList[4]", iter_0.GetValue(), 4UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 5));
                    VerifyOrReturn(CheckValue("attributeList[5]", iter_0.GetValue(), 5UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 6));
                    VerifyOrReturn(CheckValue("attributeList[6]", iter_0.GetValue(), 6UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 7));
                    VerifyOrReturn(CheckValue("attributeList[7]", iter_0.GetValue(), 7UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 8));
                    VerifyOrReturn(CheckValue("attributeList[8]", iter_0.GetValue(), 8UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 9));
                    VerifyOrReturn(CheckValue("attributeList[9]", iter_0.GetValue(), 9UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 10));
                    VerifyOrReturn(CheckValue("attributeList[10]", iter_0.GetValue(), 10UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 11));
                    VerifyOrReturn(CheckValue("attributeList[11]", iter_0.GetValue(), 11UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 12));
                    VerifyOrReturn(CheckValue("attributeList[12]", iter_0.GetValue(), 12UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 13));
                    VerifyOrReturn(CheckValue("attributeList[13]", iter_0.GetValue(), 13UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 14));
                    VerifyOrReturn(CheckValue("attributeList[14]", iter_0.GetValue(), 14UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 15));
                    VerifyOrReturn(CheckValue("attributeList[15]", iter_0.GetValue(), 15UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 16));
                    VerifyOrReturn(CheckValue("attributeList[16]", iter_0.GetValue(), 16UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 17));
                    VerifyOrReturn(CheckValue("attributeList[17]", iter_0.GetValue(), 18UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 18));
                    VerifyOrReturn(CheckValue("attributeList[18]", iter_0.GetValue(), 19UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 19));
                    VerifyOrReturn(CheckValue("attributeList[19]", iter_0.GetValue(), 20UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 20));
                    VerifyOrReturn(CheckValue("attributeList[20]", iter_0.GetValue(), 65528UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 21));
                    VerifyOrReturn(CheckValue("attributeList[21]", iter_0.GetValue(), 65529UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 22));
                    VerifyOrReturn(CheckValue("attributeList[22]", iter_0.GetValue(), 65531UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 23));
                    VerifyOrReturn(CheckValue("attributeList[23]", iter_0.GetValue(), 65532UL));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("attributeList", iter_0, 24));
                    VerifyOrReturn(CheckValue("attributeList[24]", iter_0.GetValue(), 65533UL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("attributeList", iter_0, 25));
                }
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 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));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("My node", 7)));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, false));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, true));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("My node", 7)));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("localConfigDisabled", value, true));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::BasicInformation::Structs::ProductAppearanceStruct::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("productAppearance.finish", value.finish, 2U));
                VerifyOrReturn(CheckValueNonNull("productAppearance.primaryColor", value.primaryColor));
                VerifyOrReturn(CheckValue("productAppearance.primaryColor.Value()", value.primaryColor.Value(), 5U));
            }
            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;
        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, "Read location");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Write location");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("USgarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read back location");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Restore initial location value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("XXgarbage: not in length on purpose", 2);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::Location::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read AttributeList value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read NodeLabel");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write NodeLabel");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("My nodegarbage: not in length on purpose", 7);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read back NodeLabel");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read LocalConfigDisabled");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::LocalConfigDisabled::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Write LocalConfigDisabled");
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::LocalConfigDisabled::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read back LocalConfigDisabled");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::LocalConfigDisabled::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Reboot the device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Connect to the device again");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Read back NodeLabel after reboot");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Restore initial NodeLabel value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read back LocalConfigDisabled after reboot");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::LocalConfigDisabled::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Restore initial LocalConfigDisabled value");
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                  BasicInformation::Attributes::LocalConfigDisabled::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the ProductApppearance value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id,
                                 BasicInformation::Attributes::ProductAppearance::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestFabricRemovalWhileSubscribedSuite : public TestCommand
{
public:
    TestFabricRemovalWhileSubscribedSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestFabricRemovalWhileSubscribed", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestFabricRemovalWhileSubscribedSuite() {}

    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> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    uint8_t ourFabricIndex;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("commissionedFabrics", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                ourFabricIndex = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        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, "Read number of commissioned fabrics");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CommissionedFabrics::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read current fabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Open commissioning window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = 74565ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 5: {
            LogStep(5, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = 74565ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 6: {
            LogStep(6, "Subscribe Fabrics Attribute from beta");
            return SubscribeAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                      OperationalCredentials::Attributes::Fabrics::Id, 2, 5, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Remove single own fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = ourFabricIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestGeneralCommissioningSuite : public TestCommand
{
public:
    TestGeneralCommissioningSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestGeneralCommissioning", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGeneralCommissioningSuite() {}

    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> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    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
    {
        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));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 137438953472ULL));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 81ULL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 0ULL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 1ULL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 3U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 1ULL));
            }
            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::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 4U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 1ULL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 2ULL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 4U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 2ULL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 2U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 2ULL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 0ULL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 3ULL));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("breadcrumb", value, 0ULL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "boolean", "boolean"));
            }
            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;
        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, "Write Breadcrumb (1/2)");
            ListFreer listFreer;
            uint64_t value;
            value = 137438953472ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read back Breadcrumb (1/2)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write Breadcrumb (2/2)");
            ListFreer listFreer;
            uint64_t value;
            value = 81ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read back Breadcrumb (2/2)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Reboot to reset Breadcrumb");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Connect to the device again");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Read back Breadcrumb after reboot and ensure it was not persisted");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Set Breadcrumb to nonzero value");
            ListFreer listFreer;
            uint64_t value;
            value = 1ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Check Breadcrumb set worked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Send CommissioningComplete without armed fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::CommissioningComplete::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::CommissioningComplete::Id, value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Check Breadcrumb was not touched by invalid CommissioningComplete");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Try to arm fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 10U;
            value.breadcrumb          = 5000ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Check Breadcrumb was not touched by ArmFailSafe with commissioning window open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Reset Breadcrumb to 0 so we can commission");
            ListFreer listFreer;
            uint64_t value;
            value = 0ULL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                  GeneralCommissioning::Attributes::Breadcrumb::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = 74565ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 17: {
            LogStep(17, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = 74565ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 18: {
            LogStep(18, "Arm fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 500U;
            value.breadcrumb          = 2ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Check Breadcrumb was properly set by ArmFailSafe");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Try to arm fail-safe from wrong fabric");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 10U;
            value.breadcrumb          = 5000ULL;
            return SendCommand(kIdentityBeta, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Check Breadcrumb was not touched by ArmFailSafe with existing fail-safe armed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Send CommissioningComplete from wrong fabric");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::CommissioningComplete::Type value;
            return SendCommand(kIdentityBeta, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::CommissioningComplete::Id, value, chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Check Breadcrumb was not touched by CommissioningComplete from wrong fabric");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Close out the fail-safe gracefully");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::CommissioningComplete::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::CommissioningComplete::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Check Breadcrumb was reset to 0 by CommissioningComplete");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Arm fail-safe again");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 500U;
            value.breadcrumb          = 3ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "Check Breadcrumb was set by arming fail-safe again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Force-expire the fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 0U;
            value.breadcrumb          = 4ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Check Breadcrumb was reset by expiring the fail-safe");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::Breadcrumb::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Validate presence of SupportsConcurrentConnection");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                                 GeneralCommissioning::Attributes::SupportsConcurrentConnection::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestIdentifyClusterSuite : public TestCommand
{
public:
    TestIdentifyClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestIdentifyCluster", 2, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestIdentifyClusterSuite() {}

    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
    {
        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;
        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;
        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, "Send Identify command and expect success response");
            ListFreer listFreer;
            chip::app::Clusters::Identify::Commands::Identify::Type value;
            value.identifyTime = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), Identify::Id, Identify::Commands::Identify::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestOperationalCredentialsClusterSuite : public TestCommand
{
public:
    TestOperationalCredentialsClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestOperationalCredentialsCluster", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestOperationalCredentialsClusterSuite() {}

    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;

    uint8_t ourFabricIndex;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                ourFabricIndex = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("statusCode", value.statusCode, 11U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, ourFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 1));
                }
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("statusCode", value.statusCode, 0U));
                VerifyOrReturn(CheckValuePresent("fabricIndex", value.fabricIndex));
                VerifyOrReturn(CheckValue("fabricIndex.Value()", value.fabricIndex.Value(), ourFabricIndex));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("Batcave", 7)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, ourFabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 1));
                }
            }
            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;
        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, "Read number of supported fabrics");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::SupportedFabrics::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read number of commissioned fabrics");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CommissionedFabrics::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read current fabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Remove nonexistent fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = 243U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Read fabric list before setting label");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Set the fabric label");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::UpdateFabricLabel::Type value;
            value.label = chip::Span<const char>("Batcavegarbage: not in length on purpose", 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::UpdateFabricLabel::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Read fabric list after setting label");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestModeSelectClusterSuite : public TestCommand
{
public:
    TestModeSelectClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestModeSelectCluster", 32, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestModeSelectClusterSuite() {}

    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;

    uint8_t currentModeBeforeToggle;
    chip::app::DataModel::Nullable<uint8_t> OnModeValue;

    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
    {
        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));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("description", value, chip::CharSpan("Coffee", 6)));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("standardNamespace", value));
                VerifyOrReturn(CheckValue("standardNamespace.Value()", value.Value(), 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::ModeSelect::Structs::ModeOptionStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("supportedModes", iter_0, 0));
                    VerifyOrReturn(
                        CheckValueAsString("supportedModes[0].label", iter_0.GetValue().label, chip::CharSpan("Black", 5)));
                    VerifyOrReturn(CheckValue("supportedModes[0].mode", iter_0.GetValue().mode, 0U));
                    {
                        auto iter_2 = iter_0.GetValue().semanticTags.begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[0].semanticTags", iter_2, 0));
                        VerifyOrReturn(CheckValue("supportedModes[0].semanticTags[0].value", iter_2.GetValue().value, 0U));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[0].semanticTags", iter_2, 1));
                    }
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("supportedModes", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("supportedModes[1].label", iter_0.GetValue().label, chip::CharSpan("Cappuccino", 10)));
                    VerifyOrReturn(CheckValue("supportedModes[1].mode", iter_0.GetValue().mode, 4U));
                    {
                        auto iter_2 = iter_0.GetValue().semanticTags.begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[1].semanticTags", iter_2, 0));
                        VerifyOrReturn(CheckValue("supportedModes[1].semanticTags[0].value", iter_2.GetValue().value, 0U));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[1].semanticTags", iter_2, 1));
                    }
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("supportedModes", iter_0, 2));
                    VerifyOrReturn(
                        CheckValueAsString("supportedModes[2].label", iter_0.GetValue().label, chip::CharSpan("Espresso", 8)));
                    VerifyOrReturn(CheckValue("supportedModes[2].mode", iter_0.GetValue().mode, 7U));
                    {
                        auto iter_2 = iter_0.GetValue().semanticTags.begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[2].semanticTags", iter_2, 0));
                        VerifyOrReturn(CheckValue("supportedModes[2].semanticTags[0].value", iter_2.GetValue().value, 0U));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().semanticTags)>(
                            "supportedModes[2].semanticTags", iter_2, 1));
                    }
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("supportedModes", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintMinLength("value", value, 3));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 3));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, 0U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("startUpMode", value));
                VerifyOrReturn(CheckValue("startUpMode.Value()", value.Value(), 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("onMode", value));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, 4U));
                currentModeBeforeToggle = value;
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, currentModeBeforeToggle));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("onMode", value));
                VerifyOrReturn(CheckValue("onMode.Value()", value.Value(), 7U));
                OnModeValue = value;
            }
            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;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, OnModeValue));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("startUpMode", value));
                VerifyOrReturn(CheckValue("startUpMode.Value()", value.Value(), 7U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, 4U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentMode", value, 7U));
            }
            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;
        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, "Read Description");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::Description::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read StandardNamespace");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StandardNamespace::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read SupportedModes");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::SupportedModes::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read CurrentMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read StartUpMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StartUpMode::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read OnMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Change to Supported Mode");
            ListFreer listFreer;
            chip::app::Clusters::ModeSelect::Commands::ChangeToMode::Type value;
            value.newMode = 4U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Commands::ChangeToMode::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Verify Current Mode Change");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Change to Unsupported Mode");
            ListFreer listFreer;
            chip::app::Clusters::ModeSelect::Commands::ChangeToMode::Type value;
            value.newMode = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Commands::ChangeToMode::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Toggle OnOff");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Toggle OnOff");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Verify Current Mode does not change when OnMode is null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Change to Unsupported OnMode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Change OnMode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 7U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Verify OnMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Toggle OnOff");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Toggle OnOff");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Verify Current Mode Changes if OnMode is not null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Change to Unsupported StartUp Mode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 2U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StartUpMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Change to Supported StartUp Mode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 7U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StartUpMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Verify StartUp Mode Change");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::StartUpMode::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Change CurrentMode to another value");
            ListFreer listFreer;
            chip::app::Clusters::ModeSelect::Commands::ChangeToMode::Type value;
            value.newMode = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Commands::ChangeToMode::Id, value,
                               chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Change On Mode");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 4U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Set StartUpOnOff");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::OnOff::OnOffStartUpOnOff>(1);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::StartUpOnOff::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Reboot target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "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 27: {
            LogStep(27, "Verify Current Mode Change based on OnMode, as it overwrites StartUpMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Change On Mode to Null");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::OnMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Reboot target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 30: {
            LogStep(30, "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 31: {
            LogStep(31, "Verify Current Mode Change based on new StartUp Mode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ModeSelect::Id, ModeSelect::Attributes::CurrentMode::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSelfFabricRemovalSuite : public TestCommand
{
public:
    TestSelfFabricRemovalSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestSelfFabricRemoval", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSelfFabricRemovalSuite() {}

    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;

    uint8_t ourFabricIndex;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("commissionedFabrics", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                ourFabricIndex = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        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, "Read number of commissioned fabrics");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CommissionedFabrics::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read current fabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Remove single own fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = ourFabricIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSystemCommandsSuite : public TestCommand
{
public:
    TestSystemCommandsSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestSystemCommands", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSystemCommandsSuite() {}

    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<chip::CharSpan> mPayload;
    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Stop the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Start the default accessory with no command line options");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            return Start(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Stop the default accessory by key");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            return Stop(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Start the default accessory with discriminator command line option");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = 1111U;
            return Start(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Stop the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Start the default accessory with discriminator and port command line options");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = 1111U;
            value.port.Emplace();
            value.port.Value() = 5560U;
            return Start(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Stop the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "Start the default accessory with minCommissioningTimeout only");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.minCommissioningTimeout.Emplace();
            value.minCommissioningTimeout.Value() = 10U;
            return Start(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Stop the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Start the default accessory by key with all command line options");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            value.discriminator.Emplace();
            value.discriminator.Value() = 1111U;
            value.port.Emplace();
            value.port.Value() = 5560U;
            value.kvs.Emplace();
            value.kvs.Value() = chip::Span<const char>("/tmp/chip_kvs_defaultgarbage: not in length on purpose", 21);
            value.minCommissioningTimeout.Emplace();
            value.minCommissioningTimeout.Value() = 10U;
            return Start(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Start a second accessory with all command line options");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            value.discriminator.Emplace();
            value.discriminator.Value() = 50U;
            value.port.Emplace();
            value.port.Value() = 5561U;
            value.kvs.Emplace();
            value.kvs.Value() = chip::Span<const char>("/tmp/chip_kvs_lockgarbage: not in length on purpose", 18);
            return Start(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "Commission second accessory from alpha");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = 3735928559ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0IX4122-.548G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Wait for the second commissioned device to be retrieved for alpha");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = 3735928559ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Stop the second accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            return Stop(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Start a second accessory with different KVS");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            value.discriminator.Emplace();
            value.discriminator.Value() = 50U;
            value.port.Emplace();
            value.port.Value() = 5561U;
            value.kvs.Emplace();
            value.kvs.Value() = chip::Span<const char>("/tmp/chip_kvs_lock2garbage: not in length on purpose", 19);
            return Start(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "Reboot the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Reboot the default accessory by key");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            return Reboot(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "Reboot the second accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            return Reboot(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Factory Reset the default accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Factory Reset the default accessory by key");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
            return FactoryReset(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Factory Reset the second accessory");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            value.registerKey.Emplace();
            value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
            return FactoryReset(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestBindingSuite : public TestCommand
{
public:
    TestBindingSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestBinding", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestBindingSuite() {}

    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
    {
        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::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("binding", iter_0, 0));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 0));
                    VerifyOrReturn(CheckValuePresent("binding[0].group", iter_0.GetValue().group));
                    VerifyOrReturn(CheckValue("binding[0].group.Value()", iter_0.GetValue().group.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 1));
                    VerifyOrReturn(CheckValuePresent("binding[1].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[1].node.Value()", iter_0.GetValue().node.Value(), 1ULL));
                    VerifyOrReturn(CheckValuePresent("binding[1].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[1].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValuePresent("binding[1].cluster", iter_0.GetValue().cluster));
                    VerifyOrReturn(CheckValue("binding[1].cluster.Value()", iter_0.GetValue().cluster.Value(), 6UL));
                    VerifyOrReturn(CheckValue("binding[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 2));
                    VerifyOrReturn(CheckValuePresent("binding[2].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[2].node.Value()", iter_0.GetValue().node.Value(), 2ULL));
                    VerifyOrReturn(CheckValuePresent("binding[2].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[2].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("binding", iter_0, 3));
                }
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 0));
                    VerifyOrReturn(CheckValuePresent("binding[0].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[0].node.Value()", iter_0.GetValue().node.Value(), 3ULL));
                    VerifyOrReturn(CheckValuePresent("binding[0].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[0].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("binding", iter_0, 1));
                }
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 0));
                    VerifyOrReturn(CheckValuePresent("binding[0].group", iter_0.GetValue().group));
                    VerifyOrReturn(CheckValue("binding[0].group.Value()", iter_0.GetValue().group.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 1));
                    VerifyOrReturn(CheckValuePresent("binding[1].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[1].node.Value()", iter_0.GetValue().node.Value(), 1ULL));
                    VerifyOrReturn(CheckValuePresent("binding[1].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[1].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValuePresent("binding[1].cluster", iter_0.GetValue().cluster));
                    VerifyOrReturn(CheckValue("binding[1].cluster.Value()", iter_0.GetValue().cluster.Value(), 6UL));
                    VerifyOrReturn(CheckValue("binding[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("binding", iter_0, 2));
                    VerifyOrReturn(CheckValuePresent("binding[2].node", iter_0.GetValue().node));
                    VerifyOrReturn(CheckValue("binding[2].node.Value()", iter_0.GetValue().node.Value(), 2ULL));
                    VerifyOrReturn(CheckValuePresent("binding[2].endpoint", iter_0.GetValue().endpoint));
                    VerifyOrReturn(CheckValue("binding[2].endpoint.Value()", iter_0.GetValue().endpoint.Value(), 1U));
                    VerifyOrReturn(CheckValue("binding[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("binding", iter_0, 3));
                }
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED));
            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;
        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, "Write empty binding table");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::Binding::Structs::TargetStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::Binding::Structs::TargetStruct::Type>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read empty binding table");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write invalid binding table");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::Binding::Structs::TargetStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].node.Emplace();
                listHolder_0->mList[1].node.Value() = 1ULL;
                listHolder_0->mList[1].group.Emplace();
                listHolder_0->mList[1].group.Value() = 1U;
                listHolder_0->mList[1].endpoint.Emplace();
                listHolder_0->mList[1].endpoint.Value() = 1U;
                listHolder_0->mList[1].cluster.Emplace();
                listHolder_0->mList[1].cluster.Value() = 6UL;
                listHolder_0->mList[1].fabricIndex     = 0U;

                value =
                    chip::app::DataModel::List<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Write binding table (endpoint 1)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::Binding::Structs::TargetStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].group.Emplace();
                listHolder_0->mList[0].group.Value() = 1U;
                listHolder_0->mList[0].fabricIndex   = 0U;

                listHolder_0->mList[1].node.Emplace();
                listHolder_0->mList[1].node.Value() = 1ULL;
                listHolder_0->mList[1].endpoint.Emplace();
                listHolder_0->mList[1].endpoint.Value() = 1U;
                listHolder_0->mList[1].cluster.Emplace();
                listHolder_0->mList[1].cluster.Value() = 6UL;
                listHolder_0->mList[1].fabricIndex     = 0U;

                listHolder_0->mList[2].node.Emplace();
                listHolder_0->mList[2].node.Value() = 2ULL;
                listHolder_0->mList[2].endpoint.Emplace();
                listHolder_0->mList[2].endpoint.Value() = 1U;
                listHolder_0->mList[2].fabricIndex      = 0U;

                value =
                    chip::app::DataModel::List<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read binding table (endpoint 1)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Write binding table (endpoint 0)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::Binding::Structs::TargetStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].node.Emplace();
                listHolder_0->mList[0].node.Value() = 3ULL;
                listHolder_0->mList[0].endpoint.Emplace();
                listHolder_0->mList[0].endpoint.Value() = 1U;
                listHolder_0->mList[0].fabricIndex      = 0U;

                value =
                    chip::app::DataModel::List<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), Binding::Id, Binding::Attributes::Binding::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read binding table (endpoint 0)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), Binding::Id, Binding::Attributes::Binding::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Verify endpoint 1 not changed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write over-long binding table on endpoint 1");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::Binding::Structs::TargetStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(11);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].node.Emplace();
                listHolder_0->mList[0].node.Value() = 1ULL;
                listHolder_0->mList[0].endpoint.Emplace();
                listHolder_0->mList[0].endpoint.Value() = 1U;
                listHolder_0->mList[0].cluster.Emplace();
                listHolder_0->mList[0].cluster.Value() = 6UL;
                listHolder_0->mList[0].fabricIndex     = 0U;

                listHolder_0->mList[1].node.Emplace();
                listHolder_0->mList[1].node.Value() = 2ULL;
                listHolder_0->mList[1].endpoint.Emplace();
                listHolder_0->mList[1].endpoint.Value() = 2U;
                listHolder_0->mList[1].cluster.Emplace();
                listHolder_0->mList[1].cluster.Value() = 6UL;
                listHolder_0->mList[1].fabricIndex     = 0U;

                listHolder_0->mList[2].node.Emplace();
                listHolder_0->mList[2].node.Value() = 3ULL;
                listHolder_0->mList[2].endpoint.Emplace();
                listHolder_0->mList[2].endpoint.Value() = 3U;
                listHolder_0->mList[2].cluster.Emplace();
                listHolder_0->mList[2].cluster.Value() = 6UL;
                listHolder_0->mList[2].fabricIndex     = 0U;

                listHolder_0->mList[3].node.Emplace();
                listHolder_0->mList[3].node.Value() = 4ULL;
                listHolder_0->mList[3].endpoint.Emplace();
                listHolder_0->mList[3].endpoint.Value() = 4U;
                listHolder_0->mList[3].cluster.Emplace();
                listHolder_0->mList[3].cluster.Value() = 6UL;
                listHolder_0->mList[3].fabricIndex     = 0U;

                listHolder_0->mList[4].node.Emplace();
                listHolder_0->mList[4].node.Value() = 5ULL;
                listHolder_0->mList[4].endpoint.Emplace();
                listHolder_0->mList[4].endpoint.Value() = 5U;
                listHolder_0->mList[4].cluster.Emplace();
                listHolder_0->mList[4].cluster.Value() = 6UL;
                listHolder_0->mList[4].fabricIndex     = 0U;

                listHolder_0->mList[5].node.Emplace();
                listHolder_0->mList[5].node.Value() = 6ULL;
                listHolder_0->mList[5].endpoint.Emplace();
                listHolder_0->mList[5].endpoint.Value() = 6U;
                listHolder_0->mList[5].cluster.Emplace();
                listHolder_0->mList[5].cluster.Value() = 6UL;
                listHolder_0->mList[5].fabricIndex     = 0U;

                listHolder_0->mList[6].node.Emplace();
                listHolder_0->mList[6].node.Value() = 7ULL;
                listHolder_0->mList[6].endpoint.Emplace();
                listHolder_0->mList[6].endpoint.Value() = 7U;
                listHolder_0->mList[6].cluster.Emplace();
                listHolder_0->mList[6].cluster.Value() = 6UL;
                listHolder_0->mList[6].fabricIndex     = 0U;

                listHolder_0->mList[7].node.Emplace();
                listHolder_0->mList[7].node.Value() = 8ULL;
                listHolder_0->mList[7].endpoint.Emplace();
                listHolder_0->mList[7].endpoint.Value() = 8U;
                listHolder_0->mList[7].cluster.Emplace();
                listHolder_0->mList[7].cluster.Value() = 6UL;
                listHolder_0->mList[7].fabricIndex     = 0U;

                listHolder_0->mList[8].node.Emplace();
                listHolder_0->mList[8].node.Value() = 9ULL;
                listHolder_0->mList[8].endpoint.Emplace();
                listHolder_0->mList[8].endpoint.Value() = 9U;
                listHolder_0->mList[8].cluster.Emplace();
                listHolder_0->mList[8].cluster.Value() = 6UL;
                listHolder_0->mList[8].fabricIndex     = 0U;

                listHolder_0->mList[9].node.Emplace();
                listHolder_0->mList[9].node.Value() = 10ULL;
                listHolder_0->mList[9].endpoint.Emplace();
                listHolder_0->mList[9].endpoint.Value() = 10U;
                listHolder_0->mList[9].cluster.Emplace();
                listHolder_0->mList[9].cluster.Value() = 6UL;
                listHolder_0->mList[9].fabricIndex     = 0U;

                listHolder_0->mList[10].node.Emplace();
                listHolder_0->mList[10].node.Value() = 11ULL;
                listHolder_0->mList[10].endpoint.Emplace();
                listHolder_0->mList[10].endpoint.Value() = 11U;
                listHolder_0->mList[10].cluster.Emplace();
                listHolder_0->mList[10].cluster.Value() = 6UL;
                listHolder_0->mList[10].fabricIndex     = 0U;

                value =
                    chip::app::DataModel::List<chip::app::Clusters::Binding::Structs::TargetStruct::Type>(listHolder_0->mList, 11);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Binding::Id, Binding::Attributes::Binding::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestUserLabelClusterSuite : public TestCommand
{
public:
    TestUserLabelClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestUserLabelCluster", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestUserLabelClusterSuite() {}

    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
    {
        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::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("room", 4)));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("bedroom 1", 9)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[1].label", iter_0.GetValue().label, chip::CharSpan("orientation", 11)));
                    VerifyOrReturn(CheckValueAsString("labelList[1].value", iter_0.GetValue().value, chip::CharSpan("South", 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("labelList[2].label", iter_0.GetValue().label, chip::CharSpan("floor", 5)));
                    VerifyOrReturn(CheckValueAsString("labelList[2].value", iter_0.GetValue().value, chip::CharSpan("2", 1)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 3));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[3].label", iter_0.GetValue().label, chip::CharSpan("direction", 9)));
                    VerifyOrReturn(CheckValueAsString("labelList[3].value", iter_0.GetValue().value, chip::CharSpan("down", 4)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 4));
                }
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 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));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 0));
                    VerifyOrReturn(CheckValueAsString("labelList[0].label", iter_0.GetValue().label, chip::CharSpan("room", 4)));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[0].value", iter_0.GetValue().value, chip::CharSpan("bedroom 2", 9)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 1));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[1].label", iter_0.GetValue().label, chip::CharSpan("orientation", 11)));
                    VerifyOrReturn(CheckValueAsString("labelList[1].value", iter_0.GetValue().value, chip::CharSpan("North", 5)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 2));
                    VerifyOrReturn(CheckValueAsString("labelList[2].label", iter_0.GetValue().label, chip::CharSpan("floor", 5)));
                    VerifyOrReturn(CheckValueAsString("labelList[2].value", iter_0.GetValue().value, chip::CharSpan("5", 1)));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("labelList", iter_0, 3));
                    VerifyOrReturn(
                        CheckValueAsString("labelList[3].label", iter_0.GetValue().label, chip::CharSpan("direction", 9)));
                    VerifyOrReturn(CheckValueAsString("labelList[3].value", iter_0.GetValue().value, chip::CharSpan("up", 2)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("labelList", iter_0, 4));
                }
            }
            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;
        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, "Commit User Label List");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value = chip::Span<const char>("bedroom 1garbage: not in length on purpose", 9);

                listHolder_0->mList[1].label = chip::Span<const char>("orientationgarbage: not in length on purpose", 11);
                listHolder_0->mList[1].value = chip::Span<const char>("Southgarbage: not in length on purpose", 5);

                listHolder_0->mList[2].label = chip::Span<const char>("floorgarbage: not in length on purpose", 5);
                listHolder_0->mList[2].value = chip::Span<const char>("2garbage: not in length on purpose", 1);

                listHolder_0->mList[3].label = chip::Span<const char>("directiongarbage: not in length on purpose", 9);
                listHolder_0->mList[3].value = chip::Span<const char>("downgarbage: not in length on purpose", 4);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Verify committed User Label List");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Clear User Label List");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            value = chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read User Label List");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write User Label List");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("roomgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value = chip::Span<const char>("bedroom 2garbage: not in length on purpose", 9);

                listHolder_0->mList[1].label = chip::Span<const char>("orientationgarbage: not in length on purpose", 11);
                listHolder_0->mList[1].value = chip::Span<const char>("Northgarbage: not in length on purpose", 5);

                listHolder_0->mList[2].label = chip::Span<const char>("floorgarbage: not in length on purpose", 5);
                listHolder_0->mList[2].value = chip::Span<const char>("5garbage: not in length on purpose", 1);

                listHolder_0->mList[3].label = chip::Span<const char>("directiongarbage: not in length on purpose", 9);
                listHolder_0->mList[3].value = chip::Span<const char>("upgarbage: not in length on purpose", 2);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Reboot target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "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 8: {
            LogStep(8, "Verify User Label List after reboot");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestUserLabelClusterConstraintsSuite : public TestCommand
{
public:
    TestUserLabelClusterConstraintsSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestUserLabelClusterConstraints", 3, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestUserLabelClusterConstraintsSuite() {}

    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
    {
        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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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;
        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, "Attempt to write overly long item for label");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label =
                    chip::Span<const char>("this is longer than sixteen charactersgarbage: not in length on purpose", 38);
                listHolder_0->mList[0].value = chip::Span<const char>("bedroom 2garbage: not in length on purpose", 9);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Attempt to write overly long item for value");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::UserLabel::Structs::LabelStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].label = chip::Span<const char>("testgarbage: not in length on purpose", 4);
                listHolder_0->mList[0].value =
                    chip::Span<const char>("this is longer than sixteen charactersgarbage: not in length on purpose", 38);

                value =
                    chip::app::DataModel::List<chip::app::Clusters::UserLabel::Structs::LabelStruct::Type>(listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), UserLabel::Id, UserLabel::Attributes::LabelList::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestArmFailSafeSuite : public TestCommand
{
public:
    TestArmFailSafeSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestArmFailSafe", 9, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestArmFailSafeSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValue("fabrics[0].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 1));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("errorCode", value.errorCode, 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Reboot target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
            return Reboot(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Wait for the alpha 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 2: {
            LogStep(2, "Query fabrics list");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "ArmFailSafe on target device with timeout 0");
            ListFreer listFreer;
            chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafe::Type value;
            value.expiryLengthSeconds = 0U;
            value.breadcrumb          = 0ULL;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GeneralCommissioning::Id,
                               GeneralCommissioning::Commands::ArmFailSafe::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Reads NodeLabel mandatory attribute of target device");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Invoke AddTrustedRootCertificate without fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::AddTrustedRootCertificate::Type value;
            value.rootCACertificate = chip::ByteSpan(chip::Uint8::from_const_char("00000000garbage: not in length on purpose"), 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::AddTrustedRootCertificate::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Invoke AddNOC without fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::AddNOC::Type value;
            value.NOCValue = chip::ByteSpan(chip::Uint8::from_const_char("00112233garbage: not in length on purpose"), 8);
            value.IPKValue = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\000\001\002\003\004\005\006\007\000\001\002\003\004\005\006\007garbage: not in length on purpose"),
                16);
            value.caseAdminSubject = 1234ULL;
            value.adminVendorId    = static_cast<chip::VendorId>(65521);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::AddNOC::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Invoke UpdateNOC without fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::UpdateNOC::Type value;
            value.NOCValue = chip::ByteSpan(chip::Uint8::from_const_char("00112233garbage: not in length on purpose"), 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::UpdateNOC::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Invoke CSRRequest without fail-safe");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::CSRRequest::Type value;
            value.CSRNonce = chip::ByteSpan(
                chip::Uint8::from_const_char("\000\001\002\003\004\005\006\007\000\001\002\003\004\005\006\007\000\001\002\003\004"
                                             "\005\006\007\000\001\002\003\004\005\006\007garbage: not in length on purpose"),
                32);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::CSRRequest::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestFanControlSuite : public TestCommand
{
public:
    TestFanControlSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestFanControl", 25, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestFanControlSuite() {}

    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
    {
        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::FanControl::FanModeType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("fanMode", value, 3U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::FanControl::FanModeSequenceType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("fanModeSequence", value, 5U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("percentSetting", value));
                VerifyOrReturn(CheckValue("percentSetting.Value()", value.Value(), 84U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("speedSetting", value));
                VerifyOrReturn(CheckValue("speedSetting.Value()", value.Value(), 84U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("speedCurrent", value, 84U));
            }
            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::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("percentSetting", value));
                VerifyOrReturn(CheckValue("percentSetting.Value()", value.Value(), 84U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("speedSetting", value));
                VerifyOrReturn(CheckValue("speedSetting.Value()", value.Value(), 73U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("percentSetting", value));
                VerifyOrReturn(CheckValue("percentSetting.Value()", value.Value(), 73U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("percentCurrent", value, 73U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("speedSetting", value));
                VerifyOrReturn(CheckValue("speedSetting.Value()", value.Value(), 73U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("percentSetting", value));
                VerifyOrReturn(CheckValue("percentSetting.Value()", value.Value(), 0U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("percentCurrent", value, 0U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("speedSetting", value));
                VerifyOrReturn(CheckValue("speedSetting.Value()", value.Value(), 0U));
            }
            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("speedCurrent", value, 0U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("percentSetting", value));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("speedSetting", value));
            }
            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;
        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, "Write fan mode");
            ListFreer listFreer;
            chip::app::Clusters::FanControl::FanModeType value;
            value = static_cast<chip::app::Clusters::FanControl::FanModeType>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read back fan mode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanMode::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Write fan mode sequence");
            ListFreer listFreer;
            chip::app::Clusters::FanControl::FanModeSequenceType value;
            value = static_cast<chip::app::Clusters::FanControl::FanModeSequenceType>(5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanModeSequence::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read back fan mode sequence");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanModeSequence::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Write percent setting");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 84U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read back speed current");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedCurrent::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Write percent setting");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write speed setting");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 73U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read back percent current");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentCurrent::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Write speed setting");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write fan mode");
            ListFreer listFreer;
            chip::app::Clusters::FanControl::FanModeType value;
            value = static_cast<chip::app::Clusters::FanControl::FanModeType>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read back percent current");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentCurrent::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read back speed current");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedCurrent::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Write fan mode");
            ListFreer listFreer;
            chip::app::Clusters::FanControl::FanModeType value;
            value = static_cast<chip::app::Clusters::FanControl::FanModeType>(5);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::FanMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read back percent setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::PercentSetting::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read back speed setting");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FanControl::Id, FanControl::Attributes::SpeedSetting::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestAccessControlConstraintsSuite : public TestCommand
{
public:
    TestAccessControlConstraintsSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestAccessControlConstraints", 11, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestAccessControlConstraintsSuite() {}

    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
    {
        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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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;
        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, "Constraint error: PASE reserved for future (TC-ACL-2.4 step 29)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(1);
                listHolder_0->mList[1].subjects.SetNonNull();

                listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Constraint error: Invalid combination administer + group (TC-ACL-2.4 step 31)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Constraint error:  Invalid auth mode (TC-ACL-2.4 step 33)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(4);
                listHolder_0->mList[1].subjects.SetNonNull();

                listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Constraint error:  Invalid subject (TC-ACL-2.4 step 34)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 0ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Constraint error:  Invalid target (TC-ACL-2.4 step 38)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNull();
                    listHolder_3->mList[0].deviceType.SetNull();

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Constraint error:  target has both endpoint and device type (TC-ACL-2.4 step 42)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<chip::app::Clusters::AccessControl::Structs::Target::Type>(1);
                    listFreer.add(listHolder_3);

                    listHolder_3->mList[0].cluster.SetNull();
                    listHolder_3->mList[0].endpoint.SetNonNull();
                    listHolder_3->mList[0].endpoint.Value() = 22U;
                    listHolder_3->mList[0].deviceType.SetNonNull();
                    listHolder_3->mList[0].deviceType.Value() = 33UL;

                    listHolder_0->mList[1].targets.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::Target::Type>(listHolder_3->mList,
                                                                                                              1);
                }
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Constraint error: Invalid privilege value step 32)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(6);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Constraint error: invalid subject 0xFFFF_FFFF_FFFF_FFFF (TC-ACL-2.4 step 35)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 18446744073709551615ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Constraint error: invalid subject 0xFFFF_FFFD_0000_0000 (TC-ACL-2.4 step 36)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 18446744060824649728ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Constraint error: invalid subject 0xFFFF_FFFF_FFFF_0000 (TC-ACL-2.4 step 37)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 112233ULL;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 18446744073709486080ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestLevelControlWithOnOffDependencySuite : public TestCommand
{
public:
    TestLevelControlWithOnOffDependencySuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestLevelControlWithOnOffDependency", 33, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestLevelControlWithOnOffDependencySuite() {}

    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 1U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOffTransitionTime", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("onLevel", value));
                VerifyOrReturn(CheckValue("onLevel.Value()", value.Value(), 254U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minLevel", value, 1U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 254U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 1U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 127U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("onLevel", value));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 127U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 127U));
            }
            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;
        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, "Sends a MoveToLevel command to set CurrentLevel to min value");
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 1U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Reads CurrentLevel attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Write OnOffTransitionTime attribute");
            ListFreer listFreer;
            uint16_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                  LevelControl::Attributes::OnOffTransitionTime::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Read OnOffTransitionTime attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::OnOffTransitionTime::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Write OnLevel attribute");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNonNull();
            value.Value() = 254U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Read OnLevel attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read MinValue attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::MinLevel::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Send On Command");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Check on/off attribute value is true after on command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait OnOffTransitionTime");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "If OnLevel is defined, check CurrentLevel is OnLevel value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Send Off Command");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Check on/off attribute value is false after off command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Wait OnOffTransitionTime");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 0UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "If OnLevel is defined, check CurrentLevel is min value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Sends a MoveToLevel command to set CurrentLevel to a mid value");
            ListFreer listFreer;
            chip::app::Clusters::LevelControl::Commands::MoveToLevel::Type value;
            value.level = 127U;
            value.transitionTime.SetNonNull();
            value.transitionTime.Value() = 0U;
            value.optionsMask            = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            value.optionsOverride        = static_cast<chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions>>(1U);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Commands::MoveToLevel::Id, value,
                               chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Reads CurrentLevel attribute from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Set OnLevel attribute to null");
            ListFreer listFreer;
            chip::app::DataModel::Nullable<uint8_t> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait 100 ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "Read OnLevel attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::OnLevel::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Send On Command");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Check on/off attribute value is true after on command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Wait OnOffTransitionTime");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28, "If OnLevel is not defined, check CurrentLevel is restored");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Send Off Command");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Wait OnOffTransitionTime");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 0UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 32: {
            LogStep(32, "If OnLevel is not defined, check CurrentLevel is restored");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestCommissioningWindowSuite : public TestCommand
{
public:
    TestCommissioningWindowSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestCommissioningWindow", 28, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("cluster", &mCluster);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestCommissioningWindowSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    uint8_t alphaIndex;
    uint8_t betaIndex;
    chip::app::DataModel::Nullable<uint16_t> adminVendorId;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                alphaIndex = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 2U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("adminFabricIndex", value));
                VerifyOrReturn(CheckValue("adminFabricIndex.Value()", value.Value(), alphaIndex));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("value", value));
            }
            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::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                betaIndex = value;
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 2U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("adminFabricIndex", value));
                VerifyOrReturn(CheckValue("adminFabricIndex.Value()", value.Value(), betaIndex));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("value", value));
                adminVendorId = value;
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 2U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                if (adminVendorId.IsNull())
                {
                    VerifyOrReturn(CheckValueNull("adminVendorId", value));
                }
                else
                {
                    VerifyOrReturn(CheckValueNonNull("adminVendorId", value));
                    VerifyOrReturn(CheckValue("adminVendorId.Value()", value.Value(), adminVendorId.Value()));
                }
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved for alpha");
            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, "Get alpha's fabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Check that commissioning window is not open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Check that there is no AdminFabricIndex");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Check that there is no AdminVendorId");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check that commissioning window is open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Check the AdminFabricIndex");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Check the AdminVendorId is not null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Close Commissioning Window");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Check that commissioning window is again not open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Check that again there is no AdminFabricIndex");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Check that again there is no AdminVendorId");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Open Commissioning Window from alpha again");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 15: {
            LogStep(15, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 16: {
            LogStep(16, "Check that commissioning window is not open for the third time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Check that there is no AdminFabricIndex for the third time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Check that there is no AdminVendorId for the third time");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Get beta's fabric index");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Open Commissioning Window from beta");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Check that commissioning window is open again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Check the AdminFabricIndex again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Check the AdminVendorId is not null again");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Remove beta fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = betaIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Check that commissioning window is still open");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Check the AdminFabricIndex got reset");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminFabricIndex::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Check the AdminVendorId did not get reset");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::AdminVendorId::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestCommissionerNodeIdSuite : public TestCommand
{
public:
    TestCommissionerNodeIdSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestCommissionerNodeId", 22, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("cluster", &mCluster);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestCommissionerNodeIdSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    uint8_t alphaIndex;
    chip::NodeId commissionerNodeIdAlpha;
    uint8_t betaIndex;
    chip::NodeId commissionerNodeIdBeta;
    uint8_t gammaIndex;
    chip::NodeId commissionerNodeIdGamma;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                alphaIndex = value;
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                commissionerNodeIdAlpha = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                betaIndex = value;
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                commissionerNodeIdBeta = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                gammaIndex = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeIdResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                commissionerNodeIdGamma = value.nodeId;
            }
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), commissionerNodeIdAlpha));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, alphaIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), commissionerNodeIdBeta));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, betaIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), commissionerNodeIdGamma));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, gammaIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            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;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), commissionerNodeIdBeta));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, betaIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("acl", iter_0, 0));
                    VerifyOrReturn(CheckValue("acl[0].privilege", iter_0.GetValue().privilege, 5U));
                    VerifyOrReturn(CheckValue("acl[0].authMode", iter_0.GetValue().authMode, 2U));
                    VerifyOrReturn(CheckValueNonNull("acl[0].subjects", iter_0.GetValue().subjects));
                    {
                        auto iter_3 = iter_0.GetValue().subjects.Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(iter_0.GetValue().subjects.Value())>(
                            "acl[0].subjects.Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("acl[0].subjects.Value()[0]", iter_3.GetValue(), commissionerNodeIdGamma));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(iter_0.GetValue().subjects.Value())>("acl[0].subjects.Value()",
                                                                                                          iter_3, 1));
                    }
                    VerifyOrReturn(CheckValueNull("acl[0].targets", iter_0.GetValue().targets));
                    VerifyOrReturn(CheckValue("acl[0].fabricIndex", iter_0.GetValue().fabricIndex, gammaIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acl", iter_0, 1));
                }
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved for alpha");
            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, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 3: {
            LogStep(3, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 4: {
            LogStep(4, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Commission from gamma");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 6: {
            LogStep(6, "Wait for the commissioned device to be retrieved for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 7: {
            LogStep(7, "Read the fabric ID from the alpha fabric");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the commissioner node ID from the alpha fabric");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Read the fabric ID from the beta fabric");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read the commissioner node ID from the beta fabric");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityBeta, value);
        }
        case 11: {
            LogStep(11, "Read the fabric ID from the gamma fabric");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read the commissioner node ID from the gamma fabric");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type value;
            return GetCommissionerNodeId(kIdentityGamma, value);
        }
        case 13: {
            LogStep(13, "Read the ACL from alpha and check commissioner node id");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read the ACL from beta and check commissioner node id");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read the ACL from gamma and check commissioner node id");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Write the ACL using the commissioner node id value");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeIdBeta;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = betaIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write the ACL using the commissioner node id value");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = commissionerNodeIdGamma;
                    listHolder_0->mList[0].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = gammaIndex;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityGamma, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read the ACL from beta and check commissioner node id");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read the ACL from gamma and check commissioner node id");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Remove beta fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = betaIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Remove gamma fabric");
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = gammaIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestMultiAdminSuite : public TestCommand
{
public:
    TestMultiAdminSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestMultiAdmin", 18, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestMultiAdminSuite()
    {
        if (readFromAlphaBuffer != nullptr)
        {
            chip::Platform::MemoryFree(readFromAlphaBuffer);
            readFromAlphaBuffer = nullptr;
        }
    }

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    char * readFromAlphaBuffer = nullptr;
    chip::CharSpan readFromAlpha;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValue("fabrics[0].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 1));
                }
            }
            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));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
                if (readFromAlphaBuffer != nullptr)
                {
                    chip::Platform::MemoryFree(readFromAlphaBuffer);
                }
                readFromAlphaBuffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.size()));
                memcpy(readFromAlphaBuffer, value.data(), value.size());
                readFromAlpha = chip::CharSpan(readFromAlphaBuffer, value.size());
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, readFromAlpha));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Stop target device");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Start target device with the provided discriminator for basic commissioning advertisement");
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Start::Type value;
            value.discriminator.Emplace();
            value.discriminator.Value() = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            return Start(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "Wait for the commissioned device to be retrieved for alpha");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Commission from alpha when the commissioning window is not opened");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeIdForDuplicateCommissioning.HasValue() ? mNodeIdForDuplicateCommissioning.Value() : 17ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Commission from alpha again");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeIdForDuplicateCommissioning.HasValue() ? mNodeIdForDuplicateCommissioning.Value() : 17ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Check that we just have the one fabric and did not add a new one");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Close Commissioning Window after failed commissioning");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Open Commissioning Window from alpha again");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 10: {
            LogStep(10, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 11: {
            LogStep(11, "Open Commissioning Window from beta");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Commission from gamma");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 13: {
            LogStep(13, "Wait for the commissioned device to be retrieved for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 14: {
            LogStep(14, "read the mandatory attribute: NodeLabel from alpha");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "write the mandatory attribute NodeLabel from beta");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("written from betagarbage: not in length on purpose", 17);
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "read the mandatory attribute: NodeLabel from gamma");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "write the mandatory attribute NodeLabel back to default");
            ListFreer listFreer;
            chip::CharSpan value;
            value = readFromAlpha;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_1_1Suite : public TestCommand
{
public:
    Test_TC_DGSW_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_1_1", 12, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::ClusterRevision::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !DGSW.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DGSW.S.F00(Watermarks) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DGSW.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::FeatureMap::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads optional attribute(ThreadMetrics) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads optional attribute(CurrentHeapFree) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads optional attribute(CurrentHeapUsed) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH reads Feature dependent attribute(CurrentHeapHighWatermark) in AttributeList");
            VerifyOrDo(!ShouldSkip("DGSW.S.F00 || DGSW.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip("DGSW.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "TH reads AcceptedCommandList from DUT");
            VerifyOrDo(!ShouldSkip(" !DGSW.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::GeneratedCommandList::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSubscribe_OnOffSuite : public TestCommand
{
public:
    TestSubscribe_OnOffSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestSubscribe_OnOff", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSubscribe_OnOffSuite() {}

    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
    {
        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));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, false));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, true));
            }
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, false));
            }
            shouldContinue = true;
            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;
        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, "Set OnOff Attribute to false");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Subscribe OnOff Attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, 2, 5, true,
                                      chip::NullOptional, chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Check for attribute report");
            return WaitForReport();
        }
        case 5: {
            LogStep(5, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check for attribute report");
            return WaitForReport();
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestSubscribe_AdministratorCommissioningSuite : public TestCommand
{
public:
    TestSubscribe_AdministratorCommissioningSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestSubscribe_AdministratorCommissioning", 17, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("ourVendorId", 0, UINT16_MAX, &mOurVendorId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestSubscribe_AdministratorCommissioningSuite() {}

    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> mOurVendorId;
    chip::Optional<uint16_t> mTimeout;

    uint8_t ourFabricIndex;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ourFabricIndex = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 2U));
            }
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("adminVendorId", value));
                VerifyOrReturn(
                    CheckValue("adminVendorId.Value()", value.Value(), mOurVendorId.HasValue() ? mOurVendorId.Value() : 65521U));
            }
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminVendorId", value));
            }
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("adminFabricIndex", value));
                VerifyOrReturn(CheckValue("adminFabricIndex.Value()", value.Value(), ourFabricIndex));
            }
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("adminFabricIndex", value));
            }
            shouldContinue = true;
            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;
        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, "Get ourfabric index");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Subscribe WindowStatus Attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                      AdministratorCommissioning::Attributes::WindowStatus::Id, 2, 50, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Open the commissioning window 1");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Check for first attribute report for WindowStatus");
            return WaitForReport();
        }
        case 5: {
            LogStep(5, "Close the commissioning window 1");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Check for second attribute report for WindowStatus");
            return WaitForReport();
        }
        case 7: {
            LogStep(7, "Subscribe AdminVendorId Attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                      AdministratorCommissioning::Attributes::AdminVendorId::Id, 2, 50, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Open the commissioning window 2");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Check for first attribute report for AdminVendorId");
            return WaitForReport();
        }
        case 10: {
            LogStep(10, "Close the commissioning window 2");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Check for second attribute report for AdminVendorId");
            return WaitForReport();
        }
        case 12: {
            LogStep(12, "Subscribe AdminFabricIndex Attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                      AdministratorCommissioning::Attributes::AdminFabricIndex::Id, 2, 50, true, chip::NullOptional,
                                      chip::NullOptional, /* autoResubscribe = */ chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Open the commissioning window 3");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Check for first attribute report for AdminFabricIndex");
            return WaitForReport();
        }
        case 15: {
            LogStep(15, "Close the commissioning window 2");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Check for second attribute report for AdminFabricIndex");
            return WaitForReport();
        }
        }
        return CHIP_NO_ERROR;
    }
};

class DL_UsersAndCredentialsSuite : public TestCommand
{
public:
    DL_UsersAndCredentialsSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("DL_UsersAndCredentials", 128, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~DL_UsersAndCredentialsSuite() {}

    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;

    uint16_t NumberOfTotalUsersSupported;
    uint16_t NumberOfPINUsersSupported;
    uint16_t NumberOfRFIDUsersSupported;

    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
    {
        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));
            {
                chip::app::Clusters::DoorLock::Commands::GetUserResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfTotalUsersSupported", value, 10U));
                NumberOfTotalUsersSupported = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            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("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            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("new_user", 8)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            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("new_user", 8)));
                VerifyOrReturn(CheckValueNonNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValue("userUniqueID.Value()", value.userUniqueID.Value(), 305441741UL));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 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::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("new_user", 8)));
                VerifyOrReturn(CheckValueNonNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValue("userUniqueID.Value()", value.userUniqueID.Value(), 305441741UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 3U));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 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::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("new_user", 8)));
                VerifyOrReturn(CheckValueNonNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValue("userUniqueID.Value()", value.userUniqueID.Value(), 305441741UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 3U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 6U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 0U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            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("new_user", 8)));
                VerifyOrReturn(CheckValueNonNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValue("userUniqueID.Value()", value.userUniqueID.Value(), 305441741UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 3U));
                VerifyOrReturn(CheckValueNonNull("userType", value.userType));
                VerifyOrReturn(CheckValue("userType.Value()", value.userType.Value(), 6U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            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("test_user", 9)));
                VerifyOrReturn(CheckValueNonNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValue("userUniqueID.Value()", value.userUniqueID.Value(), 466460832UL));
                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(), 1U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            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, 2U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("test_user2", 10)));
                VerifyOrReturn(CheckValueNonNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValue("userUniqueID.Value()", value.userUniqueID.Value(), 12648430UL));
                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(), 1U));
                VerifyOrReturn(CheckValueNonNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValue("credentialRule.Value()", value.credentialRule.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 23:
            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, 3U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 25:
            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, 3U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            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, 3U));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("test_user3", 10)));
                VerifyOrReturn(CheckValueNonNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValue("userUniqueID.Value()", value.userUniqueID.Value(), 47802UL));
                VerifyOrReturn(CheckValueNonNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValue("userStatus.Value()", value.userStatus.Value(), 3U));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            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, NumberOfTotalUsersSupported));
                VerifyOrReturn(CheckValueNonNull("userName", value.userName));
                VerifyOrReturn(CheckValueAsString("userName.Value()", value.userName.Value(), chip::CharSpan("last_user", 9)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            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(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            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::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("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            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, 2U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 40:
            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, NumberOfTotalUsersSupported));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfPINUsersSupported", value, 10U));
                NumberOfPINUsersSupported = value;
            }
            break;
        case 42:
            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 43:
            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 44:
            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 45:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 46:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 47:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 48:
            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("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                }
                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 49:
            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(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 50:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 51:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfRFIDUsersSupported", value, 10U));
                NumberOfRFIDUsersSupported = value;
            }
            break;
        case 53:
            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 54:
            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 55:
            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 56:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 57:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 58:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 59:
            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 60:
            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("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 2));
                }
                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 61:
            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(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 62:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 63:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 64:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 65:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 66:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 67:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 68:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 69:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 70:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 71:
            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, 2U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 72:
            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, 2U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 73:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 74:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 75:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 76:
            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 77:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 78:
            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, 2U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 79:
            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(), 3U));
            }
            break;
        case 80:
            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("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 2));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialIndex", iter_1.GetValue().credentialIndex, 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 3));
                }
                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(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            break;
        case 81:
            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(), 4U));
            }
            break;
        case 82:
            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("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 2));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialIndex", iter_1.GetValue().credentialIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 3));
                    VerifyOrReturn(CheckValue("credentials.Value()[3].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[3].credentialIndex", iter_1.GetValue().credentialIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 4));
                }
                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(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 84:
            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(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 85:
            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("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialType", iter_1.GetValue().credentialType, 2U));
                    VerifyOrReturn(CheckValue("credentials.Value()[1].credentialIndex", iter_1.GetValue().credentialIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 2));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[2].credentialIndex", iter_1.GetValue().credentialIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 3));
                }
                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(CheckValueNonNull("nextUserIndex", value.nextUserIndex));
                VerifyOrReturn(CheckValue("nextUserIndex.Value()", value.nextUserIndex.Value(), 2U));
            }
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 87:
            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(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 88:
            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, 2U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 89:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 91:
            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 92:
            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 93:
            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 94:
            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("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 1U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                }
                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 95:
            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, 2U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 96:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 97:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 3U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 3U));
            }
            break;
        case 98:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 4U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 7U));
            }
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 100:
            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 101:
            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 102:
            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 103:
            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(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 104:
            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, 2U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 105:
            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, 3U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 106:
            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, 4U));
                VerifyOrReturn(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 107:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 108:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 109:
            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("", 0)));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialType", iter_1.GetValue().credentialType, 0U));
                    VerifyOrReturn(CheckValue("credentials.Value()[0].credentialIndex", iter_1.GetValue().credentialIndex, 0U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 1));
                }
                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 110:
            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(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 111:
            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(CheckValueNull("nextCredentialIndex", value.nextCredentialIndex));
            }
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 119:
            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(CheckValueNull("userName", value.userName));
                VerifyOrReturn(CheckValueNull("userUniqueID", value.userUniqueID));
                VerifyOrReturn(CheckValueNull("userStatus", value.userStatus));
                VerifyOrReturn(CheckValueNull("userType", value.userType));
                VerifyOrReturn(CheckValueNull("credentialRule", value.credentialRule));
                VerifyOrReturn(CheckValueNull("credentials", value.credentials));
                VerifyOrReturn(CheckValueNull("creatorFabricIndex", value.creatorFabricIndex));
                VerifyOrReturn(CheckValueNull("lastModifiedFabricIndex", value.lastModifiedFabricIndex));
                VerifyOrReturn(CheckValueNull("nextUserIndex", value.nextUserIndex));
            }
            break;
        case 120:
            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 121:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 122:
            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(), 3U));
            }
            break;
        case 123:
            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(), 4U));
            }
            break;
        case 124:
            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(), 5U));
            }
            break;
        case 125:
            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(), 6U));
            }
            break;
        case 126:
            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, 137U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 7U));
            }
            break;
        case 127:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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, "Read available user slot and verify response 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 2: {
            LogStep(2, "Get number of supported users and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read fails for user with index 0");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Read fails for user with index greater than Number Of Users Supported");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "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.SetNull();
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "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 7: {
            LogStep(7, "Set user at the occupied index fails with appropriate response");
            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.SetNull();
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Modify userName for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("new_usergarbage: not in length on purpose", 8);
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Read the modified 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 10: {
            LogStep(10, "Modify userUniqueId for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueID.SetNonNull();
            value.userUniqueID.Value() = 305441741UL;
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Read the modified 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 12: {
            LogStep(12, "Modify userStatus for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueID.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(3);
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Read the modified 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 14: {
            LogStep(14, "Modify userType for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::UserTypeEnum>(6);
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Read the modified 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 16: {
            LogStep(16, "Modify credentialRule for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);
            value.userIndex     = 1U;
            value.userName.SetNull();
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::CredentialRuleEnum>(2);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Read the modified 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 18: {
            LogStep(18, "Modify all fields for existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);
            value.userIndex     = 1U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_usergarbage: not in length on purpose", 9);
            value.userUniqueID.SetNonNull();
            value.userUniqueID.Value() = 466460832UL;
            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>(1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read the modified 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 20: {
            LogStep(20, "Add another user with non-default fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = 2U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_user2garbage: not in length on purpose", 10);
            value.userUniqueID.SetNonNull();
            value.userUniqueID.Value() = 12648430UL;
            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>(1);
            value.credentialRule.SetNonNull();
            value.credentialRule.Value() = static_cast<chip::app::Clusters::DoorLock::CredentialRuleEnum>(2);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Read the new user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Try to add a user with userStatus 0");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = 3U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_user3garbage: not in length on purpose", 10);
            value.userUniqueID.SetNonNull();
            value.userUniqueID.Value() = 47802UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(0);
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Make sure the user did not get created");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 3U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Try to add a user with userStatus 2");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = 3U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_user3garbage: not in length on purpose", 10);
            value.userUniqueID.SetNonNull();
            value.userUniqueID.Value() = 47802UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(2);
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Make sure the user did not get created");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 3U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Try to add a user with userStatus 3");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = 3U;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("test_user3garbage: not in length on purpose", 10);
            value.userUniqueID.SetNonNull();
            value.userUniqueID.Value() = 47802UL;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(3);
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "Read the new third user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 3U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Create user in the last slot");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = NumberOfTotalUsersSupported;
            value.userName.SetNonNull();
            value.userName.Value() = chip::Span<const char>("last_usergarbage: not in length on purpose", 9);
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Read the last user back and verify its fields");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = NumberOfTotalUsersSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "User creation in the 0 slot fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = 0U;
            value.userName.SetNull();
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 31: {
            LogStep(31, "User creation in the out-of-bounds slot fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            value.userName.SetNull();
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 32: {
            LogStep(32, "Clear first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 33: {
            LogStep(33, "Read cleared user and verify it is available");
            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 34: {
            LogStep(34, "Create new user in the cleared slot");
            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.SetNull();
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 35: {
            LogStep(35, "Read the user in the previously cleared slot 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 36: {
            LogStep(36, "Clear user with index 0 fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "Clear user with out-of-bounds index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "Clear all users");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 65534U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "Read first cleared user and verify it is available");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "Read last cleared user and verify it is available");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = NumberOfTotalUsersSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 41: {
            LogStep(41, "Get number of supported PIN credentials and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::NumberOfPINUsersSupported::Id,
                                 true, chip::NullOptional);
        }
        case 42: {
            LogStep(42, "Check that PIN credential does not exist");
            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 43: {
            LogStep(43, "Reading PIN credential with index 0 returns no credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(1);
            value.credential.credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 44: {
            LogStep(44, "Reading PIN credential with out-of-bounds index returns no credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(1);
            value.credential.credentialIndex = static_cast<uint16_t>(NumberOfPINUsersSupported + 1);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 45: {
            LogStep(45, "Verify that a user with UserStatus = 0 cannot be added via SetCredential");
            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("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(0);
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "Verify that a user with UserStatus = 2 cannot be added via SetCredential");
            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("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(2);
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 47: {
            LogStep(47, "Create new PIN credential and user");
            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("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 48: {
            LogStep(48, "Verify created user");
            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 49: {
            LogStep(49, "Verify created PIN credential");
            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 50: {
            LogStep(50, "Create new PIN credential and user with index 0 fails");
            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 = 0U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 51: {
            LogStep(51, "Create new PIN credential and user with out-of-bounds index fails");
            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 = static_cast<uint16_t>(NumberOfPINUsersSupported + 1);

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 52: {
            LogStep(52, "Get number of supported RFID credentials and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::NumberOfRFIDUsersSupported::Id,
                                 true, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Reading RFID credential with index 0 returns no credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
            value.credential.credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 54: {
            LogStep(54, "Reading RFID credential with out-of-bounds index returns no credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
            value.credential.credentialIndex = static_cast<uint16_t>(NumberOfRFIDUsersSupported + 1);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 55: {
            LogStep(55, "Check that RFID credential does not exist");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
            value.credential.credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 56: {
            LogStep(56, "Create new RFID credential and add it to existing user with non-null UserStatus should fail");
            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("rfid_data_123456garbage: not in length on purpose"), 16);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(1);
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 57: {
            LogStep(57, "Create new RFID credential and add it to existing user with non-null UserType should fail");
            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("rfid_data_123456garbage: not in length on purpose"), 16);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            value.userStatus.SetNull();
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::UserTypeEnum>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 58: {
            LogStep(58, "Create new RFID credential and add it to existing user with non-null UserType and UserStatus should fail");
            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("rfid_data_123456garbage: not in length on purpose"), 16);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 1U;
            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);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 59: {
            LogStep(59, "Create new RFID credential and add it to existing user");
            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("rfid_data_123456garbage: not in length on purpose"), 16);
            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 60: {
            LogStep(60, "Verify modified user");
            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 61: {
            LogStep(61, "Verify created credential");
            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 62: {
            LogStep(62, "Create new RFID credential and user with index 0 fails");
            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 = 0U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("new_rfid_data_fieldgarbage: not in length on purpose"), 19);
            value.userIndex.SetNull();
            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 63: {
            LogStep(63, "Create new RFID credential and user with out-of-bounds index fails");
            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 = static_cast<uint16_t>(NumberOfRFIDUsersSupported + 1);

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("new_rfid_data_fieldgarbage: not in length on purpose"), 19);
            value.userIndex.SetNull();
            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 64: {
            LogStep(64, "Create new credential and try to add it to 0 user");
            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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123465garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            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 65: {
            LogStep(65, "Create new credential and try to add it to out-of-bounds user");
            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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123465garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            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 66: {
            LogStep(66, "Create new PIN with too short data");
            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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("12345garbage: not in length on purpose"), 5);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            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 67: {
            LogStep(67, "Create new PIN with too long data");
            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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456789garbage: not in length on purpose"), 9);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            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 68: {
            LogStep(68, "Create new RFID with too short data");
            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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("rfid_datagarbage: not in length on purpose"), 9);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            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 69: {
            LogStep(69, "Create new PIN with Programming user type fails");
            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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            value.userStatus.SetNull();
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::UserTypeEnum>(3);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 70: {
            LogStep(70, "Create new RFID with too short data");
            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 = 2U;

            value.credentialData = chip::ByteSpan(
                chip::Uint8::from_const_char("very_long_rfid_data_to_test_boundariesgarbage: not in length on purpose"), 38);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 0U;
            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 71: {
            LogStep(71, "Create new PIN credential with data the would cause duplicate");
            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 = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 72: {
            LogStep(72, "Create new RFID credential with data the would cause duplicate");
            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 = 2U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_123456garbage: not in length on purpose"), 16);
            value.userIndex.SetNull();
            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 73: {
            LogStep(73, "Modify credentialData of existing PIN credential with non-null UserStatus should fail");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);

            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.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(1);
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 74: {
            LogStep(74, "Modify credentialData of existing PIN credential with non-null UserType should fail");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);

            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.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::UserTypeEnum>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 75: {
            LogStep(75, "Modify credentialData of existing PIN credential with non-null UserStatus and UserType should fail");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);

            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.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);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 76: {
            LogStep(76, "Modify credentialData of existing PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);

            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 77: {
            LogStep(77, "Verify that credential was changed by creating new credential with old data");
            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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 78: {
            LogStep(78, "Verify that credential was changed by creating new credential with new data");
            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 = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 79: {
            LogStep(79, "Create new RFID credential and add it to existing user");
            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 = 2U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_7890garbage: not in length on purpose"), 14);
            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 80: {
            LogStep(80, "Verify modified user");
            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 81: {
            LogStep(81, "Create new RFID credential and add it to existing user");
            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 = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("789012garbage: 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 82: {
            LogStep(82, "Verify modified user");
            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 83: {
            LogStep(83, "Clear first PIN credential");
            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 84: {
            LogStep(84, "Read back the credential and make sure it is deleted");
            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 85: {
            LogStep(85, "Read the user back and make sure PIN credential is deleted");
            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 86: {
            LogStep(86, "Clear the second PIN credential");
            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 = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 87: {
            LogStep(87, "Read back the credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(1);
            value.credential.credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 88: {
            LogStep(88, "Read the user back and make sure related user is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 89: {
            LogStep(89, "Create new RFID credential with user");
            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 = 3U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_12345garbage: not in length on purpose"), 15);
            value.userIndex.SetNull();
            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 90: {
            LogStep(90, "Clear all the RFID credentials");
            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 = 65534U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 91: {
            LogStep(91, "Read back the fist RFID credential and make sure it is deleted");
            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 92: {
            LogStep(92, "Read back the second RFID credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
            value.credential.credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 93: {
            LogStep(93, "Read back the third RFID credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
            value.credential.credentialIndex = 3U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 94: {
            LogStep(94, "Read the user related with first RFID back and make sure it has only PIN credential");
            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 95: {
            LogStep(95, "Read the user related with second RFID back and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 96: {
            LogStep(96, "Create new PIN credential with user");
            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.SetNull();
            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 97: {
            LogStep(97, "Create new RFID credential with user");
            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 = 2U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_1234garbage: not in length on purpose"), 14);
            value.userIndex.SetNull();
            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 98: {
            LogStep(98, "Create another RFID credential with user");
            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 = 6U;

            value.credentialData =
                chip::ByteSpan(chip::Uint8::from_const_char("rfid_data_9876garbage: not in length on purpose"), 14);
            value.userIndex.SetNull();
            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 99: {
            LogStep(99, "Clear all the credentials");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 100: {
            LogStep(100, "Read back the first PIN credential and make sure it is deleted");
            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 101: {
            LogStep(101, "Read back the first RFID credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(2);
            value.credential.credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 102: {
            LogStep(102, "Read back the second PIN credential and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(1);
            value.credential.credentialIndex = 6U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 103: {
            LogStep(103, "Read the user related with first PIN back and make sure it is deleted");
            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 104: {
            LogStep(104, "Read the user related with first RFID back and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 105: {
            LogStep(105, "Read the user related with second PIN back and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 3U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 106: {
            LogStep(106, "Read the user related with last RFID back and make sure it is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetUser::Type value;
            value.userIndex = 4U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetUser::Id, value,
                               chip::NullOptional

            );
        }
        case 107: {
            LogStep(107, "Create new Programming PIN credential with invalid index");
            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>(0);
            value.credential.credentialIndex = 1U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 108: {
            LogStep(108, "Create new Programming PIN credential with valid index");
            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>(0);
            value.credential.credentialIndex = 0U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 109: {
            LogStep(109, "Verify created user");
            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 110: {
            LogStep(110, "Verify created programming PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(0);
            value.credential.credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 111: {
            LogStep(111, "Modify the Programming PIN credential");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetCredential::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(2);

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(0);
            value.credential.credentialIndex = 0U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("654321garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 112: {
            LogStep(112, "Clearing Programming PIN fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(0);
            value.credential.Value().credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 113: {
            LogStep(113, "Clearing Programming PIN with invalid index fails");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearCredential::Type value;
            value.credential.SetNonNull();

            value.credential.Value().credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(0);
            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 114: {
            LogStep(114, "Clearing PIN credential with zero index fails");
            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 = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 115: {
            LogStep(115, "Clearing PIN credential with out-of-bound index fails");
            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 = static_cast<uint16_t>(NumberOfPINUsersSupported + 1);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 116: {
            LogStep(116, "Clearing RFID credential with zero index fails");
            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 = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 117: {
            LogStep(117, "Clearing RFID credential with out-of-bound index fails");
            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 = static_cast<uint16_t>(NumberOfRFIDUsersSupported + 1);

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 118: {
            LogStep(118, "Clear the Programming PIN user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 119: {
            LogStep(119, "Make sure Programming PIN user is deleted");
            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 120: {
            LogStep(120, "Make sure programming PIN credential is deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetCredentialStatus::Type value;

            value.credential.credentialType  = static_cast<chip::app::Clusters::DoorLock::CredentialTypeEnum>(0);
            value.credential.credentialIndex = 0U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 121: {
            LogStep(121, "Create new PIN credential and user");
            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("000000garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 122: {
            LogStep(122, "Create second PIN credential and add it to existing user");
            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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000001garbage: 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 123: {
            LogStep(123, "Create third PIN credential and add it to existing user");
            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 = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000002garbage: 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 124: {
            LogStep(124, "Create fourth PIN credential and add it to existing user");
            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 = 4U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000003garbage: 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 125: {
            LogStep(125, "Create fifth PIN credential and add it to existing user");
            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 = 5U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000004garbage: 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 126: {
            LogStep(126, "Try to create sixth PIN credential and make sure it fails");
            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 = 6U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("000005garbage: 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 127: {
            LogStep(127, "Final clean-up");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class DL_LockUnlockSuite : public TestCommand
{
public:
    DL_LockUnlockSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("DL_LockUnlock", 54, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~DL_LockUnlockSuite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(15)); }

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
    {
        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::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            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(), 3U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::DoorLock::Events::LockOperation::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("lockOperation.lockOperationType", value.lockOperationType, 1U));
                    VerifyOrReturn(CheckValue("lockOperation.operationSource", value.operationSource, 7U));
                    VerifyOrReturn(CheckValueNull("lockOperation.userIndex", value.userIndex));
                    VerifyOrReturn(CheckValuePresent("lockOperation.credentials", value.credentials));
                    VerifyOrReturn(CheckValueNull("lockOperation.credentials.Value()", value.credentials.Value()));
                }
                mTestSubStepIndex++;
                break;
            case 1:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::DoorLock::Events::LockOperation::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("lockOperation.lockOperationType", value.lockOperationType, 0U));
                    VerifyOrReturn(CheckValue("lockOperation.operationSource", value.operationSource, 7U));
                    VerifyOrReturn(CheckValueNull("lockOperation.userIndex", value.userIndex));
                    VerifyOrReturn(CheckValuePresent("lockOperation.credentials", value.credentials));
                    VerifyOrReturn(CheckValueNull("lockOperation.credentials.Value()", value.credentials.Value()));
                }
                mTestSubStepIndex++;
                break;
            case 2:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::DoorLock::Events::LockOperation::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("lockOperation.lockOperationType", value.lockOperationType, 1U));
                    VerifyOrReturn(CheckValue("lockOperation.operationSource", value.operationSource, 7U));
                    VerifyOrReturn(CheckValueNonNull("lockOperation.userIndex", value.userIndex));
                    VerifyOrReturn(CheckValue("lockOperation.userIndex.Value()", value.userIndex.Value(), 1U));
                    VerifyOrReturn(CheckValuePresent("lockOperation.credentials", value.credentials));
                    VerifyOrReturn(CheckValueNonNull("lockOperation.credentials.Value()", value.credentials.Value()));
                    {
                        auto iter_3 = value.credentials.Value().Value().begin();
                        VerifyOrReturn(CheckNextListItemDecodes<decltype(value.credentials.Value().Value())>(
                            "lockOperation.credentials.Value().Value()", iter_3, 0));
                        VerifyOrReturn(CheckValue("lockOperation.credentials.Value().Value()[0].credentialType",
                                                  iter_3.GetValue().credentialType, 1U));
                        VerifyOrReturn(CheckValue("lockOperation.credentials.Value().Value()[0].credentialIndex",
                                                  iter_3.GetValue().credentialIndex, 2U));
                        VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value().Value())>(
                            "lockOperation.credentials.Value().Value()", iter_3, 1));
                    }
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 14:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::DoorLock::Events::LockOperationError::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("lockOperationError.lockOperationType", value.lockOperationType, 1U));
                    VerifyOrReturn(CheckValue("lockOperationError.operationSource", value.operationSource, 7U));
                    VerifyOrReturn(CheckValue("lockOperationError.operationError", value.operationError, 1U));
                    VerifyOrReturn(CheckValueNull("lockOperationError.userIndex", value.userIndex));
                    VerifyOrReturn(CheckValuePresent("lockOperationError.credentials", value.credentials));
                    VerifyOrReturn(CheckValueNull("lockOperationError.credentials.Value()", value.credentials.Value()));
                }
                mTestSubStepIndex++;
                break;
            case 1:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::DoorLock::Events::LockOperationError::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("lockOperationError.lockOperationType", value.lockOperationType, 0U));
                    VerifyOrReturn(CheckValue("lockOperationError.operationSource", value.operationSource, 7U));
                    VerifyOrReturn(CheckValue("lockOperationError.operationError", value.operationError, 1U));
                    VerifyOrReturn(CheckValueNull("lockOperationError.userIndex", value.userIndex));
                    VerifyOrReturn(CheckValuePresent("lockOperationError.credentials", value.credentials));
                    VerifyOrReturn(CheckValueNull("lockOperationError.credentials.Value()", value.credentials.Value()));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            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), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> 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), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> 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), EMBER_ZCL_STATUS_FAILURE));
            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), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 34:
            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 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 39:
            switch (mTestSubStepIndex)
            {
            case 0:
                VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
                {
                    chip::app::Clusters::DoorLock::Events::DoorLockAlarm::DecodableType value;
                    VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                    VerifyOrReturn(CheckValue("doorLockAlarm.alarmCode", value.alarmCode, 4U));
                }
                mTestSubStepIndex++;
                break;
            default:
                LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
                break;
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 2U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 4U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 2U));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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, "Try to unlock the door without PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "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 3: {
            LogStep(3, "Try to lock the door without a PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "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 5: {
            LogStep(5, "Create new lock/unlock user");
            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 6: {
            LogStep(6, "Create new PIN credential and associate it with lock/unlock user, with userIndex != credentialIndex");
            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 = 2U;

            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 7: {
            LogStep(7, "Set the WrongCodeEntryLimit to big value so that we can test incorrect PIN entry");
            ListFreer listFreer;
            uint8_t value;
            value = 20U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Try to unlock the door with invalid PIN");
            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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "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 10: {
            LogStep(10, "Try to unlock the door with valid PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::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::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Read the LockOperation event list");
            mTestSubStepCount = 3;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Events::LockOperation::Id, false,
                             chip::NullOptional);
        }
        case 12: {
            LogStep(12, "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 13: {
            LogStep(13, "Try to lock the door with invalid PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::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::LockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Read the LockOperationError event list; verify null UserIndex and Credentials");
            mTestSubStepCount = 2;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Events::LockOperationError::Id, false,
                             chip::NullOptional);
        }
        case 15: {
            LogStep(15, "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 16: {
            LogStep(16, "Try to lock the door with valid PIN");
            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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "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 18: {
            LogStep(18, "Set OperatingMode to NoRemoteLockUnlock");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::OperatingModeEnum value;
            value = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::OperatingMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Try to unlock the door when OperatingMode is NoRemoteLockUnlock");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Set OperatingMode to Normal");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::OperatingModeEnum value;
            value = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::OperatingMode::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 21: {
            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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 23: {
            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();
            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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 24: {
            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("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 25: {
            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<uint16_t>(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, "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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "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();
            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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "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("123456garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 31: {
            LogStep(31, "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 32: {
            LogStep(32, "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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 33: {
            LogStep(33, "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, "Read the lockout timeout");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, true, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "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();
            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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "Try to unlock the door with invalid 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);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "Try to unlock the door with valid PIN and make sure it fails due to lockout");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::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::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "Read the DoorLockAlarm event list; verify WrongEntryCodeLimit alarm has been generated");
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Events::DoorLockAlarm::Id, false,
                             chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Wait for the lockout to end");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41, "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();
            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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 42: {
            LogStep(42, "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 43: {
            LogStep(43, "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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 44: {
            LogStep(44, "Create a disabled user and credential");
            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 = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("654321garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(3);
            value.userType.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 45: {
            LogStep(45, "Try to unlock the door with disabled user PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.PINCode.Emplace();
            value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("654321garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "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 47: {
            LogStep(47, "Unlock the door with enabled user PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::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::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 48: {
            LogStep(48, "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 49: {
            LogStep(49, "Try to lock the door with disabled user PIN");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.PINCode.Emplace();
            value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("654321garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Verify that lock state attribute value stays Unlocked");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Lock the door with enabled user PIN");
            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<uint16_t>(10000), chip::NullOptional

            );
        }
        case 52: {
            LogStep(52, "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 53: {
            LogStep(53, "Clean all the users and credentials");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 65534U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class DL_SchedulesSuite : public TestCommand
{
public:
    DL_SchedulesSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("DL_Schedules", 127, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~DL_SchedulesSuite() {}

    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;

    uint16_t NumberOfTotalUsersSupported;
    uint8_t NumberOfWeekDaySchedulesSupportedPerUser;
    uint8_t NumberOfYearDaySchedulesSupportedPerUser;
    uint8_t NumberOfHolidaySchedulesSupported;

    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
    {
        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));
            {
                chip::app::Clusters::DoorLock::Commands::SetCredentialResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfTotalUsersSupported", value, 10U));
                NumberOfTotalUsersSupported = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfWeekDaySchedulesSupportedPerUser", value, 10U));
                NumberOfWeekDaySchedulesSupportedPerUser = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfYearDaySchedulesSupportedPerUser", value, 10U));
                NumberOfYearDaySchedulesSupportedPerUser = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("numberOfHolidaySchedulesSupported", value, 10U));
                NumberOfHolidaySchedulesSupported = value;
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 0U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex,
                                          static_cast<uint8_t>(NumberOfWeekDaySchedulesSupportedPerUser + 1)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 0U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, static_cast<uint16_t>(NumberOfTotalUsersSupported + 1)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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_INVALID_COMMAND));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 0U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex,
                                          static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1)));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 0U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, static_cast<uint16_t>(NumberOfTotalUsersSupported + 1)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 0U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(
                    CheckValue("holidayIndex", value.holidayIndex, static_cast<uint8_t>(NumberOfHolidaySchedulesSupported + 1)));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 16U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 18U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 0U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 16U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 18U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 0U));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 16U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 18U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 0U));
            }
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 16U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 18U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 0U));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 2U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 123456UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 1234567UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 1U));
            }
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
            }
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 123456UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 1234567UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 1U));
            }
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 2U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 4U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 4U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 64U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 55555UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 7777777UL));
            }
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 4U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 4U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 1U));
            }
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 123456UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 1234567UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 1U));
            }
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, NumberOfHolidaySchedulesSupported));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 1UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 100UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 4U));
            }
            break;
        case 111:
            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(CheckValueNonNull("userIndex", value.userIndex));
                VerifyOrReturn(CheckValue("userIndex.Value()", value.userIndex.Value(), 1U));
                VerifyOrReturn(CheckValueNonNull("nextCredentialIndex", value.nextCredentialIndex));
                VerifyOrReturn(CheckValue("nextCredentialIndex.Value()", value.nextCredentialIndex.Value(), 2U));
            }
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 12345UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 12345689UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, NumberOfHolidaySchedulesSupported));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 1UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 100UL));
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 4U));
            }
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 120:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 121:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 2U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, NumberOfHolidaySchedulesSupported));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 1U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 0U));
                VerifyOrReturn(CheckValuePresent("endHour", value.endHour));
                VerifyOrReturn(CheckValue("endHour.Value()", value.endHour.Value(), 23U));
                VerifyOrReturn(CheckValuePresent("endMinute", value.endMinute));
                VerifyOrReturn(CheckValue("endMinute.Value()", value.endMinute.Value(), 59U));
            }
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 9000UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 888888888UL));
            }
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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 PIN credential and schedule user");
            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.SetNull();
            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 2: {
            LogStep(2, "Get number of supported users");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Get Max number of Week Day schedules for user and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfWeekDaySchedulesSupportedPerUser::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Get Max number of Year Day schedules for user and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfYearDaySchedulesSupportedPerUser::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Get Max number of Holiday schedules and verify default value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfHolidaySchedulesSupported::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Create Week Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Create Week Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = static_cast<uint8_t>(NumberOfWeekDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Create Week Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 0U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Create Week Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Create Week Day schedule for non-existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 2U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Create Week Day schedule with 0 days mask");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(0U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Create Week Day schedule for Sunday and Monday");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(3U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "Create Week Day schedule for Sunday Wednesday and Saturday");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(73U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Create Week Day schedule with invalid start hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 24U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Create Week Day schedule with invalid start minute");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 60U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Create Week Day schedule with invalid end hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 24U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Create Week Day schedule with invalid end minute");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 60U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Create Week Day schedule with start hour later that end hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 19U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Create Week Day schedule with start minute later that end minute when hours are equal");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 50U;
            value.endHour      = 15U;
            value.endMinute    = 49U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Make sure that previous operations did not create a schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Get Week Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Get Week Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = static_cast<uint8_t>(NumberOfWeekDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Get Week Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Get Week Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Get Week Day schedule with non-existing user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Create Year Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 0U;
            value.userIndex      = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "Create Year Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1);
            value.userIndex      = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Create Year Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 0U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Create Year Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Create Year Day schedule for non-existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 2U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 31: {
            LogStep(31, "Create Year Day schedule with start hour later that end hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 12345689UL;
            value.localEndTime   = 12345688UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 32: {
            LogStep(32, "Make sure that previous operations did not create a schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 33: {
            LogStep(33, "Get Year Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "Get Year Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 35: {
            LogStep(35, "Get Year Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "Get Year Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "Get Year Day schedule with non-existing user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "Create Holiday schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 0U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "Create Holiday schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = static_cast<uint8_t>(NumberOfHolidaySchedulesSupported + 1);
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "Create Holiday schedule with start hour later that end hour");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 1U;
            value.localStartTime = 12345689UL;
            value.localEndTime   = 12345688UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 41: {
            LogStep(41, "Create Holiday schedule with invalid operating mode");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(5);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 42: {
            LogStep(42, "Make sure that previous operations did not create a schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 43: {
            LogStep(43, "Get Holiday schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 44: {
            LogStep(44, "Get Holiday schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = static_cast<uint8_t>(NumberOfHolidaySchedulesSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 45: {
            LogStep(45, "Create Holiday schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "Verify created schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 47: {
            LogStep(47, "Create Week Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 15U;
            value.startMinute  = 16U;
            value.endHour      = 18U;
            value.endMinute    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 48: {
            LogStep(48, "Verify created schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 49: {
            LogStep(49, "Create Year Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 12345UL;
            value.localEndTime   = 12345689UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Verify created schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 51: {
            LogStep(51, "Clear Week Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 52: {
            LogStep(52, "Clear Week Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = static_cast<uint8_t>(NumberOfWeekDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 53: {
            LogStep(53, "Clear Week Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 54: {
            LogStep(54, "Clear Week Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 55: {
            LogStep(55, "Clear Week Day schedule with non-existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 56: {
            LogStep(56, "Make sure that week day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 57: {
            LogStep(57, "Make sure that year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 58: {
            LogStep(58, "Make sure that holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 59: {
            LogStep(59, "Clear Year Day schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 60: {
            LogStep(60, "Clear Year Day schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1);
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 61: {
            LogStep(61, "Clear Year Day schedule with 0 user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 62: {
            LogStep(62, "Clear Year Day schedule with out-of-bounds user index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = static_cast<uint16_t>(NumberOfTotalUsersSupported + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 63: {
            LogStep(63, "Clear Year Day schedule with non-existing user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 64: {
            LogStep(64, "Make sure that week day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 65: {
            LogStep(65, "Make sure that year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 66: {
            LogStep(66, "Make sure that holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 67: {
            LogStep(67, "Clear Holiday schedule with 0 index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearHolidaySchedule::Type value;
            value.holidayIndex = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 68: {
            LogStep(68, "Clear Holiday schedule with out-of-bounds index");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearHolidaySchedule::Type value;
            value.holidayIndex = static_cast<uint8_t>(NumberOfYearDaySchedulesSupportedPerUser + 1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 69: {
            LogStep(69, "Make sure that week day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 70: {
            LogStep(70, "Make sure that year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 71: {
            LogStep(71, "Make sure that holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 72: {
            LogStep(72, "Create another Week Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 2U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(2U);
            value.startHour    = 0U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 73: {
            LogStep(73, "Verify created week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 74: {
            LogStep(74, "Create another Year Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 2U;
            value.userIndex      = 1U;
            value.localStartTime = 9000UL;
            value.localEndTime   = 888888888UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 75: {
            LogStep(75, "Verify created year day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 76: {
            LogStep(76, "Create another Holiday schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 2U;
            value.localStartTime = 123456UL;
            value.localEndTime   = 1234567UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 77: {
            LogStep(77, "Verify created holiday schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 78: {
            LogStep(78, "Clear a single week day schedule for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 79: {
            LogStep(79, "Verify cleared week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 80: {
            LogStep(80, "Clear all remaining week day schedules for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 254U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 81: {
            LogStep(81, "Verify cleared week schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 82: {
            LogStep(82, "Make sure that first year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 83: {
            LogStep(83, "Make sure that second year day schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 84: {
            LogStep(84, "Make sure that first holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 85: {
            LogStep(85, "Make sure that second holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 86: {
            LogStep(86, "Create another Week Day schedule with valid parameters");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(2U);
            value.startHour    = 0U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 87: {
            LogStep(87, "Clear a single year day schedule for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 88: {
            LogStep(88, "Verify cleared year day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 89: {
            LogStep(89, "Clear all remaining year schedules for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 254U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 90: {
            LogStep(90, "Verify that second year day schedule was cleared");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 2U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 91: {
            LogStep(91, "Verify created week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 92: {
            LogStep(92, "Clear all remaining week day schedules for the first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 254U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 93: {
            LogStep(93, "Create new user without credential so we can add more schedules to it");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = 2U;
            value.userName.SetNull();
            value.userUniqueID.SetNull();
            value.userStatus.SetNull();
            value.userType.SetNull();
            value.credentialRule.SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 94: {
            LogStep(94, "Create Week Day schedule with valid parameters for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 0U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 95: {
            LogStep(95, "Verify created week day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 96: {
            LogStep(96, "Create Year Day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 4U;
            value.userIndex      = 1U;
            value.localStartTime = 9000UL;
            value.localEndTime   = 888888888UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 97: {
            LogStep(97, "Verify created year day schedule for first");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 4U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 98: {
            LogStep(98, "Create Week Day schedule with valid parameters for second user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 4U;
            value.userIndex    = 2U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(64U);
            value.startHour    = 23U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 99: {
            LogStep(99, "Verify created week day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 4U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 100: {
            LogStep(100, "Create Year Day schedule for second user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 55555UL;
            value.localEndTime   = 7777777UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 101: {
            LogStep(101, "Verify created year day schedule for first");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 102: {
            LogStep(102, "Cleanup the user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 65534U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 103: {
            LogStep(103, "Make sure clearing first user also cleared week day schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 104: {
            LogStep(104, "Make sure clearing first user also cleared year day schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 4U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 105: {
            LogStep(105, "Make sure clearing second user also cleared week day schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 4U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 106: {
            LogStep(106, "Make sure clearing second user also cleared year day schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 107: {
            LogStep(107, "Make sure that first holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 108: {
            LogStep(108, "Make sure that second holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 109: {
            LogStep(109, "Create another Holiday schedule at the last slot");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = NumberOfHolidaySchedulesSupported;
            value.localStartTime = 1UL;
            value.localEndTime   = 100UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(4);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 110: {
            LogStep(110, "Verify Created Holiday Schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = NumberOfHolidaySchedulesSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 111: {
            LogStep(111, "Create new PIN credential and schedule user");
            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.SetNull();
            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 112: {
            LogStep(112, "Create Week Day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(1U);
            value.startHour    = 0U;
            value.startMinute  = 0U;
            value.endHour      = 23U;
            value.endMinute    = 59U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 113: {
            LogStep(113, "Create Year Day schedule for first user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 9000UL;
            value.localEndTime   = 888888888UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 114: {
            LogStep(114, "Clear a single holiday schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 115: {
            LogStep(115, "Make sure that first holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 116: {
            LogStep(116, "Make sure that second holiday schedule was deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 117: {
            LogStep(117, "Make sure that third holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = NumberOfHolidaySchedulesSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 118: {
            LogStep(118, "Make sure clearing holiday schedule did not clear week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 119: {
            LogStep(119, "Make sure clearing holiday schedule did not clear year day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 120: {
            LogStep(120, "Clear all remaining holiday schedules");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearHolidaySchedule::Type value;
            value.holidayIndex = 254U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 121: {
            LogStep(121, "Make sure that first holiday is still deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 122: {
            LogStep(122, "Make sure that second holiday schedule was deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 123: {
            LogStep(123, "Make sure that third holiday schedule was not deleted");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = NumberOfHolidaySchedulesSupported;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 124: {
            LogStep(124, "Make sure clearing holiday schedule did not clear week day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 125: {
            LogStep(125, "Make sure clearing holiday schedule did not clear year day schedule");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 126: {
            LogStep(126, "Final Cleanup");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 65534U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_1_1Suite : public TestCommand
{
public:
    Test_TC_DRLK_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_1_1", 43, 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_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 6U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 4UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 16UL));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 32UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 64UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 128UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 256UL));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1024UL));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 2048UL));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 37UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 38UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 27UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 23UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 24UL));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 21UL));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 22UL));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 48UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 49UL));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 51UL));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 33UL));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 34UL));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 35UL));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 36UL));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 39UL));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 40UL));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 41UL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 42UL));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 43UL));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 44UL));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 11UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 13UL));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 16UL));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 26UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 27UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 29UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 34UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 36UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 38UL));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 12UL));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 35UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 37UL));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !DRLK.S.F00 && !DRLK.S.F01 && !DRLK.S.F02 && !DRLK.S.F04 && !DRLK.S.F05 && !DRLK.S.F06 && "
                                   "!DRLK.S.F07 && !DRLK.S.F08 && !DRLK.S.F0a && !DRLK.S.F0b "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given DRLK.S.F00(PIN) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Given DRLK.S.F01(RID) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Given DRLK.S.F02(FGP) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Given DRLK.S.F04(WDSCH) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Given DRLK.S.F05(DPS) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Given DRLK.S.F06(FACE) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F06"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Given DRLK.S.F07(COTA) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Given DRLK.S.F08(USR) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Given DRLK.S.F0a(YDSCH) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Given DRLK.S.F0b(HDSCH) ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH reads Feature dependent(DRLK.S.F05) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F05"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH reads Feature dependent(DRLK.S.F08) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH reads Feature dependent(DRLK.S.F00) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH reads Feature dependent(DRLK.S.F01) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH reads Feature dependent(DRLK.S.F04) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH reads Feature dependent(DRLK.S.F0a) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH reads Feature dependent(DRLK.S.F0b) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "TH reads Feature dependent(DRLK.S.F00 or DRLK.S.F01) attributes in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 || DRLK.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH reads Feature dependent(DRLK.S.F07 or DRLK.S.F00) attribute in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 || DRLK.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 23: {
            LogStep(23, "TH reads optional attribute(Language) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0021"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "TH reads optional attribute(LEDSettings) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0022"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH reads optional attribute(AutoRelockTime) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "TH reads optional attribute(SoundVolume) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0024"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "TH reads optional attribute(DefaultConfigurationRegister) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0027"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH reads optional attribute(EnableLocalProgramming) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0028"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH reads optional attribute(EnableOneTouchLocking) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0029"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH reads optional attribute(EnableInsideStatusLED) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A002a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH reads optional attribute(EnablePrivacyModeButton) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A002b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "TH reads optional attribute(LocalProgrammingFeatures) in AttributeList");
            VerifyOrDo(!ShouldSkip("DRLK.S.A002c"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "TH reads Feature dependent commands(DRLK.S.F04) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "TH reads Feature dependent commands(DRLK.S.F0a) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "TH reads Feature dependent commands(DRLK.S.F0b) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "TH reads Feature dependent commands(DRLK.S.F08) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 38: {
            LogStep(38, "TH reads optional commands(DRLK.S.C03.Rsp) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "TH reads Feature dependent command(DRLK.S.F04) in GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 40: {
            LogStep(40, "TH reads Feature dependent command(DRLK.S.F0a) in GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 41: {
            LogStep(41, "TH reads Feature dependent command(DRLK.S.F0b) in GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 42: {
            LogStep(42, "TH reads Feature dependent command(DRLK.S.F08) in GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_2Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_2", 27, 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_2Suite() {}

    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
    {
        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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
                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 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("requirePINforRemoteOperation", value, false));
            }
            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), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("requirePINforRemoteOperation", value, true));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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");
            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>(1000), 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, "Create new PIN credential and lock/unlock user");
            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>(1000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify created PIN credential");
            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 5: {
            LogStep(5, "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads the RequirePINforRemoteOperation attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::RequirePINforRemoteOperation::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH sends Lock Door Command to the DUT without PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH sends Lock Door Command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            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<uint16_t>(1000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads the RequirePINforRemoteOperation attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::RequirePINforRemoteOperation::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH sends Lock Door Command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            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<uint16_t>(1000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH sends Lock Door Command to the DUT without valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            value.PINCode.Emplace();
            value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("645321garbage: not in length on purpose"), 6);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH sends Lock Door Command to the DUT without any argument PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::LockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::LockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH reads the WrongCodeEntryLimit attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17,
                    "TH sends an Unlock Door Command from the DUT with invalid PINCode. Repeat this step "
                    "PIXIT.DRLK.WrongCodeEntryLimit times and Verify that DUT sends failure response to the TH");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH sends an Unlock Door Command from User1 to the DUT with the valid PINCode and verify the DUT response");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19,
                    "Wait for PIXIT.DRLK.UserCodeTemporaryDisableTime.TH then sends an Unlock Door Command from User1 to the DUT "
                    "with the valid PINCode.");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20,
                    "TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on the DUT and Verify that the DUT sends "
                    "Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 21: {
            LogStep(21,
                    "TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on the DUT and verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            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, "TH reads the UserCodeTemporaryDisableTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23,
                    "TH writes UserCodeTemporaryDisableTime attribute value as between 1 and 255 on the DUT and Verify that the "
                    "DUT sends Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 24: {
            LogStep(24,
                    "TH writes UserCodeTemporaryDisableTime attribute value as between 1 and 255 on the DUT and verify DUT "
                    "responds with UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Clean the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Cleanup the created credential");
            VerifyOrDo(!ShouldSkip("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>(1000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_3Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_3", 39, 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_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

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
    {
        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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
                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 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("requirePINforRemoteOperation", value, false));
            }
            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), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("requirePINforRemoteOperation", value, true));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 22:
            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), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("userCodeTemporaryDisableTime", value, 15U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("autoRelockTime", value, 10UL));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("autoRelockTime", value, 60UL));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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");
            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>(1000), 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, "Create new PIN credential and lock/unlock user");
            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>(1000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify created PIN credential");
            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 5: {
            LogStep(5, "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 6: {
            LogStep(6,
                    "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && !DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = false;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads the RequirePINforRemoteOperation attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::RequirePINforRemoteOperation::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH sends the unlock Door command to the DUT without PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH sends the unlock Door command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::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::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify DUT responds with "
                    "UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && !DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            bool value;
            value = true;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::RequirePINforRemoteOperation::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH reads the RequirePINforRemoteOperation attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::RequirePINforRemoteOperation::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH sends the unlock Door command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::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::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.PINCode.Emplace();
            value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH sends the unlock Door command to the DUT without PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16,
                    "TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and Verify that the DUT sends Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17,
                    "TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and verify DUT responds with UNSUPPORTED_WRITE");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && ! DRLK.S.A0030"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 3U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::WrongCodeEntryLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18,
                    "TH writes UserCodeTemporaryDisableTime attribute value as 15 Seconds on the DUT and Verify that the DUT sends "
                    "Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 19: {
            LogStep(19,
                    "TH writes UserCodeTemporaryDisableTime attribute value as 15 Seconds on the DUT and Verify that the DUT sends "
                    "Success response");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && ! DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 15U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                  DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.PINCode.Emplace();
            value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.PINCode.Emplace();
            value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.PINCode.Emplace();
            value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "TH sends the unlock Door command to the DUT with invalid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::Type value;
            value.PINCode.Emplace();
            value.PINCode.Value() = chip::ByteSpan(chip::Uint8::from_const_char("1234568garbage: not in length on purpose"), 7);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "TH reads the UserCodeTemporaryDisableTime attribute from the DUT and check attribute is triggered");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::UserCodeTemporaryDisableTime::Id, true, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "TH sends the unlock Door command to the DUT with valid PINCode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::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::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Wait for UserCodeTemporaryDisableTime expires");
            VerifyOrDo(!ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0031"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 15000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "TH writes AutoRelockTime attribute value as 10 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 10UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "TH writes AutoRelockTime attribute value as 60 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 60UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "TH writes AutoRelockTime attribute value as 10 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0023 && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 10UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "TH writes AutoRelockTime attribute value as 60 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("!DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 60UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "TH reads the AutoRelockTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "TH reads the AutoRelockTime attribute from the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33,
                    "TH sends the unlock Door command to the DUT with valid PINCode and Verify that DUT sends SUCCESS response to "
                    "the TH");
            VerifyOrDo(!ShouldSkip("DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockDoor::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::UnlockDoor::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 34: {
            LogStep(34, "Wait for AutoRelockTime Expires");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35, "Wait for AutoRelockTime Expires");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 60000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 36: {
            LogStep(36, "TH reads LockState attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0000 && DRLK.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Cleanup the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "Clean the created credential");
            VerifyOrDo(!ShouldSkip("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>(1000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_4Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_4", 12, 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_4Suite() {}

    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
    {
        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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("credentialExists", value.credentialExists, true));
                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 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("lockState", value));
                VerifyOrReturn(CheckValue("lockState.Value()", value.Value(), 1U));
            }
            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;
        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;
        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");
            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>(1000), 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, "Create new PIN credential and lock/unlock user");
            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>(1000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify created PIN credential");
            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 5: {
            LogStep(5, "TH writes AutoRelockTime attribute value as 60 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 60UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH writes AutoRelockTime attribute value as 60 seconds on the DUT");
            VerifyOrDo(!ShouldSkip(" !DRLK.S.A0023 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint32_t value;
            value = 60UL;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH sends the Unlock with Timeout argument value as 60 seconds");
            VerifyOrDo(!ShouldSkip("DRLK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockWithTimeout::Type value;
            value.timeout = 60U;
            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::UnlockWithTimeout::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Wait 60s");
            VerifyOrDo(!ShouldSkip("DRLK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 60000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads LockState attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0000 && DRLK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Cleanup the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(1000), chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Clean the created credential");
            VerifyOrDo(!ShouldSkip("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>(1000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_5Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_5", 12, 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_5Suite() {}

    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;

    uint8_t NumberOfWeekDaySchedulesSupportedPerUser;
    uint16_t NumberOfTotalUsersSupported;

    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
    {
        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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                NumberOfWeekDaySchedulesSupportedPerUser = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                NumberOfTotalUsersSupported = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("daysMask", value.daysMask));
                VerifyOrReturn(CheckValue("daysMask.Value()", value.daysMask.Value(), 2U));
                VerifyOrReturn(CheckValuePresent("startHour", value.startHour));
                VerifyOrReturn(CheckValue("startHour.Value()", value.startHour.Value(), 15U));
                VerifyOrReturn(CheckValuePresent("startMinute", value.startMinute));
                VerifyOrReturn(CheckValue("startMinute.Value()", value.startMinute.Value(), 45U));
                VerifyOrReturn(CheckConstraintHasValue("value.endHour", value.endHour, true));
                VerifyOrReturn(CheckConstraintMinValue("value.endHour.Value()", value.endHour.Value(), 16U));
                VerifyOrReturn(CheckConstraintHasValue("value.endMinute", value.endMinute, true));
                VerifyOrReturn(CheckConstraintMinValue("value.endMinute.Value()", value.endMinute.Value(), 55U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 0U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckConstraintHasValue("value.daysMask", value.daysMask, false));
                VerifyOrReturn(CheckConstraintHasValue("value.startHour", value.startHour, false));
                VerifyOrReturn(CheckConstraintHasValue("value.startMinute", value.startMinute, false));
                VerifyOrReturn(CheckConstraintHasValue("value.endHour", value.endHour, false));
                VerifyOrReturn(CheckConstraintHasValue("value.endMinute", value.endMinute, false));
            }
            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::GetWeekDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("weekDayIndex", value.weekDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckConstraintHasValue("value.daysMask", value.daysMask, false));
                VerifyOrReturn(CheckConstraintHasValue("value.startHour", value.startHour, false));
                VerifyOrReturn(CheckConstraintHasValue("value.startMinute", value.startMinute, false));
                VerifyOrReturn(CheckConstraintHasValue("value.endHour", value.endHour, false));
                VerifyOrReturn(CheckConstraintHasValue("value.endMinute", value.endMinute, false));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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");
            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 reads NumberOfWeekDay SchedulesSupportedPerUser attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.A0014"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfWeekDaySchedulesSupportedPerUser::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads NumberOfTotalUsers Supported attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH send Set Week Day Schedule Command");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(2U);
            value.startHour    = 15U;
            value.startMinute  = 45U;
            value.endHour      = 16U;
            value.endMinute    = 55U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "TH send Get Week Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH send Set Week Day Schedule Command");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0b.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            value.daysMask     = static_cast<chip::BitMask<chip::app::Clusters::DoorLock::DaysMaskMap>>(7U);
            value.startHour    = 15U;
            value.startMinute  = 45U;
            value.endHour      = 16U;
            value.endMinute    = 55U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH send Get Week Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 0U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH sends Clear Week Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0d.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH sends Get Week Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetWeekDaySchedule::Type value;
            value.weekDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetWeekDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Cleanup the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_6Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_6", 10, 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_6Suite() {}

    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;

    uint8_t NumberOfHolidaySchedulesSupported;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                NumberOfHolidaySchedulesSupported = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 20UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 30UL));
                if (value.localEndTime.HasValue())
                {
                    VerifyOrReturn(CheckConstraintMinValue("value.localEndTime.Value()", value.localEndTime.Value(), 21UL));
                }
                VerifyOrReturn(CheckValuePresent("operatingMode", value.operatingMode));
                VerifyOrReturn(CheckValue("operatingMode.Value()", value.operatingMode.Value(), 0U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 15U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 10U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("holidayIndex", value.holidayIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for commissionee");
            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, "TH reads NumberOfHoliday SchedulesSupported and saves for future use.");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b && DRLK.S.A0016"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfHolidaySchedulesSupported::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Create Holiday schedule with 1 index");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b && DRLK.S.C11.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 1U;
            value.localStartTime = 20UL;
            value.localEndTime   = 30UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(0);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Get Holiday Schedule with HolidayIndex as 1");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b && DRLK.S.C12.Rsp && DRLK.S.C12.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Create Holiday schedule with invalid operating mode");
            VerifyOrDo(!ShouldSkip("DRLK.S.C11.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetHolidaySchedule::Type value;
            value.holidayIndex   = 1U;
            value.localStartTime = 20UL;
            value.localEndTime   = 30UL;
            value.operatingMode  = static_cast<chip::app::Clusters::DoorLock::OperatingModeEnum>(5);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Get Holiday Schedule with Invalid HolidayIndex 15.");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b && DRLK.S.C12.Rsp && DRLK.S.C12.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 15U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Get Holiday Schedule with the Non-scheduled HolidayIndex");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b && DRLK.S.C12.Rsp && DRLK.S.C12.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 10U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "Clear Holiday schedule with 1 index");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b && DRLK.S.C13.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Make sure that holiday schedule was deleted");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0b && DRLK.S.C12.Rsp && DRLK.S.C12.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetHolidaySchedule::Type value;
            value.holidayIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetHolidaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Cleanup the created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_7Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_7", 19, 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_7Suite() {}

    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;

    uint8_t NumberOfYearDaySchedulesSupportedPerUser;
    uint16_t NumberOfTotalUsersSupported;

    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
    {
        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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
                NumberOfYearDaySchedulesSupportedPerUser = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                NumberOfTotalUsersSupported = value;
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 960UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 1980UL));
                if (value.localEndTime.HasValue())
                {
                    VerifyOrReturn(CheckConstraintMinValue("value.localEndTime.Value()", value.localEndTime.Value(), 961UL));
                }
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 0U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 15U));
                VerifyOrReturn(CheckValue("status", value.status, 133U));
                VerifyOrReturn(CheckConstraintHasValue("value.localStartTime", value.localStartTime, false));
                VerifyOrReturn(CheckConstraintHasValue("value.localEndTime", value.localEndTime, false));
            }
            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::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, NumberOfYearDaySchedulesSupportedPerUser));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 5U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckConstraintHasValue("value.localStartTime", value.localStartTime, false));
                VerifyOrReturn(CheckConstraintHasValue("value.localEndTime", value.localEndTime, false));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckConstraintHasValue("value.localStartTime", value.localStartTime, false));
                VerifyOrReturn(CheckConstraintHasValue("value.localEndTime", value.localEndTime, false));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("yearDayIndex", value.yearDayIndex, 1U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 1U));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValuePresent("localStartTime", value.localStartTime));
                VerifyOrReturn(CheckValue("localStartTime.Value()", value.localStartTime.Value(), 1080UL));
                VerifyOrReturn(CheckValuePresent("localEndTime", value.localEndTime));
                VerifyOrReturn(CheckValue("localEndTime.Value()", value.localEndTime.Value(), 2100UL));
                if (value.localEndTime.HasValue())
                {
                    VerifyOrReturn(CheckConstraintMinValue("value.localEndTime.Value()", value.localEndTime.Value(), 1081UL));
                }
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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");
            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 reads NumberOfYearDay SchedulesSupportedPerUser attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfYearDaySchedulesSupportedPerUser::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads NumberOfTotalUsers Supported attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH sends Set Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0e.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 960UL;
            value.localEndTime   = 1980UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH send Set Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.C0e.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 0U;
            value.userIndex      = 15U;
            value.localStartTime = 1020UL;
            value.localEndTime   = 2040UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 0U;
            value.userIndex    = 15U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Create a user with userIndex as 5");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = 5U;
            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 10: {
            LogStep(10, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = NumberOfYearDaySchedulesSupportedPerUser;
            value.userIndex    = 5U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "TH sends Clear Year Day Schedule to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.C10.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx && DRLK.S.C10.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "TH sends Set Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.C0e.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetYearDaySchedule::Type value;
            value.yearDayIndex   = 1U;
            value.userIndex      = 1U;
            value.localStartTime = 1080UL;
            value.localEndTime   = 2100UL;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH sends Get Year Day Schedule Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::GetYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "TH sends Clear Year Day Schedule to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C10.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 0U;
            value.userIndex    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Clear a year day schedule for the first user");
            VerifyOrDo(!ShouldSkip("DRLK.S.F0a && DRLK.S.C10.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearYearDaySchedule::Type value;
            value.yearDayIndex = 1U;
            value.userIndex    = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearYearDaySchedule::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Cleanup the created user with UserIndex 1");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Cleanup the created user with UserIndex 5");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 5U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_9Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_9", 21, 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_9Suite() {}

    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;

    uint16_t NumberOfTotalUsersSupported;

    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
    {
        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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65534U));
                NumberOfTotalUsersSupported = value;
            }
            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::GetCredentialStatusResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                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 6:
            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, 133U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
            }
            break;
        case 7:
            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, 2U));
                VerifyOrReturn(CheckValueNull("userIndex", value.userIndex));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            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 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            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));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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 reads NumberOfTotalUsersSupported attribute and saves for future use.");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH sends Set Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("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 5: {
            LogStep(5, "TH sends Get Credential Status Command");
            VerifyOrDo(!ShouldSkip("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 6: {
            LogStep(6, "TH sends Set Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("4321garbage: not in length on purpose"), 4);
            value.userIndex.SetNull();
            value.userStatus.SetNonNull();
            value.userStatus.Value() = static_cast<chip::app::Clusters::DoorLock::UserStatusEnum>(5);
            value.userType.SetNonNull();
            value.userType.Value() = static_cast<chip::app::Clusters::DoorLock::UserTypeEnum>(10);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::SetCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH sends Set Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("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 = 2U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNull();
            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 8: {
            LogStep(8,
                    "TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential Response command with "
                    "status as DUPLICATE or OCCUPIED");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9,
                    "TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential Response command with "
                    "response as OCCUPIED if the CredentialIndex is repeated");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10,
                    "TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential Response command with "
                    "response as OCCUPIED if the CredentialIndex is repeated");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH sends Clear Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("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 12: {
            LogStep(12, "TH sends Get Credential Status Command to DUT");
            VerifyOrDo(!ShouldSkip("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 13: {
            LogStep(13, "TH sends Set User Command to DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.C1a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::SetUser::Type value;
            value.operationType = static_cast<chip::app::Clusters::DoorLock::DataOperationTypeEnum>(0);
            value.userIndex     = 2U;
            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 14: {
            LogStep(14, "TH sends Set Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("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() = 2U;
            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 15: {
            LogStep(15, "TH sends Clear Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("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 = 65534U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "TH sends Get Credential Status Command");
            VerifyOrDo(!ShouldSkip("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 = 65534U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::GetCredentialStatus::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "TH sends Get Credential Status Command");
            VerifyOrDo(!ShouldSkip("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 18: {
            LogStep(18, "TH sends Clear Credential Command to DUT");
            VerifyOrDo(!ShouldSkip("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>(8);
            value.credential.Value().credentialIndex = 2U;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearCredential::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Cleanup the first created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 1U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Cleanup the second created user");
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::ClearUser::Type value;
            value.userIndex = 2U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Commands::ClearUser::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_11Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_11Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_11", 23, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("PINCredentialData", &mPINCredentialData);
        AddArgument("RFIDCredentialData", &mRFIDCredentialData);
        AddArgument("FingerVeinCredentialData", &mFingerVeinCredentialData);
        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<chip::ByteSpan> mPINCredentialData;
    chip::Optional<chip::ByteSpan> mRFIDCredentialData;
    chip::Optional<chip::ByteSpan> mFingerVeinCredentialData;
    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
    {
        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(CheckValueNonNull("credentials", value.credentials));
                {
                    auto iter_1 = value.credentials.Value().begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.credentials.Value())>("credentials.Value()", iter_1, 0));
                }
                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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 8:
            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 9:
            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 10:
            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 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));
            {
                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 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, 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 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, 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 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            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 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            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 21:
            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 22:
            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;
        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 reads NumberOfTotalUsersSupported and saves for future use.");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.A0011"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id,
                                 DoorLock::Attributes::NumberOfTotalUsersSupported::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads MinPINCodeLength and saves for future use.");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::MinPINCodeLength::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads MaxPINCodeLength and saves for future use.");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::MaxPINCodeLength::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads MinRFIDCodeLength and saves for future use.");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.F01 && DRLK.S.A001a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::MinRFIDCodeLength::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH reads MaxRFIDCodeLength and saves for future use.");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && DRLK.S.F01 && DRLK.S.A0019"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::MaxRFIDCodeLength::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "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 = mPINCredentialData.HasValue() ? mPINCredentialData.Value()
                                                                 : chip::ByteSpan(chip::Uint8::from_const_char("123456"), 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 9: {
            LogStep(9, "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 = mRFIDCredentialData.HasValue()
                ? mRFIDCredentialData.Value()
                : chip::ByteSpan(chip::Uint8::from_const_char("RFIDTESTDATA"), 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 10: {
            LogStep(10, "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 = mFingerVeinCredentialData.HasValue() ? mFingerVeinCredentialData.Value()
                                                                        : chip::ByteSpan(chip::Uint8::from_const_char("123456"), 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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "TH sends Get Credential Status Command with type RFID");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && 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 13: {
            LogStep(13, "TH sends Get Credential Status Command with type FingerVein");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && 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 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 15: {
            LogStep(15, "TH sends Get Credential Status Command with type RFID");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && 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 16: {
            LogStep(16, "TH sends Get Credential Status Command with type FingerVein");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && 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 17: {
            LogStep(17, "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 18: {
            LogStep(18, "TH sends Get Credential Status Command with type FingerVein");
            VerifyOrDo(!ShouldSkip("DRLK.S.F08 && 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 19: {
            LogStep(19, "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 20: {
            LogStep(20, "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 21: {
            LogStep(21, "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 22: {
            LogStep(22, "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:
    TestGroupMessagingSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestGroupMessaging", 41, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupMessagingSuite() {}

    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<chip::NodeId> mNodeId2;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 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));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("xyzzy", 5)));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 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));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("xyzzy", 5)));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("", 0)));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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, "KeySet Write 1");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "KeySet Write 2");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 418U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2220000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2220001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2220002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Write Group Keys");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 0U;

                listHolder_0->mList[1].groupId       = 258U;
                listHolder_0->mList[1].groupKeySetID = 418U;
                listHolder_0->mList[1].fabricIndex   = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Add Group 1 (endpoint 1)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Add Group 2 (endpoint 0)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 258U;
            value.groupName = chip::Span<const char>("Group #2garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Install ACLs");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(4);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read initial Attribute value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Group Write Attribute");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("xyzzygarbage: not in length on purpose", 5);
            return WriteGroupAttribute(kIdentityAlpha, 258, BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                       value, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Wait for write 1");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 10: {
            LogStep(10, "Read back Attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Restore initial Attribute value");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteGroupAttribute(kIdentityAlpha, 258, BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                       value, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait for write 2");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Read back Attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Check on/off attribute value is false for endpoint 1");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 16: {
            LogStep(16, "Wait for command 3");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Check on/off attribute value is true after on command for endpoint 1");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Turn off the light to get ready for the next test");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Cleanup ACLs");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Commission from gamma");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 1126240820ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 22: {
            LogStep(22, "Wait for the commissioned device to be retrieved for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 1126240820ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 23: {
            LogStep(23, "KeySet Write 1 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityGamma, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "KeySet Write 2 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 418U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2220000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2220001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2220002ULL;

            return SendCommand(kIdentityGamma, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Write Group Keys for gamma");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 0U;

                listHolder_0->mList[1].groupId       = 258U;
                listHolder_0->mList[1].groupKeySetID = 418U;
                listHolder_0->mList[1].fabricIndex   = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityGamma, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Add Group 1 (endpoint 1) for gamma");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityGamma, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "Add Group 2 (endpoint 0) for gamma");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 258U;
            value.groupName = chip::Span<const char>("Group #2garbage: not in length on purpose", 8);
            return SendCommand(kIdentityGamma, GetEndpoint(0), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Install ACLs for gamma");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(4);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNull();
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityGamma, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read initial Attribute value for gamma");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Group Write Attribute for gamma");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("xyzzygarbage: not in length on purpose", 5);
            return WriteGroupAttribute(kIdentityGamma, 258, BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                       value, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Wait for write 1 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityGamma, value);
        }
        case 32: {
            LogStep(32, "Read back Attribute for gamma");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Restore initial Attribute value for gamma");
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("garbage: not in length on purpose", 0);
            return WriteGroupAttribute(kIdentityGamma, 258, BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                       value, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Wait for write 2 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityGamma, value);
        }
        case 35: {
            LogStep(35, "Read back Attribute for gamma");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Check on/off attribute value is false for endpoint 1 for gamma");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Turn On the light to see attribute change for gamma");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityGamma, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 38: {
            LogStep(38, "Wait for command 3 for gamma");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityGamma, value);
        }
        case 39: {
            LogStep(39, "Check on/off attribute value is true after on command for endpoint 1 for gamma");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Cleanup ACLs for gamma");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityGamma, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestGroupsClusterSuite : public TestCommand
{
public:
    TestGroupsClusterSuite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("TestGroupsCluster", 27, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupsClusterSuite() {}

    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
    {
        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));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 135U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 0U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 126U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
            }
            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));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #1", 8)));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("capacity", value.capacity));
                {
                    auto iter_0 = value.groupList.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.groupList)>("groupList", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupList[0]", iter_0.GetValue(), 257U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.groupList)>("groupList", iter_0, 1));
                }
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #2", 8)));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 32767U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #1", 8)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #2", 8)));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("capacity", value.capacity));
                {
                    auto iter_0 = value.groupList.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.groupList)>("groupList", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupList[0]", iter_0.GetValue(), 258U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.groupList)>("groupList", iter_0, 1));
                }
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 135U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 0U));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 260U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
                VerifyOrReturn(CheckValueAsString("groupName", value.groupName, chip::CharSpan("Group #1", 8)));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("capacity", value.capacity));
                {
                    auto iter_0 = value.groupList.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value.groupList)>("groupList", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupList[0]", iter_0.GetValue(), 257U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.groupList)>("groupList", iter_0, 1));
                }
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::ViewGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 139U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 32767U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::GetGroupMembershipResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNull("capacity", value.capacity));
                {
                    auto iter_0 = value.groupList.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value.groupList)>("groupList", iter_0, 0));
                }
            }
            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;
        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, "View Group 0 (invalid)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "View First Group (not found)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Add First Group (no keys)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Add KeySet");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Write Group Keys");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                listHolder_0->mList[1].groupId       = 258U;
                listHolder_0->mList[1].groupKeySetID = 417U;
                listHolder_0->mList[1].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Add First Group (new)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "View First Group (new)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "View Second Group (not found)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "Get Group Membership 1 (all)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::GetGroupMembership::Type value;

            value.groupList = chip::app::DataModel::List<chip::GroupId>();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::GetGroupMembership::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Add Second Group (new)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 258U;
            value.groupName = chip::Span<const char>("Group #2garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "View Second Group (new)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "View Group 3 (not found)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 32767U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 13: {
            LogStep(13, "View First Group (existing)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "View Second Group (existing)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Get Group Membership 2");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::GetGroupMembership::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::GroupId>(3);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 258U;
                listHolder_0->mList[1] = 259U;
                listHolder_0->mList[2] = 32767U;
                value.groupList        = chip::app::DataModel::List<chip::GroupId>(listHolder_0->mList, 3);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::GetGroupMembership::Id, value,
                               chip::NullOptional

            );
        }
        case 16: {
            LogStep(16, "Remove Group 0 (invalid)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveGroup::Type value;
            value.groupID = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Remove Group 4 (not found)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveGroup::Type value;
            value.groupID = 260U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Remove Second Group (existing)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveGroup::Type value;
            value.groupID = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "View First Group (not removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "View Second Group (removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Get Group Membership 3");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::GetGroupMembership::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::GroupId>(4);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 257U;
                listHolder_0->mList[2] = 258U;
                listHolder_0->mList[3] = 3U;
                value.groupList        = chip::app::DataModel::List<chip::GroupId>(listHolder_0->mList, 4);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::GetGroupMembership::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Remove All");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
                               chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "View First Group (removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "View Second Group (still removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 258U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "View Group 3 (removed)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::ViewGroup::Type value;
            value.groupID = 32767U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::ViewGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Get Group Membership 4");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::GetGroupMembership::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::GroupId>(5);
                listFreer.add(listHolder_0);
                listHolder_0->mList[0] = 1U;
                listHolder_0->mList[1] = 257U;
                listHolder_0->mList[2] = 258U;
                listHolder_0->mList[3] = 3U;
                listHolder_0->mList[4] = 32767U;
                value.groupList        = chip::app::DataModel::List<chip::GroupId>(listHolder_0->mList, 5);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::GetGroupMembership::Id, value,
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestGroupKeyManagementClusterSuite : public TestCommand
{
public:
    TestGroupKeyManagementClusterSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestGroupKeyManagementCluster", 43, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupKeyManagementClusterSuite() {}

    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<chip::CharSpan> mPayload;
    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 4U));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 3U));
            }
            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));
            {
                chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySetID", value.groupKeySet.groupKeySetID, 417U));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySecurityPolicy", value.groupKeySet.groupKeySecurityPolicy, 0U));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey0", value.groupKeySet.epochKey0));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime0", value.groupKeySet.epochStartTime0));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime0.Value()", value.groupKeySet.epochStartTime0.Value(), 1110000ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey1", value.groupKeySet.epochKey1));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime1", value.groupKeySet.epochStartTime1));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime1.Value()", value.groupKeySet.epochStartTime1.Value(), 1110001ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey2", value.groupKeySet.epochKey2));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime2", value.groupKeySet.epochStartTime2));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime2.Value()", value.groupKeySet.epochStartTime2.Value(), 1110002ULL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            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));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupId", iter_0.GetValue().groupId, 257U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupKeySetID", iter_0.GetValue().groupKeySetID, 417U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 2));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupId", iter_0.GetValue().groupId, 259U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupKeySetID", iter_0.GetValue().groupKeySetID, 417U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 3));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].groupId", iter_0.GetValue().groupId, 260U));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 4));
                }
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupId", iter_0.GetValue().groupId, 257U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupKeySetID", iter_0.GetValue().groupKeySetID, 417U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 2));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupId", iter_0.GetValue().groupId, 259U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupKeySetID", iter_0.GetValue().groupKeySetID, 417U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 3));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].groupId", iter_0.GetValue().groupId, 260U));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 4));
                    VerifyOrReturn(CheckValue("groupKeyMap[4].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValue("groupKeyMap[4].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[4].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 5));
                    VerifyOrReturn(CheckValue("groupKeyMap[5].groupId", iter_0.GetValue().groupId, 259U));
                    VerifyOrReturn(CheckValue("groupKeyMap[5].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[5].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 6));
                    VerifyOrReturn(CheckValue("groupKeyMap[6].groupId", iter_0.GetValue().groupId, 260U));
                    VerifyOrReturn(CheckValue("groupKeyMap[6].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[6].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 7));
                    VerifyOrReturn(CheckValue("groupKeyMap[7].groupId", iter_0.GetValue().groupId, 261U));
                    VerifyOrReturn(CheckValue("groupKeyMap[7].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[7].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 8));
                }
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupId", iter_0.GetValue().groupId, 259U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 2));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupId", iter_0.GetValue().groupId, 260U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 3));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].groupId", iter_0.GetValue().groupId, 261U));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 4));
                }
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupId", iter_0.GetValue().groupId, 257U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupKeySetID", iter_0.GetValue().groupKeySetID, 417U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 2));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupId", iter_0.GetValue().groupId, 259U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].groupKeySetID", iter_0.GetValue().groupKeySetID, 417U));
                    VerifyOrReturn(CheckValue("groupKeyMap[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 3));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].groupId", iter_0.GetValue().groupId, 260U));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U));
                    VerifyOrReturn(CheckValue("groupKeyMap[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 4));
                    VerifyOrReturn(CheckValue("groupKeyMap[4].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValue("groupKeyMap[4].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[4].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 5));
                    VerifyOrReturn(CheckValue("groupKeyMap[5].groupId", iter_0.GetValue().groupId, 259U));
                    VerifyOrReturn(CheckValue("groupKeyMap[5].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[5].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 6));
                    VerifyOrReturn(CheckValue("groupKeyMap[6].groupId", iter_0.GetValue().groupId, 260U));
                    VerifyOrReturn(CheckValue("groupKeyMap[6].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[6].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 7));
                    VerifyOrReturn(CheckValue("groupKeyMap[7].groupId", iter_0.GetValue().groupId, 261U));
                    VerifyOrReturn(CheckValue("groupKeyMap[7].groupKeySetID", iter_0.GetValue().groupKeySetID, 419U));
                    VerifyOrReturn(CheckValue("groupKeyMap[7].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 8));
                }
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 258U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 259U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 260U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 261U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 257U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[0].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #1", 8)));
                    VerifyOrReturn(CheckValue("groupTable[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupTable[1].groupId", iter_0.GetValue().groupId, 258U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[1].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[1].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[1].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[1].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[1].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #2", 8)));
                    VerifyOrReturn(CheckValue("groupTable[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 2));
                    VerifyOrReturn(CheckValue("groupTable[2].groupId", iter_0.GetValue().groupId, 259U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[2].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[2].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[2].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[2].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[2].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #3", 8)));
                    VerifyOrReturn(CheckValue("groupTable[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 3));
                    VerifyOrReturn(CheckValue("groupTable[3].groupId", iter_0.GetValue().groupId, 260U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[3].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[3].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[3].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[3].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[3].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #4", 8)));
                    VerifyOrReturn(CheckValue("groupTable[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 4));
                }
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 257U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[0].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #1", 8)));
                    VerifyOrReturn(CheckValue("groupTable[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupTable[1].groupId", iter_0.GetValue().groupId, 258U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[1].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[1].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[1].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[1].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[1].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #2", 8)));
                    VerifyOrReturn(CheckValue("groupTable[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 2));
                    VerifyOrReturn(CheckValue("groupTable[2].groupId", iter_0.GetValue().groupId, 259U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[2].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[2].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[2].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[2].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[2].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #3", 8)));
                    VerifyOrReturn(CheckValue("groupTable[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 3));
                    VerifyOrReturn(CheckValue("groupTable[3].groupId", iter_0.GetValue().groupId, 260U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[3].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[3].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[3].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[3].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[3].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #4", 8)));
                    VerifyOrReturn(CheckValue("groupTable[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 4));
                    VerifyOrReturn(CheckValue("groupTable[4].groupId", iter_0.GetValue().groupId, 261U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[4].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[4].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[4].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[4].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[4].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #5", 8)));
                    VerifyOrReturn(CheckValue("groupTable[4].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 5));
                }
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 261U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[0].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #5", 8)));
                    VerifyOrReturn(CheckValue("groupTable[0].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 1));
                }
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 257U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[0].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #1", 8)));
                    VerifyOrReturn(CheckValue("groupTable[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupTable[1].groupId", iter_0.GetValue().groupId, 258U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[1].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[1].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[1].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[1].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[1].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #2", 8)));
                    VerifyOrReturn(CheckValue("groupTable[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 2));
                    VerifyOrReturn(CheckValue("groupTable[2].groupId", iter_0.GetValue().groupId, 259U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[2].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[2].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[2].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[2].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[2].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #3", 8)));
                    VerifyOrReturn(CheckValue("groupTable[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 3));
                    VerifyOrReturn(CheckValue("groupTable[3].groupId", iter_0.GetValue().groupId, 260U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[3].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[3].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[3].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[3].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[3].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #4", 8)));
                    VerifyOrReturn(CheckValue("groupTable[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 4));
                    VerifyOrReturn(CheckValue("groupTable[4].groupId", iter_0.GetValue().groupId, 261U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[4].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[4].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[4].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[4].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[4].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #5", 8)));
                    VerifyOrReturn(CheckValue("groupTable[4].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 5));
                }
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySetID", value.groupKeySet.groupKeySetID, 418U));
                VerifyOrReturn(CheckValue("groupKeySet.groupKeySecurityPolicy", value.groupKeySet.groupKeySecurityPolicy, 1U));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey0", value.groupKeySet.epochKey0));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime0", value.groupKeySet.epochStartTime0));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime0.Value()", value.groupKeySet.epochStartTime0.Value(), 2110000ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey1", value.groupKeySet.epochKey1));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime1", value.groupKeySet.epochStartTime1));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime1.Value()", value.groupKeySet.epochStartTime1.Value(), 2110001ULL));
                VerifyOrReturn(CheckValueNull("groupKeySet.epochKey2", value.groupKeySet.epochKey2));
                VerifyOrReturn(CheckValueNonNull("groupKeySet.epochStartTime2", value.groupKeySet.epochStartTime2));
                VerifyOrReturn(
                    CheckValue("groupKeySet.epochStartTime2.Value()", value.groupKeySet.epochStartTime2.Value(), 2110002ULL));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
            }
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupTable[0].groupId", iter_0.GetValue().groupId, 258U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[0].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[0].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[0].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[0].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #2", 8)));
                    VerifyOrReturn(CheckValue("groupTable[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 1));
                    VerifyOrReturn(CheckValue("groupTable[1].groupId", iter_0.GetValue().groupId, 259U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[1].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[1].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[1].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[1].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[1].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #3", 8)));
                    VerifyOrReturn(CheckValue("groupTable[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupTable", iter_0, 2));
                    VerifyOrReturn(CheckValue("groupTable[2].groupId", iter_0.GetValue().groupId, 260U));
                    {
                        auto iter_2 = iter_0.GetValue().endpoints.begin();
                        VerifyOrReturn(
                            CheckNextListItemDecodes<decltype(iter_0.GetValue().endpoints)>("groupTable[2].endpoints", iter_2, 0));
                        VerifyOrReturn(CheckValue("groupTable[2].endpoints[0]", iter_2.GetValue(), 1U));
                        VerifyOrReturn(
                            CheckNoMoreListItems<decltype(iter_0.GetValue().endpoints)>("groupTable[2].endpoints", iter_2, 1));
                    }
                    VerifyOrReturn(CheckValuePresent("groupTable[2].groupName", iter_0.GetValue().groupName));
                    VerifyOrReturn(CheckValueAsString("groupTable[2].groupName.Value()", iter_0.GetValue().groupName.Value(),
                                                      chip::CharSpan("Group #4", 8)));
                    VerifyOrReturn(CheckValue("groupTable[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 3));
                }
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupTable", iter_0, 0));
                }
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("groupKeyMap", iter_0, 0));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupId", iter_0.GetValue().groupId, 258U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U));
                    VerifyOrReturn(CheckValue("groupKeyMap[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 1));
                }
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 0));
                }
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Wait for the commissioned device to be retrieved for alpha");
            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, "Open Commissioning Window from alpha");
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Commission from beta");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 3: {
            LogStep(3, "Wait for the commissioned device to be retrieved for beta");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 4: {
            LogStep(4, "Read maxGroupsPerFabric");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::MaxGroupsPerFabric::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read maxGroupKeysPerFabric");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::MaxGroupKeysPerFabric::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "KeySet Write 1");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "KeySet Write 2");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 418U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(1);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "KeySet Write 3");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 419U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(1);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() =
                chip::ByteSpan(chip::Uint8::from_const_char(" !\042#$%&'()*+,-./garbage: not in length on purpose"), 16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2110002ULL;

            return SendCommand(kIdentityBeta, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetWrite::Id,
                               value, chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "KeySet Read");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
            value.groupKeySetID = 417U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
                               value, chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Write Group Keys (invalid)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 258U;
                listHolder_0->mList[0].groupKeySetID = 0U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Write Group Keys (too many)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(14);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                listHolder_0->mList[1].groupId       = 257U;
                listHolder_0->mList[1].groupKeySetID = 418U;
                listHolder_0->mList[1].fabricIndex   = 1U;

                listHolder_0->mList[2].groupId       = 258U;
                listHolder_0->mList[2].groupKeySetID = 417U;
                listHolder_0->mList[2].fabricIndex   = 1U;

                listHolder_0->mList[3].groupId       = 258U;
                listHolder_0->mList[3].groupKeySetID = 418U;
                listHolder_0->mList[3].fabricIndex   = 1U;

                listHolder_0->mList[4].groupId       = 259U;
                listHolder_0->mList[4].groupKeySetID = 417U;
                listHolder_0->mList[4].fabricIndex   = 1U;

                listHolder_0->mList[5].groupId       = 259U;
                listHolder_0->mList[5].groupKeySetID = 418U;
                listHolder_0->mList[5].fabricIndex   = 1U;

                listHolder_0->mList[6].groupId       = 260U;
                listHolder_0->mList[6].groupKeySetID = 417U;
                listHolder_0->mList[6].fabricIndex   = 1U;

                listHolder_0->mList[7].groupId       = 260U;
                listHolder_0->mList[7].groupKeySetID = 418U;
                listHolder_0->mList[7].fabricIndex   = 1U;

                listHolder_0->mList[8].groupId       = 261U;
                listHolder_0->mList[8].groupKeySetID = 417U;
                listHolder_0->mList[8].fabricIndex   = 1U;

                listHolder_0->mList[9].groupId       = 261U;
                listHolder_0->mList[9].groupKeySetID = 418U;
                listHolder_0->mList[9].fabricIndex   = 1U;

                listHolder_0->mList[10].groupId       = 262U;
                listHolder_0->mList[10].groupKeySetID = 417U;
                listHolder_0->mList[10].fabricIndex   = 1U;

                listHolder_0->mList[11].groupId       = 262U;
                listHolder_0->mList[11].groupKeySetID = 418U;
                listHolder_0->mList[11].fabricIndex   = 1U;

                listHolder_0->mList[12].groupId       = 263U;
                listHolder_0->mList[12].groupKeySetID = 417U;
                listHolder_0->mList[12].fabricIndex   = 1U;

                listHolder_0->mList[13].groupId       = 263U;
                listHolder_0->mList[13].groupKeySetID = 418U;
                listHolder_0->mList[13].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 14);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write Group Keys on alpha");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                listHolder_0->mList[1].groupId       = 258U;
                listHolder_0->mList[1].groupKeySetID = 418U;
                listHolder_0->mList[1].fabricIndex   = 1U;

                listHolder_0->mList[2].groupId       = 259U;
                listHolder_0->mList[2].groupKeySetID = 417U;
                listHolder_0->mList[2].fabricIndex   = 1U;

                listHolder_0->mList[3].groupId       = 260U;
                listHolder_0->mList[3].groupKeySetID = 418U;
                listHolder_0->mList[3].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Write Group Keys on beta");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(4);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 258U;
                listHolder_0->mList[0].groupKeySetID = 419U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                listHolder_0->mList[1].groupId       = 259U;
                listHolder_0->mList[1].groupKeySetID = 419U;
                listHolder_0->mList[1].fabricIndex   = 1U;

                listHolder_0->mList[2].groupId       = 260U;
                listHolder_0->mList[2].groupKeySetID = 419U;
                listHolder_0->mList[2].fabricIndex   = 1U;

                listHolder_0->mList[3].groupId       = 261U;
                listHolder_0->mList[3].groupKeySetID = 419U;
                listHolder_0->mList[3].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read Group Keys on alpha");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read Group Keys on alpha without fabric filtering");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, false, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read Group Keys on beta");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read Group Keys on beta without fabric filtering");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, false, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Add Group 1");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Add Group 2");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 258U;
            value.groupName = chip::Span<const char>("Group #2garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Add Group 3");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 259U;
            value.groupName = chip::Span<const char>("Group #3garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "Add Group 4");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 260U;
            value.groupName = chip::Span<const char>("Group #4garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Add Group 5");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 261U;
            value.groupName = chip::Span<const char>("Group #5garbage: not in length on purpose", 8);
            return SendCommand(kIdentityBeta, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Read GroupTable from alpha");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read GroupTable from alpha without fabric filtering");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, false, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Read GroupTable from beta");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read GroupTable from beta without fabric filtering");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, false, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "KeySet Remove 1");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
            value.groupKeySetID = 417U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "KeySet Read (removed)");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
            value.groupKeySetID = 417U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
                               value, chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "KeySet Read (not removed)");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
            value.groupKeySetID = 418U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
                               value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Remove Group 1");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveGroup::Type value;
            value.groupID = 257U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveGroup::Id, value,
                               chip::NullOptional

            );
        }
        case 31: {
            LogStep(31, "Read GroupTable 2");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Remove All");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value,
                               chip::NullOptional

            );
        }
        case 33: {
            LogStep(33, "Read GroupTable 3");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "KeySet Remove 2");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
            value.groupKeySetID = 418U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional

            );
        }
        case 35: {
            LogStep(35, "KeySet Read (also removed)");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value;
            value.groupKeySetID = 418U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Commands::KeySetRead::Id,
                               value, chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "KeySet Write 1");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "KeySet Write 2");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 418U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(1);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 2110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 2110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 2110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 38: {
            LogStep(38, "Map Group 1 and Group 2 to KeySet 1 and group 2 to KeySet 2");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(3);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 1U;

                listHolder_0->mList[1].groupId       = 258U;
                listHolder_0->mList[1].groupKeySetID = 418U;
                listHolder_0->mList[1].fabricIndex   = 1U;

                listHolder_0->mList[2].groupId       = 258U;
                listHolder_0->mList[2].groupKeySetID = 417U;
                listHolder_0->mList[2].fabricIndex   = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 3);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Remove keyset 1");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
            value.groupKeySetID = 417U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "TH verifies GroupKeyMap entries for KeySet 1 have been removed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Remove keyset 2");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value;
            value.groupKeySetID = 418U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetRemove::Id, value, chip::NullOptional

            );
        }
        case 42: {
            LogStep(42, "TH verifies GroupKeyMap entries for KeySet 2 have been removed");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_1_1Suite : public TestCommand
{
public:
    Test_TC_G_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_1_1", 7, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 4U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintHasMasksSet("value", value, 1UL));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            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;
        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, "TH reads the ClusterRevision from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads the FeatureMap from DUT");
            VerifyOrDo(!ShouldSkip(" !G.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Given G.S.F00 ensure featuremap has the correct bit set");
            VerifyOrDo(!ShouldSkip("G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads AttributeList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads AcceptedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH reads GeneratedCommandList from DUT");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_2_1Suite : public TestCommand
{
public:
    Test_TC_G_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_2_1", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_2_1Suite() {}

    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;

    uint8_t NameSupportFeatureSupportedValue;
    uint8_t NameSupportValue;

    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
    {
        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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("nameSupport", value, 128U));
                NameSupportFeatureSupportedValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("nameSupport", value, 0U));
                NameSupportValue = value;
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("nameSupport", value, NameSupportFeatureSupportedValue));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("nameSupport", value, NameSupportValue));
            }
            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;
        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, "TH reads NameSupport attribute from DUT");
            VerifyOrDo(!ShouldSkip("G.S.A0000 && G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH reads NameSupport attribute from DUT");
            VerifyOrDo(!ShouldSkip("G.S.A0000 && !G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH writes NameSupport attribute as 0x80 EXOR the value as read in step 1");
            VerifyOrDo(!ShouldSkip("G.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 128U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH reads NameSupport attribute from DUT");
            VerifyOrDo(!ShouldSkip("G.S.A0000 && G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "TH reads NameSupport attribute from DUT");
            VerifyOrDo(!ShouldSkip("G.S.A0000 && !G.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Attributes::NameSupport::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_5Suite : public TestCommand
{
public:
    Test_TC_DD_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_6Suite : public TestCommand
{
public:
    Test_TC_DD_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_7Suite : public TestCommand
{
public:
    Test_TC_DD_1_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_7Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_8Suite : public TestCommand
{
public:
    Test_TC_DD_1_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_8Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_9Suite : public TestCommand
{
public:
    Test_TC_DD_1_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_9Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_10Suite : public TestCommand
{
public:
    Test_TC_DD_1_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_10Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_11Suite : public TestCommand
{
public:
    Test_TC_DD_1_11Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_11", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_12Suite : public TestCommand
{
public:
    Test_TC_DD_1_12Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_12", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_12Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_13Suite : public TestCommand
{
public:
    Test_TC_DD_1_13Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_13", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_13Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_14Suite : public TestCommand
{
public:
    Test_TC_DD_1_14Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_14Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_1_15Suite : public TestCommand
{
public:
    Test_TC_DD_1_15Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_1_15", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_1_15Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_2_1Suite : public TestCommand
{
public:
    Test_TC_DD_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_2_2Suite : public TestCommand
{
public:
    Test_TC_DD_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_1Suite : public TestCommand
{
public:
    Test_TC_DD_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_2Suite : public TestCommand
{
public:
    Test_TC_DD_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_3Suite : public TestCommand
{
public:
    Test_TC_DD_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_4Suite : public TestCommand
{
public:
    Test_TC_DD_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_5Suite : public TestCommand
{
public:
    Test_TC_DD_3_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_6Suite : public TestCommand
{
public:
    Test_TC_DD_3_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_7Suite : public TestCommand
{
public:
    Test_TC_DD_3_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_7Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_8Suite : public TestCommand
{
public:
    Test_TC_DD_3_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_8Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_9Suite : public TestCommand
{
public:
    Test_TC_DD_3_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_9Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_10Suite : public TestCommand
{
public:
    Test_TC_DD_3_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_10Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_11Suite : public TestCommand
{
public:
    Test_TC_DD_3_11Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_11", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_12Suite : public TestCommand
{
public:
    Test_TC_DD_3_12Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_12", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_12Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_13Suite : public TestCommand
{
public:
    Test_TC_DD_3_13Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_13", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_13Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_14Suite : public TestCommand
{
public:
    Test_TC_DD_3_14Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_14Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_15Suite : public TestCommand
{
public:
    Test_TC_DD_3_15Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_15", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_15Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_16Suite : public TestCommand
{
public:
    Test_TC_DD_3_16Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_16", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_16Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_17Suite : public TestCommand
{
public:
    Test_TC_DD_3_17Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_17", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_17Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_18Suite : public TestCommand
{
public:
    Test_TC_DD_3_18Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_18", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_18Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_19Suite : public TestCommand
{
public:
    Test_TC_DD_3_19Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_19", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_19Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_20Suite : public TestCommand
{
public:
    Test_TC_DD_3_20Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_20", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_20Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DD_3_21Suite : public TestCommand
{
public:
    Test_TC_DD_3_21Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DD_3_21", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DD_3_21Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class TestGroupDemoCommandSuite : public TestCommand
{
public:
    TestGroupDemoCommandSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestGroupDemoCommand", 21, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupDemoCommandSuite() {}

    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            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;
        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, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 2: {
            LogStep(2, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 6: {
            LogStep(6, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 8: {
            LogStep(8, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 10: {
            LogStep(10, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 12: {
            LogStep(12, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 14: {
            LogStep(14, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 16: {
            LogStep(16, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Turn On the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::On::Id, value);
        }
        case 18: {
            LogStep(18, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Turn Off the light to see attribute change");
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendGroupCommand(kIdentityAlpha, 257, OnOff::Id, OnOff::Commands::Off::Id, value);
        }
        case 20: {
            LogStep(20, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class TestGroupDemoConfigSuite : public TestCommand
{
public:
    TestGroupDemoConfigSuite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("TestGroupDemoConfig", 5, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~TestGroupDemoConfigSuite() {}

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
                VerifyOrReturn(CheckValue("groupID", value.groupID, 257U));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        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, "KeySet Write 1 (endpoint 0)");
            ListFreer listFreer;
            chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value;

            value.groupKeySet.groupKeySetID = 417U;
            value.groupKeySet.groupKeySecurityPolicy =
                static_cast<chip::app::Clusters::GroupKeyManagement::GroupKeySecurityPolicyEnum>(0);
            value.groupKeySet.epochKey0.SetNonNull();
            value.groupKeySet.epochKey0.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime0.SetNonNull();
            value.groupKeySet.epochStartTime0.Value() = 1110000ULL;
            value.groupKeySet.epochKey1.SetNonNull();
            value.groupKeySet.epochKey1.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime1.SetNonNull();
            value.groupKeySet.epochStartTime1.Value() = 1110001ULL;
            value.groupKeySet.epochKey2.SetNonNull();
            value.groupKeySet.epochKey2.Value() = chip::ByteSpan(
                chip::Uint8::from_const_char(
                    "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317garbage: not in length on purpose"),
                16);
            value.groupKeySet.epochStartTime2.SetNonNull();
            value.groupKeySet.epochStartTime2.Value() = 1110002ULL;

            return SendCommand(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                               GroupKeyManagement::Commands::KeySetWrite::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Write Group Keys (endpoint 0)");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(1);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].groupId       = 257U;
                listHolder_0->mList[0].groupKeySetID = 417U;
                listHolder_0->mList[0].fabricIndex   = 0U;

                value = chip::app::DataModel::List<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                  GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Add Group 1 (endpoint 1)");
            ListFreer listFreer;
            chip::app::Clusters::Groups::Commands::AddGroup::Type value;
            value.groupID   = 257U;
            value.groupName = chip::Span<const char>("Group #1garbage: not in length on purpose", 8);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Install ACLs");
            ListFreer listFreer;
            chip::app::DataModel::List<const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(2);
                listFreer.add(listHolder_0);

                listHolder_0->mList[0].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(5);
                listHolder_0->mList[0].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(2);
                listHolder_0->mList[0].subjects.SetNull();
                listHolder_0->mList[0].targets.SetNull();
                listHolder_0->mList[0].fabricIndex = 1U;

                listHolder_0->mList[1].privilege =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryPrivilegeEnum>(3);
                listHolder_0->mList[1].authMode =
                    static_cast<chip::app::Clusters::AccessControl::AccessControlEntryAuthModeEnum>(3);
                listHolder_0->mList[1].subjects.SetNonNull();

                {
                    auto * listHolder_3 = new ListHolder<uint64_t>(1);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0]                  = 257ULL;
                    listHolder_0->mList[1].subjects.Value() = chip::app::DataModel::List<uint64_t>(listHolder_3->mList, 1);
                }
                listHolder_0->mList[1].targets.SetNull();
                listHolder_0->mList[1].fabricIndex = 1U;

                value = chip::app::DataModel::List<chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_2_2Suite : public TestCommand
{
public:
    Test_TC_G_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_2_3Suite : public TestCommand
{
public:
    Test_TC_G_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_3_2Suite : public TestCommand
{
public:
    Test_TC_G_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_G_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_1Suite : public TestCommand
{
public:
    Test_TC_BDX_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_2Suite : public TestCommand
{
public:
    Test_TC_BDX_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_3Suite : public TestCommand
{
public:
    Test_TC_BDX_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_4Suite : public TestCommand
{
public:
    Test_TC_BDX_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_5Suite : public TestCommand
{
public:
    Test_TC_BDX_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_1_6Suite : public TestCommand
{
public:
    Test_TC_BDX_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_1_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_1_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_1Suite : public TestCommand
{
public:
    Test_TC_BDX_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_2Suite : public TestCommand
{
public:
    Test_TC_BDX_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_3Suite : public TestCommand
{
public:
    Test_TC_BDX_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_4Suite : public TestCommand
{
public:
    Test_TC_BDX_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BDX_2_5Suite : public TestCommand
{
public:
    Test_TC_BDX_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BDX_2_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BDX_2_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BR_1Suite : public TestCommand
{
public:
    Test_TC_BR_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BR_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BR_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BR_2Suite : public TestCommand
{
public:
    Test_TC_BR_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BR_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BR_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BR_3Suite : public TestCommand
{
public:
    Test_TC_BR_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BR_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BR_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BR_4Suite : public TestCommand
{
public:
    Test_TC_BR_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BR_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BR_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_1Suite : public TestCommand
{
public:
    Test_TC_DA_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_2Suite : public TestCommand
{
public:
    Test_TC_DA_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_3Suite : public TestCommand
{
public:
    Test_TC_DA_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_4Suite : public TestCommand
{
public:
    Test_TC_DA_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_5Suite : public TestCommand
{
public:
    Test_TC_DA_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DA_1_6Suite : public TestCommand
{
public:
    Test_TC_DA_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DA_1_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DA_1_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_2_2Suite : public TestCommand
{
public:
    Test_TC_BINFO_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BINFO_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_2_4Suite : public TestCommand
{
public:
    Test_TC_BINFO_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BINFO_2_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_1Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_2Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_3Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_4Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_5Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_3_6Suite : public TestCommand
{
public:
    Test_TC_OPCREDS_3_6Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_OPCREDS_3_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OPCREDS_3_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_1Suite : public TestCommand
{
public:
    Test_TC_CNET_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_2Suite : public TestCommand
{
public:
    Test_TC_CNET_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_3Suite : public TestCommand
{
public:
    Test_TC_CNET_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_4Suite : public TestCommand
{
public:
    Test_TC_CNET_4_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_5Suite : public TestCommand
{
public:
    Test_TC_CNET_4_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_6Suite : public TestCommand
{
public:
    Test_TC_CNET_4_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_9Suite : public TestCommand
{
public:
    Test_TC_CNET_4_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_9Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_10Suite : public TestCommand
{
public:
    Test_TC_CNET_4_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_10Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_11Suite : public TestCommand
{
public:
    Test_TC_CNET_4_11Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_11", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_12Suite : public TestCommand
{
public:
    Test_TC_CNET_4_12Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_12", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_12Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_13Suite : public TestCommand
{
public:
    Test_TC_CNET_4_13Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_13", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_13Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_14Suite : public TestCommand
{
public:
    Test_TC_CNET_4_14Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_14Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_15Suite : public TestCommand
{
public:
    Test_TC_CNET_4_15Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_15", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_15Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_16Suite : public TestCommand
{
public:
    Test_TC_CNET_4_16Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_16", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_16Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_17Suite : public TestCommand
{
public:
    Test_TC_CNET_4_17Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_17", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_17Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_18Suite : public TestCommand
{
public:
    Test_TC_CNET_4_18Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_18", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_18Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_19Suite : public TestCommand
{
public:
    Test_TC_CNET_4_19Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_19", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_19Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_20Suite : public TestCommand
{
public:
    Test_TC_CNET_4_20Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_20", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_20Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_21Suite : public TestCommand
{
public:
    Test_TC_CNET_4_21Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_21", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_21Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_4_22Suite : public TestCommand
{
public:
    Test_TC_CNET_4_22Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CNET_4_22", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CNET_4_22Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_2_1Suite : public TestCommand
{
public:
    Test_TC_DLOG_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DLOG_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DLOG_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_2_2Suite : public TestCommand
{
public:
    Test_TC_DLOG_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DLOG_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DLOG_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_3_1Suite : public TestCommand
{
public:
    Test_TC_DLOG_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DLOG_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DLOG_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DESC_2_1Suite : public TestCommand
{
public:
    Test_TC_DESC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DESC_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DESC_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_3_2Suite : public TestCommand
{
public:
    Test_TC_DGETH_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGETH_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_2_2Suite : public TestCommand
{
public:
    Test_TC_CGEN_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CGEN_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CGEN_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_2_2Suite : public TestCommand
{
public:
    Test_TC_DGGEN_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGGEN_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_2_3Suite : public TestCommand
{
public:
    Test_TC_DGGEN_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGGEN_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_3_1Suite : public TestCommand
{
public:
    Test_TC_DGGEN_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGGEN_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGGEN_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_3_2Suite : public TestCommand
{
public:
    Test_TC_I_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_I_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_I_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_3_1Suite : public TestCommand
{
public:
    Test_TC_ILL_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ILL_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ILL_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_1_1Suite : public TestCommand
{
public:
    Test_TC_IDM_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_1_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_1_2Suite : public TestCommand
{
public:
    Test_TC_IDM_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_1_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_2_1Suite : public TestCommand
{
public:
    Test_TC_IDM_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_2_2Suite : public TestCommand
{
public:
    Test_TC_IDM_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_3_1Suite : public TestCommand
{
public:
    Test_TC_IDM_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_3_2Suite : public TestCommand
{
public:
    Test_TC_IDM_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_4_1Suite : public TestCommand
{
public:
    Test_TC_IDM_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_4_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_4_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_4_2Suite : public TestCommand
{
public:
    Test_TC_IDM_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_4_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_4_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_4_3Suite : public TestCommand
{
public:
    Test_TC_IDM_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_4_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_4_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_4_4Suite : public TestCommand
{
public:
    Test_TC_IDM_4_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_4_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_4_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_5_1Suite : public TestCommand
{
public:
    Test_TC_IDM_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_5_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_5_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_5_2Suite : public TestCommand
{
public:
    Test_TC_IDM_5_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_5_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_5_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_6_1Suite : public TestCommand
{
public:
    Test_TC_IDM_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_6_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_6_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_6_2Suite : public TestCommand
{
public:
    Test_TC_IDM_6_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_6_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_6_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_6_3Suite : public TestCommand
{
public:
    Test_TC_IDM_6_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_6_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_6_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_6_4Suite : public TestCommand
{
public:
    Test_TC_IDM_6_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_6_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_6_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_7_1Suite : public TestCommand
{
public:
    Test_TC_IDM_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_7_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_7_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_IDM_8_1Suite : public TestCommand
{
public:
    Test_TC_IDM_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_IDM_8_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_IDM_8_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LOWPOWER_2_2Suite : public TestCommand
{
public:
    Test_TC_LOWPOWER_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_LOWPOWER_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LOWPOWER_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_7_1Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_7_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_7_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_8_1Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_8_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_8_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_9_1Suite : public TestCommand
{
public:
    Test_TC_APPLAUNCHER_3_9_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_APPLAUNCHER_3_9_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_APPLAUNCHER_3_9_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_14Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_14Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_14Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_15Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_15Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_15", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_15Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_16Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_16Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_16", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_16Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_17Suite : public TestCommand
{
public:
    Test_TC_MEDIAINPUT_3_17Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAINPUT_3_17", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAINPUT_3_17Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_4Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_5Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_6Suite : public TestCommand
{
public:
    Test_TC_CHANNEL_5_6Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CHANNEL_5_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CHANNEL_5_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_1Suite : public TestCommand
{
public:
    Test_TC_KEYPADINPUT_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_KEYPADINPUT_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_KEYPADINPUT_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_5Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_7Suite : public TestCommand
{
public:
    Test_TC_MEDIAPLAYBACK_6_7Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_MEDIAPLAYBACK_6_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MEDIAPLAYBACK_6_7Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_3Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_7_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_7_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_7_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_4Suite : public TestCommand
{
public:
    Test_TC_AUDIOOUTPUT_7_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_AUDIOOUTPUT_7_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_AUDIOOUTPUT_7_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_3Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_4Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_5Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_7Suite : public TestCommand
{
public:
    Test_TC_CONTENTLAUNCHER_10_7Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CONTENTLAUNCHER_10_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CONTENTLAUNCHER_10_7Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MC_11_1Suite : public TestCommand
{
public:
    Test_TC_MC_11_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MC_11_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MC_11_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MC_11_2Suite : public TestCommand
{
public:
    Test_TC_MC_11_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MC_11_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MC_11_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ALOGIN_12_2Suite : public TestCommand
{
public:
    Test_TC_ALOGIN_12_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_ALOGIN_12_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ALOGIN_12_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_1Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_2Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_7Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_7Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_8Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_8Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_11Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_11Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_11", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_12Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_12Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_12", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_12Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_14Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_14Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_14", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_14Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_15Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_15Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_15", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_15Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_16Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_16Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_16", 25, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("waitAfterCommissioning", 0, UINT16_MAX, &mWaitAfterCommissioning);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_16Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override
    {
        return chip::System::Clock::Seconds16(mTimeout.ValueOr(kTimeoutInSeconds));
    }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mWaitAfterCommissioning;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    uint8_t TH3FabricIndex;
    uint8_t TH2FabricIndex;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH3FabricIndex = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValue("fabrics[0].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValue("fabrics[1].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, 2U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValue("fabrics[2].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[2].fabricIndex", iter_0.GetValue().fabricIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValue("fabrics[0].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValue("fabrics[1].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 2));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH2FabricIndex = value;
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValue("fabrics[0].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValue("fabrics[1].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, 4U));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 2));
                    VerifyOrReturn(CheckValue("fabrics[2].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[2].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[2].fabricIndex", iter_0.GetValue().fabricIndex, 3U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 3));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Waiting after opening commissioning window");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 6: {
            LogStep(6, "DUT_CE is commissioned to TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Waiting after opening commissioning window");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH_CR3 Commissions with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 10: {
            LogStep(10, "DUT_CE is commissioned to TH_CR3");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            return WaitForCommissionee(kIdentityGamma, value);
        }
        case 11: {
            LogStep(11, "TH3 reads CurrentFabricIndex attribute and save it for future use.");
            return ReadAttribute(kIdentityGamma, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "TH_CR2 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH_CR2 sends RemoveFabric with FabricIndex = 2 command to DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.C0a.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = 2U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::Optional<uint16_t>(10000),
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "TH_CR2 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH_CR2 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005 && PICS_USER_PROMPT"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH_CR1 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Waiting after opening commissioning window");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 20: {
            LogStep(20, "DUT_CE is commissioned to TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 21: {
            LogStep(21, "TH2 reads CurrentFabricIndex attribute and save it for future use.");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Remove TH2 FabricIndex");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.C0a.Rsp && CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = TH2FabricIndex;
            return SendCommand(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::Optional<uint16_t>(10000),
                               chip::NullOptional

            );
        }
        case 24: {
            LogStep(24, "Remove TH3 FabricIndex");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.C0a.Rsp && CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = TH3FabricIndex;
            return SendCommand(kIdentityGamma, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::Optional<uint16_t>(10000),
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_17Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_17Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_17", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_17Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_18Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_18Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_18", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_18Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_19Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_19Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_19", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_19Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_20Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_20Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_20", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_20Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_21Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_21Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_21", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
    }

    ~Test_TC_CADMIN_1_21Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(950)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 900U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for commissioning Window to 901 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 901000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 901U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_22Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_22Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_22", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("PakeVerifier", &mPakeVerifier);
    }

    ~Test_TC_CADMIN_1_22Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(950)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::ByteSpan> mPakeVerifier;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE using ECM with a value of 900 seconds");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "TH_CR1 opens a commissioning window on DUT_CE using ECM with a value of 900 seconds");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 900U;
            value.PAKEPasscodeVerifier = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator        = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations           = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Wait for commissioning Window to 901 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 901000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH_CR1 opens a commissioning window on DUT_CE using ECM with a value of 901 seconds");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "TH_CR1 opens a commissioning window on DUT_CE using ECM with a value of 901 seconds");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 901U;
            value.PAKEPasscodeVerifier = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator        = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations           = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_3Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_4Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_4", 27, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("waitAfterCommissioning", 0, UINT16_MAX, &mWaitAfterCommissioning);
    }

    ~Test_TC_CADMIN_1_4Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(300)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mWaitAfterCommissioning;

    uint8_t TH1FabricIndex;
    uint8_t TH2FabricIndex;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH1FabricIndex = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH2FabricIndex = value;
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValue("fabrics[0].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValue("fabrics[1].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 2));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<
                    chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                    value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 0));
                    VerifyOrReturn(CheckValue("fabrics[0].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[0].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[0].fabricIndex", iter_0.GetValue().fabricIndex, TH1FabricIndex));
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("fabrics", iter_0, 1));
                    VerifyOrReturn(CheckValue("fabrics[1].nodeID", iter_0.GetValue().nodeID,
                                              mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL));
                    VerifyOrReturn(CheckValueAsString("fabrics[1].label", iter_0.GetValue().label, chip::CharSpan("", 0)));
                    VerifyOrReturn(CheckValue("fabrics[1].fabricIndex", iter_0.GetValue().fabricIndex, TH2FabricIndex));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 2));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
                VerifyOrReturn(CheckConstraintType("value", "char_string", "char_string"));
                VerifyOrReturn(CheckConstraintMaxLength("value", value, 32));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 9));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH1 reads CurrentFabricIndex attribute and save it for future use.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "TH_CR1 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Waiting after opening commissioning window");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "Verify that the DNS-SD advertisement shows CM=1");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH_CR1 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "TH_CR1 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 10: {
            LogStep(10, "DUT_CE is commissioned by TH_CR2 on Fabric ID2 ");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 11: {
            LogStep(11, "TH2 reads CurrentFabricIndex attribute and save it for future use.");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Verify DUT_CE is now discoverable over DNS-SD with two SRV Records");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH_CR1 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH_CR2 reads the list of Fabrics on DUT_CE");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::Fabrics::Id, false, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "TH_CR1 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "TH_CR1 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "TH_CR2 writes the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityBeta, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH_CR2 reads the Basic Information Clusters NodeLabel mandatory attribute of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "TH_CR2 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 20: {
            LogStep(20, "Wait for the commissioning window in step 13 to timeout");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 180000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "TH_CR2 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "TH_CR2 opens a commissioning window on DUT_CE using BCM");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 23: {
            LogStep(23, "Waiting after opening commissioning window");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "TH_CR1 starts a commissioning process with DUT_CE before the timeout from step 12");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityAlpha, value);
        }
        case 25: {
            LogStep(25, "TH_CR2 revokes the commissioning window");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp && CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityBeta, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Remove TH2 FabricIndex");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.C0a.Rsp && CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = TH2FabricIndex;
            return SendCommand(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::Optional<uint16_t>(10000),
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_5Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_6Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_6", 23, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("waitAfterCommissioning", 0, UINT16_MAX, &mWaitAfterCommissioning);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
    }

    ~Test_TC_CADMIN_1_6Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(300)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mWaitAfterCommissioning;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;

    uint8_t TH2FabricIndex;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            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::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 2));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                TH2FabricIndex = value;
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 4));
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::OperationalCredentials::Commands::NOCResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Verify that the DNS-SD advertisement shows CM=1");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Wait for PIXIT.CADMIN.CwDuration + 10");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 190000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH_CR2 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Waiting after opening commissioning window");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH_CR1 revokes the commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH_CR2 starts a commissioning process with DUT_CE");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 11: {
            LogStep(11, "TH_CR1 revokes the commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "TH_CR1 writes the mandatory attribute NodeLabel of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::CharSpan value;
            value = chip::Span<const char>("chiptestgarbage: not in length on purpose", 8);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "TH_CR1 read the mandatory attribute NodeLabel of DUT_CE");
            VerifyOrDo(!ShouldSkip("BINFO.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), BasicInformation::Id, BasicInformation::Attributes::NodeLabel::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Waiting after opening commissioning window");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "TH_CR1 opens another commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "TH_CR2 starts a commissioning process on DUT_CE");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 18: {
            LogStep(18, "DUT_CE is commissioned by TH_CR2");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            return WaitForCommissionee(kIdentityBeta, value);
        }
        case 19: {
            LogStep(19, "TH2 reads CurrentFabricIndex attribute and save it for future use.");
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "TH_CR1 tries to revoke the commissioning window on DUT_CE using RevokeCommissioning command");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C02.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::RevokeCommissioning::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 21: {
            LogStep(21, "TH_CR3 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        case 22: {
            LogStep(22, "Remove TH2 FabricIndex");
            VerifyOrDo(!ShouldSkip("OPCREDS.S.C0a.Rsp && CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = TH2FabricIndex;
            return SendCommand(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::Optional<uint16_t>(10000),
                               chip::NullOptional

            );
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_9Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_9Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_10Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_10Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_10", 28, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("nodeIdForDuplicateCommissioning", 0, UINT64_MAX, &mNodeIdForDuplicateCommissioning);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("nodeId3", 0, UINT64_MAX, &mNodeId3);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("waitAfterCommissioning", 0, UINT16_MAX, &mWaitAfterCommissioning);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("correctPayload", &mCorrectPayload);
        AddArgument("incorrectSetupCodePayload", &mIncorrectSetupCodePayload);
    }

    ~Test_TC_CADMIN_1_10Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(700)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::NodeId> mNodeIdForDuplicateCommissioning;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::NodeId> mNodeId3;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mWaitAfterCommissioning;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mCorrectPayload;
    chip::Optional<chip::CharSpan> mIncorrectSetupCodePayload;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 900U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Waiting after opening commissioning window");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = mWaitAfterCommissioning.HasValue() ? mWaitAfterCommissioning.Value() : 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Verify that the DNS-SD advertisement shows CM=1");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 7: {
            LogStep(7, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 8: {
            LogStep(8, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 9: {
            LogStep(9, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 10: {
            LogStep(10, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 11: {
            LogStep(11, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 12: {
            LogStep(12, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 13: {
            LogStep(13, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 14: {
            LogStep(14, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 15: {
            LogStep(15, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 16: {
            LogStep(16, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 17: {
            LogStep(17, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 18: {
            LogStep(18, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 19: {
            LogStep(19, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 20: {
            LogStep(20, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 21: {
            LogStep(21, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 22: {
            LogStep(22, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 23: {
            LogStep(23, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 24: {
            LogStep(24, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 25: {
            LogStep(25, "TH_CR2 starts a commissioning process with DUT_CE using Invalid setup code");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId  = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload = mIncorrectSetupCodePayload.HasValue() ? mIncorrectSetupCodePayload.Value()
                                                                  : chip::Span<const char>("MT:-24J0AFN00I.0648G00", 22);
            value.discoverOnce.Emplace();
            value.discoverOnce.Value() = true;
            return PairWithCode(kIdentityBeta, value);
        }
        case 26: {
            LogStep(26, "TH_CR2 attempts to do PASE to DUT_CE using the correct onboarding payload");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
            value.payload =
                mCorrectPayload.HasValue() ? mCorrectPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 27: {
            LogStep(27, "TH_CR3 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
            value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
            value.payload =
                mCorrectPayload.HasValue() ? mCorrectPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityGamma, value);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_13Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_13Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_13", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CADMIN_1_13Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_23Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_23Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_23", 8, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
    }

    ~Test_TC_CADMIN_1_23Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for commissioning Window to 181 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 181000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type value;
            value.commissioningTimeout = 179U;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 7: {
            LogStep(7, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CADMIN_1_24Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_24Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_24", 10, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("PakeVerifier", &mPakeVerifier);
    }

    ~Test_TC_CADMIN_1_24Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::ByteSpan> mPakeVerifier;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 0U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
            return FactoryReset(kIdentityAlpha, value);
        }
        case 1: {
            LogStep(1, "Precondition: Reset Devices to factory defaults");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message =
                chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 2: {
            LogStep(2, "TH_CR1 starts a commissioning process with DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
            value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
            return WaitForCommissionee(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "TH_CR1 opens a commissioning window on DUT_CE using ECM with a value of 180 seconds");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 180U;
            value.PAKEPasscodeVerifier = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator        = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations           = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Wait for commissioning Window to 181 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 181000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 6: {
            LogStep(6, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "TH_CR1 opens a commissioning window on DUT_CE using ECM with a value of 179 seconds");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "TH_CR1 opens a commissioning window on DUT_CE");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp && PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::Type value;
            value.commissioningTimeout = 179U;
            value.PAKEPasscodeVerifier = mPakeVerifier.HasValue()
                ? mPakeVerifier.Value()
                : chip::ByteSpan(
                      chip::Uint8::from_const_char(
                          "\xb9\x61\x70\xaa\xe8\x03\x34\x68\x84\x72\x4f\xe9\xa3\xb2\x87\xc3\x03\x30\xc2\xa6\x60\x37\x5d\x17\xbb\x20"
                          "\x5a\x8c\xf1\xae\xcb\x35\x04\x57\xf8\xab\x79\xee\x25\x3a\xb6\xa8\xe4\x6b\xb0\x9e\x54\x3a\xe4\x22\x73\x6d"
                          "\xe5\x01\xe3\xdb\x37\xd4\x41\xfe\x34\x49\x20\xd0\x95\x48\xe4\xc1\x82\x40\x63\x0c\x4f\xf4\x91\x3c\x53\x51"
                          "\x38\x39\xb7\xc0\x7f\xcc\x06\x27\xa1\xb8\x57\x3a\x14\x9f\xcd\x1f\xa4\x66\xcf"),
                      97);
            value.discriminator        = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
            value.iterations           = 1000UL;
            value.salt = chip::ByteSpan(chip::Uint8::from_const_char("SPAKE2P Key Saltgarbage: not in length on purpose"), 16);
            return SendCommand(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                               AdministratorCommissioning::Commands::OpenCommissioningWindow::Id, value,
                               chip::Optional<uint16_t>(10000), chip::NullOptional

            );
        }
        case 9: {
            LogStep(9, "TH_CR1 reads the window status to verify the DUT_CE window is closed");
            VerifyOrDo(!ShouldSkip("CADMIN.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), AdministratorCommissioning::Id,
                                 AdministratorCommissioning::Attributes::WindowStatus::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_1_2Suite : public TestCommand
{
public:
    Test_TC_MOD_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_1_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_1_3Suite : public TestCommand
{
public:
    Test_TC_MOD_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_1_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_2_1Suite : public TestCommand
{
public:
    Test_TC_MOD_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_2_2Suite : public TestCommand
{
public:
    Test_TC_MOD_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_3_1Suite : public TestCommand
{
public:
    Test_TC_MOD_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_3_2Suite : public TestCommand
{
public:
    Test_TC_MOD_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_3_3Suite : public TestCommand
{
public:
    Test_TC_MOD_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_3_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_3_4Suite : public TestCommand
{
public:
    Test_TC_MOD_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_MOD_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_MOD_3_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_1_1Suite : public TestCommand
{
public:
    Test_TC_SU_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_1_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_1Suite : public TestCommand
{
public:
    Test_TC_SU_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_2Suite : public TestCommand
{
public:
    Test_TC_SU_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_3Suite : public TestCommand
{
public:
    Test_TC_SU_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_4Suite : public TestCommand
{
public:
    Test_TC_SU_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_5Suite : public TestCommand
{
public:
    Test_TC_SU_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_6Suite : public TestCommand
{
public:
    Test_TC_SU_2_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_7Suite : public TestCommand
{
public:
    Test_TC_SU_2_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_7Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_2_8Suite : public TestCommand
{
public:
    Test_TC_SU_2_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_2_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_2_8Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_3_1Suite : public TestCommand
{
public:
    Test_TC_SU_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_3_2Suite : public TestCommand
{
public:
    Test_TC_SU_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_3_3Suite : public TestCommand
{
public:
    Test_TC_SU_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_3_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_3_4Suite : public TestCommand
{
public:
    Test_TC_SU_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_3_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_4_1Suite : public TestCommand
{
public:
    Test_TC_SU_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_4_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_4_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SU_4_2Suite : public TestCommand
{
public:
    Test_TC_SU_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SU_4_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SU_4_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_2_2Suite : public TestCommand
{
public:
    Test_TC_PSCFG_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PSCFG_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PSCFG_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_1_1Suite : public TestCommand
{
public:
    Test_TC_SC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_1_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_1_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_1_2Suite : public TestCommand
{
public:
    Test_TC_SC_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_1_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_1_3Suite : public TestCommand
{
public:
    Test_TC_SC_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_1_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_1_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_1_4Suite : public TestCommand
{
public:
    Test_TC_SC_1_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_1_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_1_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_2_1Suite : public TestCommand
{
public:
    Test_TC_SC_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_2_2Suite : public TestCommand
{
public:
    Test_TC_SC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_2_3Suite : public TestCommand
{
public:
    Test_TC_SC_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_2_4Suite : public TestCommand
{
public:
    Test_TC_SC_2_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_2_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_2_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_3_1Suite : public TestCommand
{
public:
    Test_TC_SC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_3_2Suite : public TestCommand
{
public:
    Test_TC_SC_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_3_3Suite : public TestCommand
{
public:
    Test_TC_SC_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_3_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_3_4Suite : public TestCommand
{
public:
    Test_TC_SC_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_3_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_1Suite : public TestCommand
{
public:
    Test_TC_SC_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_2Suite : public TestCommand
{
public:
    Test_TC_SC_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_3Suite : public TestCommand
{
public:
    Test_TC_SC_4_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_4Suite : public TestCommand
{
public:
    Test_TC_SC_4_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_5Suite : public TestCommand
{
public:
    Test_TC_SC_4_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_6Suite : public TestCommand
{
public:
    Test_TC_SC_4_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_7Suite : public TestCommand
{
public:
    Test_TC_SC_4_7Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_7", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_7Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_8Suite : public TestCommand
{
public:
    Test_TC_SC_4_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_8", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_8Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_9Suite : public TestCommand
{
public:
    Test_TC_SC_4_9Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_9", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_9Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_4_10Suite : public TestCommand
{
public:
    Test_TC_SC_4_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_10", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_4_10Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_5_3Suite : public TestCommand
{
public:
    Test_TC_SC_5_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_5_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_5_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SC_6_1Suite : public TestCommand
{
public:
    Test_TC_SC_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_6_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SC_6_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_2_1Suite : public TestCommand
{
public:
    Test_TC_DGSW_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_2_2Suite : public TestCommand
{
public:
    Test_TC_DGSW_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_2_3Suite : public TestCommand
{
public:
    Test_TC_DGSW_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_3_2Suite : public TestCommand
{
public:
    Test_TC_DGSW_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGSW_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_2Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_3_2Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGWIFI_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_6_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_6_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_6_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_7_1Suite : public TestCommand
{
public:
    Test_TC_WNCV_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_WNCV_7_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_WNCV_7_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_2_2Suite : public TestCommand
{
public:
    Test_TC_FLW_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLW_2_2", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_FLW_2_2Suite() {}

    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::app::DataModel::Nullable<uint16_t> ValueBeforeChange;

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                ValueBeforeChange = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
                VerifyOrReturn(CheckConstraintNotValue("value", value, ValueBeforeChange));
            }
            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;
        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, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "operate on DUT to change the flow significantly");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && FLW.M.FlowChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("FLW.S.A0000 && FLW.M.FlowChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), FlowMeasurement::Id,
                                 FlowMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_3_1Suite : public TestCommand
{
public:
    Test_TC_OCC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_3_1", 4, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OCC_3_1Suite() {}

    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::BitMask<chip::app::Clusters::OccupancySensing::OccupancyBitmap> OccupancyValue;

    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
    {
        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));
            {
                chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancyBitmap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                OccupancyValue = value;
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancyBitmap> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintNotValue("value", value, OccupancyValue));
            }
            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;
        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, "Reads Occupancy attribute from DUT");
            VerifyOrDo(!ShouldSkip("OCC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id,
                                 true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Operate on DUT to change the occupancy status");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && OCC.M.OccupancyChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Reads back Occupancy attribute from DUT after few seconds");
            VerifyOrDo(!ShouldSkip("OCC.S.A0000 && OCC.M.OccupancyChange"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::Occupancy::Id,
                                 true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_2_2Suite : public TestCommand
{
public:
    Test_TC_PS_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PS_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PS_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BOOL_2_2Suite : public TestCommand
{
public:
    Test_TC_BOOL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BOOL_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BOOL_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_2_2Suite : public TestCommand
{
public:
    Test_TC_CC_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_4Suite : public TestCommand
{
public:
    Test_TC_CC_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_3_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_5Suite : public TestCommand
{
public:
    Test_TC_CC_4_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_4_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_4_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_4Suite : public TestCommand
{
public:
    Test_TC_CC_5_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_5_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_5_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_4Suite : public TestCommand
{
public:
    Test_TC_CC_6_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_6_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_6_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_5Suite : public TestCommand
{
public:
    Test_TC_CC_7_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_9_4Suite : public TestCommand
{
public:
    Test_TC_CC_9_4Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_9_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_9_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_1Suite : public TestCommand
{
public:
    Test_TC_CC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_3_1", 51, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_3_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 115U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 155U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 102U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 138U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 85U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 115U));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 68U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 92U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 51U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 69U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 51U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 69U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(
                5,
                "TH sends MoveToHue command to DUT with Hue=120, Direction=0x00 (shortest distance) and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 120U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (Shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(
                16,
                "TH sends MoveToHue command to DUT with Hue=135, Direction=0x01 (longest distance) and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 135U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(1);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000 && PICS_SKIP_SAMPLE_APP"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Enter 'y' after successgarbage: not in length on purpose", 23);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "TH sends MoveToHue command to DUT with Hue=120, Direction=0x02 (up) and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 120U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(2);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36,
                    "TH sends MoveToHue command to DUT with Hue=120, Direction=0x00 (shortest distance) and TransitionTime=0 "
                    "(immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 120U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 38: {
            LogStep(38, "TH sends MoveToHue command to DUT with Hue=60, Direction=0x03 (down) and TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::MoveToHue::Type value;
            value.hue             = 60U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(3);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id, value,
                               chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 42: {
            LogStep(42, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 44: {
            LogStep(44, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 46: {
            LogStep(46, "TH reads CurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, true,
                                 chip::NullOptional);
        }
        case 47: {
            LogStep(47, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Turn off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_1Suite : public TestCommand
{
public:
    Test_TC_CC_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_7_1", 51, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_7_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(200)); }

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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 18700U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 25300U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 34700U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 41300U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 50700U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 62100U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 50700U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 62100U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 10200U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 13800U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 8500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11500U));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 6800U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9200U));
            }
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5100U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6900U));
            }
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 5100U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 6900U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorMode", value, 0U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedColorMode", value, 3U));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A000f"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=300 (30s).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 12000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 15: {
            LogStep(15, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=54000, Direction=0x01 (longest distance) and "
                    "TransitionTime=300 (30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 54000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(1);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 17: {
            LogStep(17, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x02 (up) and TransitionTime=300 "
                    "(30s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 12000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(2);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 36: {
            LogStep(36,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 12000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 37: {
            LogStep(37, "Wait 100ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 38: {
            LogStep(38,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x03 (down) and TransitionTime=300 "
                    "(30s).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 6000U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(3);
            value.transitionTime  = 300U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 39: {
            LogStep(39, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 42: {
            LogStep(42, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Wait 10s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 44: {
            LogStep(44, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Wait 5s");
            VerifyOrDo(!ShouldSkip("CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 46: {
            LogStep(46, "TH reads EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "TH reads ColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A0008"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 48: {
            LogStep(48, "TH reads EnhancedColorMode attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedColorMode::Id,
                                 true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Turn Off light that we turned on");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 50: {
            LogStep(50, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_9_1Suite : public TestCommand
{
public:
    Test_TC_CC_9_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_9_1", 72, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
    }

    ~Test_TC_CC_9_1Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;

    uint16_t ColorLoopStartEnhancedHueStep5d;
    uint16_t ColorLoopStoredEnhancedHueStep6c;
    uint16_t ColorLoopStartEnhancedHueStep8d;
    uint16_t ColorLoopStoredEnhancedHueStep9c;
    uint16_t ColorLoopStartEnhancedHueStep12d;
    uint16_t ColorLoopStoredEnhancedHueStep13c;
    uint16_t ColorLoopStartEnhancedHueStep15d;
    uint16_t ColorLoopStoredEnhancedHueStep16b;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 30U));
            }
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStartEnhancedHue", value, 160U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep5d = value;
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep5d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep5d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep6c = value;
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep6c));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 1U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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("colorLoopActive", value, 1U));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep8d = value;
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep8d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep8d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep9c = value;
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep9c));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, 16384U));
            }
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep12d = value;
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep12d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep12d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep13c = value;
            }
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep13c));
            }
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 1U));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueStep15d = value;
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep15d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueStep15d));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueStep16b = value;
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueStep16b));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f && CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for 1000ms");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x0 (decrement hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Read ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x4 (UpdateTime) and Time attribute to 30 (30s "
                    "for one loop) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(4U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 30U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Read ColorLoopTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4004 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 11: {
            LogStep(11,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x8 (UpdateStartHue) and StartHue attribute to "
                    "0x00A0 to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(8U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 160U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 12: {
            LogStep(12, "Read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Saving value for comparison in step 8d read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 21: {
            LogStep(21,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Saving value for comparison in step 6c read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x1 (increment hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(1);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Read ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 28: {
            LogStep(28, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "Saving value for comparision in step 8d read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 35: {
            LogStep(35,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Saving value for comparision in step 9c read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 39: {
            LogStep(39,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "Wait 1000ms");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 42: {
            LogStep(42,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x0 (decrement hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 43: {
            LogStep(43, "Read ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 44: {
            LogStep(44,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x2 "
                    "(start from EnhancedCurrentHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(2);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 45: {
            LogStep(45, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 48: {
            LogStep(48, "Saving value for comparision in step 12d read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 51: {
            LogStep(51, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 52: {
            LogStep(52,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 53: {
            LogStep(53, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Saving value for comparision in step 13c read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 56: {
            LogStep(56,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x1 (increment hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(1);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 57: {
            LogStep(57, "Read ColorLoopDirection attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 58: {
            LogStep(58,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x2 "
                    "(start from EnhancedCurrentHue) to DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(2);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 59: {
            LogStep(59, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Read ColorLoopStoredEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 62: {
            LogStep(62, "Saving value for comparision in step 15d read ColorLoopStartEnhancedHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 65: {
            LogStep(65, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 66: {
            LogStep(66,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 67: {
            LogStep(67, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 68: {
            LogStep(68, "Saving value for comparision in step 16b read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F02 && CC.S.F01 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 70: {
            LogStep(70, "Turn Off light for color control tests");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 71: {
            LogStep(71, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_9_2Suite : public TestCommand
{
public:
    Test_TC_CC_9_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_9_2", 31, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_9_2Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t ColorLoopStartEnhancedHueValue;
    uint16_t ColorLoopStartEnhancedHue;
    uint16_t ColorLoopStoredEnhancedHueValue;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 30U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStartEnhancedHue", value, 160U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 1U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHue = value;
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueValue = value;
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueValue));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f && CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for 1000ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0xF, Action attribute to 0x0 (De-activate), "
                    "Direction attribute to 0x0 (decrement hue), Time attribute to 30, and StartHue attribute to 0x00A0 to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(15U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 30U;
            value.startHue        = 160U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read ColorLoopDirection attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read ColorLoopTime attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4004 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Read ColorLoopActive attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Saving value for comparision read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x2 (UpdateDirection) and Direction attribute "
                    "to 0x1 (increment hue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(2U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(1);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read ColorLoopDirection attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Saving value for comparision read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 24: {
            LogStep(24, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 25: {
            LogStep(25,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Saving value for comparision read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read EnhancedCurrentHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Turn off light for color control tests");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_9_3Suite : public TestCommand
{
public:
    Test_TC_CC_9_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_9_3", 30, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_CC_9_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    uint16_t ColorLoopStartEnhancedHueValue;
    uint16_t ColorLoopStoredEnhancedHueValue;

    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
    {
        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));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopDirection", value, 0U));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 30U));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStartEnhancedHue", value, 160U));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 1U));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopStoredEnhancedHue", value, 16384U));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStartEnhancedHueValue = value;
            }
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, ColorLoopStartEnhancedHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopTime", value, 60U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 65535U));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("colorLoopActive", value, 0U));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                ColorLoopStoredEnhancedHueValue = value;
            }
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("enhancedCurrentHue", value, ColorLoopStoredEnhancedHueValue));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            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;
        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, "TH writes 0 to the Options attribute");
            VerifyOrDo(!ShouldSkip("CC.S.A000f && CC.S.F02 && CC.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            uint8_t value;
            value = 0U;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::Options::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "TH sends On command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 3: {
            LogStep(3,
                    "TH sends EnhancedMoveToHue command to DUT with EnhancedHue=0x4000, Direction=0x00 (shortest distance) and "
                    "TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::EnhancedMoveToHue::Type value;
            value.enhancedHue     = 16384U;
            value.direction       = static_cast<chip::app::Clusters::ColorControl::HueDirection>(0);
            value.transitionTime  = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Wait for 1000ms");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0xF, Action attribute to 0x0 (De-activate), "
                    "Direction attribute to 0x0 (decrement hue), Time attribute to 30, and StartHue attribute to 0x00A0 to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(15U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 30U;
            value.startHue        = 160U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read ColorLoopDirection attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4003 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id,
                                 true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read ColorLoopTime attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4004 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x1 "
                    "(start from ColorLoopStartEnhancedHue) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(1);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 11: {
            LogStep(11, "Read ColorLoopActive attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4006 && CC.S.C40.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "Saving value for comparision read ColorLoopStartEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4005 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStartEnhancedHue::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Wait for 30S");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x4 and Time attribute to 60 to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(4U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 60U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 19: {
            LogStep(19, "Read ColorLoopTime attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4004 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id,
                                 true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Wait for 60S");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 60000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Wait for 60S");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 60000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "Read EnhancedCurrentHue attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 24: {
            LogStep(24,
                    "TH sends ColorLoopSet command to with UpdateFlag attribute to 0x1 (UpdateAction) and Action attribute to 0x0 "
                    "(De-activate) to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.C44.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::ColorControl::Commands::ColorLoopSet::Type value;
            value.updateFlags     = static_cast<chip::BitMask<chip::app::Clusters::ColorControl::ColorLoopUpdateFlags>>(1U);
            value.action          = static_cast<chip::app::Clusters::ColorControl::ColorLoopAction>(0);
            value.direction       = static_cast<chip::app::Clusters::ColorControl::ColorLoopDirection>(0);
            value.time            = 0U;
            value.startHue        = 0U;
            value.optionsMask     = 0U;
            value.optionsOverride = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id, value,
                               chip::NullOptional

            );
        }
        case 25: {
            LogStep(25, "Read ColorLoopActive attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4002 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id,
                                 true, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Saving value for comparision read ColorLoopStoredEnhancedHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4006 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id,
                                 ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id, true, chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Read EnhancedCurrentHue attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && CC.S.F02 && CC.S.A4000 && CC.S.C44.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id,
                                 true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Turn off light for color control tests");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 29: {
            LogStep(29, "Check on/off attribute value is false after off command");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_1Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_1", 0, 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_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_8Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_8Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_8", 0, 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_8Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_10Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_10Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_10", 0, 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_10Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_3_1Suite : public TestCommand
{
public:
    Test_TC_DRLK_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_3_1", 0, 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_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_3_2Suite : public TestCommand
{
public:
    Test_TC_DRLK_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_3_2", 0, 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_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_3_3Suite : public TestCommand
{
public:
    Test_TC_DRLK_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_3_3", 0, 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_3_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LCFG_2_1Suite : public TestCommand
{
public:
    Test_TC_LCFG_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LCFG_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LCFG_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_3Suite : public TestCommand
{
public:
    Test_TC_LVL_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_7_1Suite : public TestCommand
{
public:
    Test_TC_LVL_7_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_7_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_7_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_8_1Suite : public TestCommand
{
public:
    Test_TC_LVL_8_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_8_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LVL_8_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_3Suite : public TestCommand
{
public:
    Test_TC_OO_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_2_3", 133, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
    }

    ~Test_TC_OO_2_3Suite() {}

    chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.ValueOr(400)); }

private:
    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<uint16_t> mTimeout;
    chip::Optional<chip::EndpointId> mEndpoint;

    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
    {
        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));
            shouldContinue = true;
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 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));
            shouldContinue = true;
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 0));
            }
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 0));
            }
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("globalSceneControl", value, 1));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 86:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 99:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 100:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 114:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 115:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 116:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 117:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 120:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 121:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 1));
            }
            break;
        case 127:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 255U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 345U));
            }
            break;
        case 128:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 300U));
            }
            break;
        case 129:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 130:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                bool value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onOff", value, 0));
            }
            break;
        case 131:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("onTime", value, 0U));
            }
            break;
        case 132:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("offWaitTime", value, 0U));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "1: 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, "2a: Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "2b: Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "2b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "3a:Sends OffWithEffect command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OffWithEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::OnOff::OnOffEffectIdentifier>(0);
            value.effectVariant    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "3b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "3b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "4a:Sends OnWithRecallGlobalScene command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithRecallGlobalScene::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithRecallGlobalScene::Id, value,
                               chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "4b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "4b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "5a:Sends OffWithEffect command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OffWithEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::OnOff::OnOffEffectIdentifier>(0);
            value.effectVariant    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 14: {
            LogStep(14, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "5b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 &&  OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "5b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "5c:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 18: {
            LogStep(18, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 19: {
            LogStep(19, "5d:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "5d:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "6a:Sends OffWithEffect command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OffWithEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::OnOff::OnOffEffectIdentifier>(1);
            value.effectVariant    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 22: {
            LogStep(22, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 23: {
            LogStep(23, "6b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 24: {
            LogStep(24, "6b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "7a:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 26: {
            LogStep(26, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 27: {
            LogStep(27, "7b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "7b:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "7c:Sends OnWithRecallGlobalScene command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithRecallGlobalScene::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithRecallGlobalScene::Id, value,
                               chip::NullOptional

            );
        }
        case 30: {
            LogStep(30, "Wait 1000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 1000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 31: {
            LogStep(31, "7d:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 32: {
            LogStep(32, "7d:Reads GlobalSceneControl attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4000 && OO.S.C41.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::GlobalSceneControl::Id, true,
                                 chip::NullOptional);
        }
        case 33: {
            LogStep(33, "8:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "8:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 35: {
            LogStep(35, "9a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 36: {
            LogStep(36, "9b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "9b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 38: {
            LogStep(38, "9b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "10a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 40: {
            LogStep(40, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41, "10b:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 42: {
            LogStep(42, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 43: {
            LogStep(43, "10c:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 44: {
            LogStep(44, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 45: {
            LogStep(45, "10d:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 46: {
            LogStep(46, "10e:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 47: {
            LogStep(47, "10e:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 48: {
            LogStep(48, "10e:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 50: {
            LogStep(50, "11a:Sends OffWithEffect command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OffWithEffect::Type value;
            value.effectIdentifier = static_cast<chip::app::Clusters::OnOff::OnOffEffectIdentifier>(0);
            value.effectVariant    = 0U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id, value,
                               chip::NullOptional

            );
        }
        case 51: {
            LogStep(51, "11b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 52: {
            LogStep(52, "11b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 53: {
            LogStep(53, "11b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 55: {
            LogStep(55, "12a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 56: {
            LogStep(56, "12b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 57: {
            LogStep(57, "12b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 58: {
            LogStep(58, "12b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 60: {
            LogStep(60, "13a:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 61: {
            LogStep(61, "13b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 62: {
            LogStep(62, "13b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 63: {
            LogStep(63, "13b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 65: {
            LogStep(65, "14a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 66: {
            LogStep(66, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 67: {
            LogStep(67, "14b:Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 68: {
            LogStep(68, "14c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "14c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 70: {
            LogStep(70, "14c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Wait 30000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 30000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 72: {
            LogStep(72, "15:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 73: {
            LogStep(73, "15:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 74: {
            LogStep(74, "15:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 75: {
            LogStep(75, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 76: {
            LogStep(76, "16a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 77: {
            LogStep(77, "16b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "16b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 79: {
            LogStep(79, "16b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 80: {
            LogStep(80, "17a:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 81: {
            LogStep(81, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 82: {
            LogStep(82, "17b:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(1U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 83: {
            LogStep(83, "17c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 84: {
            LogStep(84, "17c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 85: {
            LogStep(85, "17c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 86: {
            LogStep(86, "Wait 40000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 40000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 87: {
            LogStep(87, "17d:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 88: {
            LogStep(88, "17d:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 89: {
            LogStep(89, "17d:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 90: {
            LogStep(90, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 91: {
            LogStep(91, "18a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 92: {
            LogStep(92, "18b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 93: {
            LogStep(93, "18b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 94: {
            LogStep(94, "18b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 95: {
            LogStep(95, "19a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 96: {
            LogStep(96, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 97: {
            LogStep(97, "19b:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 98: {
            LogStep(98, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 99: {
            LogStep(99, "19c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 100: {
            LogStep(100, "19c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 101: {
            LogStep(101, "19c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 102: {
            LogStep(102, "20a:Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 103: {
            LogStep(103, "20b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 104: {
            LogStep(104, "20b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 105: {
            LogStep(105, "20b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 106: {
            LogStep(106, "21a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 107: {
            LogStep(107, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 108: {
            LogStep(108, "21b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 109: {
            LogStep(109, "21b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 110: {
            LogStep(110, "21b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && PICS_SKIP_SAMPLE_APP && OO.S.C42.Rsp"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 111: {
            LogStep(111, "22a:Send On Command");
            VerifyOrDo(!ShouldSkip("OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::On::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id, value, chip::NullOptional

            );
        }
        case 112: {
            LogStep(112, "22b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 113: {
            LogStep(113, "22b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 114: {
            LogStep(114, "22b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 115: {
            LogStep(115, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 116: {
            LogStep(116, "23a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 117: {
            LogStep(117, "23b:Send Off Command");
            VerifyOrDo(!ShouldSkip("OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::Off::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id, value, chip::NullOptional

            );
        }
        case 118: {
            LogStep(118, "23c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 119: {
            LogStep(119, "23c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 120: {
            LogStep(120, "23c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 121: {
            LogStep(121, "Wait 40000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 40000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 122: {
            LogStep(122, "23d:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 123: {
            LogStep(123, "23d:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 124: {
            LogStep(124, "23d:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 125: {
            LogStep(125, "24a:Sends OnWithTimedOff command to DUT");
            VerifyOrDo(!ShouldSkip("OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OnOff::Commands::OnWithTimedOff::Type value;
            value.onOffControl = static_cast<chip::BitMask<chip::app::Clusters::OnOff::OnOffControl>>(0U);
            value.onTime       = 300U;
            value.offWaitTime  = 300U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id, value,
                               chip::NullOptional

            );
        }
        case 126: {
            LogStep(126, "24b:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 127: {
            LogStep(127, "24b:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 128: {
            LogStep(128, "24b:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002 && OO.S.C42.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        case 129: {
            LogStep(129, "Wait 40000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 40000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 130: {
            LogStep(130, "24c:Reads OnOff attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnOff::Id, true, chip::NullOptional);
        }
        case 131: {
            LogStep(131, "24c:Reads OnTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OnTime::Id, true,
                                 chip::NullOptional);
        }
        case 132: {
            LogStep(132, "24c:Reads OffWaitTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("OO.S.A4002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), OnOff::Id, OnOff::Attributes::OffWaitTime::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_3_1Suite : public TestCommand
{
public:
    Test_TC_OO_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_3_2Suite : public TestCommand
{
public:
    Test_TC_OO_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OO_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_OO_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_2_2Suite : public TestCommand
{
public:
    Test_TC_RH_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_RH_2_2", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_RH_2_2Suite() {}

    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::app::DataModel::Nullable<uint16_t> ValueBeforeChange;

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
                ValueBeforeChange = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<uint16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintNotValue("value", value, ValueBeforeChange));
            }
            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;
        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, "Reads constraints of attribute: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("RH.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads constraints of attribute: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("RH.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads MeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("RH.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Operate on device to change the relative humidity significantly");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && RH.M.ManuallyControlled"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("RH.S.A0000 && RH.M.ManuallyControlled"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), RelativeHumidityMeasurement::Id,
                                 RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_2_2Suite : public TestCommand
{
public:
    Test_TC_SWTCH_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SWTCH_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SWTCH_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_3_2Suite : public TestCommand
{
public:
    Test_TC_SWTCH_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SWTCH_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_SWTCH_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_2_2Suite : public TestCommand
{
public:
    Test_TC_TMP_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TMP_2_2", 6, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TMP_2_2Suite() {}

    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::app::DataModel::Nullable<int16_t> valueBeforeChange;

    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
    {
        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));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32766));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27314));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27314));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
                valueBeforeChange = value;
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::Nullable<int16_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, -27314));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
                VerifyOrReturn(CheckConstraintNotValue("value", value, valueBeforeChange));
            }
            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;
        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, "Read the mandatory attribute: MinMeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MinMeasuredValue::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the mandatory attribute: MaxMeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MaxMeasuredValue::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads MeasuredValue attribute from DUT");
            VerifyOrDo(!ShouldSkip("TMP.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Operate on device to change the temperature significantly");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && TMP.M.ManuallyControlled"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Read the mandatory attribute: MeasuredValue");
            VerifyOrDo(!ShouldSkip("TMP.S.A0000 && TMP.M.ManuallyControlled"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TemperatureMeasurement::Id,
                                 TemperatureMeasurement::Attributes::MeasuredValue::Id, true, chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_3_1Suite : public TestCommand
{
public:
    Test_TC_TMP_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TMP_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TMP_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_3_1Suite : public TestCommand
{
public:
    Test_TC_TSTAT_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_3_2Suite : public TestCommand
{
public:
    Test_TC_TSTAT_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSTAT_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSTAT_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_3_1Suite : public TestCommand
{
public:
    Test_TC_TSUIC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_TSUIC_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_TSUIC_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_2_5Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_2_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_2_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_3_1Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_3_2Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_3_3Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_3_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_3_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_3_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_3_4Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_3_4Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_3_4", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_DGTHREAD_3_4Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_2_1Suite : public TestCommand
{
public:
    Test_TC_ACT_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACT_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACT_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_2_2Suite : public TestCommand
{
public:
    Test_TC_ACT_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACT_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACT_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_3_2Suite : public TestCommand
{
public:
    Test_TC_ACT_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACT_3_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACT_3_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LTIME_2_1Suite : public TestCommand
{
public:
    Test_TC_LTIME_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LTIME_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LTIME_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_LTIME_3_1Suite : public TestCommand
{
public:
    Test_TC_LTIME_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LTIME_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_LTIME_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BIND_2_1Suite : public TestCommand
{
public:
    Test_TC_BIND_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BIND_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BIND_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BIND_2_2Suite : public TestCommand
{
public:
    Test_TC_BIND_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BIND_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BIND_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BIND_2_3Suite : public TestCommand
{
public:
    Test_TC_BIND_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BIND_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BIND_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_1_1Suite : public TestCommand
{
public:
    Test_TC_S_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_1_1", 11, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_1_1Suite() {}

    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
    {
        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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 5U));
                VerifyOrReturn(CheckConstraintType("value", "int16u", "int16u"));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 0UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 1UL));
                VerifyOrReturn(CheckConstraintType("value", "bitmap32", "bitmap32"));
            }
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 7UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65528UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65529UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65531UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65532UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 65533UL));
            }
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::EventId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 40UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 41UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 42UL));
            }
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 40UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 41UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 42UL));
            }
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                chip::app::DataModel::DecodableList<chip::CommandId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 0UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            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;
        switch (testIndex)
        {
        case 0: {
            LogStep(0, "Commission DUT to TH (can be skipped if done in a preceding test)");
            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, "Read ClusterRevision (global attribute 65533)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read FeatureMap (global attribute 65532)");
            VerifyOrDo(!ShouldSkip("(!S.S.F00)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read FeatureMap (global attribute 65532)");
            VerifyOrDo(!ShouldSkip("S.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read AttributeList (global attribute 65531)");
            VerifyOrDo(!ShouldSkip("S.S.A0005"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read AttributeList (global attribute 65531)");
            VerifyOrDo(!ShouldSkip("(!S.S.A0005)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read EventList (global attribute 65530)");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::EventList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read AcceptedCommandList (global attribute 65529)");
            VerifyOrDo(!ShouldSkip("S.S.C40.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read AcceptedCommandList (global attribute 65529)");
            VerifyOrDo(!ShouldSkip("(!S.S.C40.Rsp)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read GeneratedCommandList (global attribute 65528)");
            VerifyOrDo(!ShouldSkip("S.C.C40.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read GeneratedCommandList (global attribute 65528)");
            VerifyOrDo(!ShouldSkip("(!S.C.C40.Tx)"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Scenes::Id, Scenes::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        }
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_2_1Suite : public TestCommand
{
public:
    Test_TC_S_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_2_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_2_2Suite : public TestCommand
{
public:
    Test_TC_S_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_2_3Suite : public TestCommand
{
public:
    Test_TC_S_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_S_3_1Suite : public TestCommand
{
public:
    Test_TC_S_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_S_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_S_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_3_1Suite : public TestCommand
{
public:
    Test_TC_PCC_3_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PCC_3_1", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_PCC_3_1Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_5Suite : public TestCommand
{
public:
    Test_TC_ACL_2_5Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_5", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_5Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_6Suite : public TestCommand
{
public:
    Test_TC_ACL_2_6Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_2_6", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACL_2_6Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BRBINFO_2_2Suite : public TestCommand
{
public:
    Test_TC_BRBINFO_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_BRBINFO_2_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BRBINFO_2_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_BRBINFO_2_3Suite : public TestCommand
{
public:
    Test_TC_BRBINFO_2_3Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_BRBINFO_2_3", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_BRBINFO_2_3Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACE_1_2Suite : public TestCommand
{
public:
    Test_TC_ACE_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACE_1_2", 0, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }

    ~Test_TC_ACE_1_2Suite() {}

    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
    {
        bool shouldContinue = false;

        switch (mTestIndex - 1)
        {
        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;
        switch (testIndex)
        {}
        return CHIP_NO_ERROR;
    }
};

#endif // CONFIG_ENABLE_YAML_TESTS

void registerCommandsTests(Commands & commands, CredentialIssuerCommands * credsIssuerConfig)
{
    const char * clusterName = "Tests";

    commands_list clusterCommands = {
#if CONFIG_ENABLE_YAML_TESTS
        make_unique<TestList>(),
        make_unique<ManualTestList>(),
        make_unique<TestAccessControlClusterSuite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACE_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACE_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_BOOL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BOOL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BRBINFO_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BRBINFO_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BIND_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_5_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_5_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_6_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_6_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_8_1Suite>(credsIssuerConfig),
        make_unique<TestColorControl_9_1Suite>(credsIssuerConfig),
        make_unique<TestColorControl_9_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BINFO_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BINFO_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DESC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DLOG_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGETH_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGETH_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGETH_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLW_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLW_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLABEL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLABEL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CGEN_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CGEN_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_ILL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ILL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ILL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LCFG_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LUNIT_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LUNIT_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LTIME_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LOWPOWER_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_KEYPADINPUT_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_WAKEONLAN_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_1_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_1_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_TGTNAV_1_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_TGTNAV_8_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_APBSC_1_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_1_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_ALOGIN_1_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_LOWPOWER_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_KEYPADINPUT_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_KEYPADINPUT_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_7_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TGTNAV_8_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_APBSC_9_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WAKEONLAN_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ALOGIN_12_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_1_1Suite>(credsIssuerConfig),
        make_unique<OTA_SuccessfulTransferSuite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_PS_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PS_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PRS_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PRS_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PRS_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_PSCFG_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PSCFG_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_RH_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_RH_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_5_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SWTCH_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SWTCH_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TMP_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TMP_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSUIC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSUIC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSUIC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_3_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_4_5Suite>(credsIssuerConfig),
        make_unique<TV_TargetNavigatorClusterSuite>(credsIssuerConfig),
        make_unique<TV_AudioOutputClusterSuite>(credsIssuerConfig),
        make_unique<TV_ApplicationLauncherClusterSuite>(credsIssuerConfig),
        make_unique<TV_KeypadInputClusterSuite>(credsIssuerConfig),
        make_unique<TV_AccountLoginClusterSuite>(credsIssuerConfig),
        make_unique<TV_WakeOnLanClusterSuite>(credsIssuerConfig),
        make_unique<TV_ApplicationBasicClusterSuite>(credsIssuerConfig),
        make_unique<TV_MediaPlaybackClusterSuite>(credsIssuerConfig),
        make_unique<TV_ChannelClusterSuite>(credsIssuerConfig),
        make_unique<TV_LowPowerClusterSuite>(credsIssuerConfig),
        make_unique<TV_ContentLauncherClusterSuite>(credsIssuerConfig),
        make_unique<TV_MediaInputClusterSuite>(credsIssuerConfig),
        make_unique<TestCASERecoverySuite>(credsIssuerConfig),
        make_unique<TestClusterSuite>(credsIssuerConfig),
        make_unique<TestClusterComplexTypesSuite>(credsIssuerConfig),
        make_unique<TestConstraintsSuite>(credsIssuerConfig),
        make_unique<TestDelayCommandsSuite>(credsIssuerConfig),
        make_unique<TestEventsSuite>(credsIssuerConfig),
        make_unique<TestDiscoverySuite>(credsIssuerConfig),
        make_unique<TestLogCommandsSuite>(credsIssuerConfig),
        make_unique<TestSaveAsSuite>(credsIssuerConfig),
        make_unique<TestConfigVariablesSuite>(credsIssuerConfig),
        make_unique<TestDescriptorClusterSuite>(credsIssuerConfig),
        make_unique<TestBasicInformationSuite>(credsIssuerConfig),
        make_unique<TestFabricRemovalWhileSubscribedSuite>(credsIssuerConfig),
        make_unique<TestGeneralCommissioningSuite>(credsIssuerConfig),
        make_unique<TestIdentifyClusterSuite>(credsIssuerConfig),
        make_unique<TestOperationalCredentialsClusterSuite>(credsIssuerConfig),
        make_unique<TestModeSelectClusterSuite>(credsIssuerConfig),
        make_unique<TestSelfFabricRemovalSuite>(credsIssuerConfig),
        make_unique<TestSystemCommandsSuite>(credsIssuerConfig),
        make_unique<TestBindingSuite>(credsIssuerConfig),
        make_unique<TestUserLabelClusterSuite>(credsIssuerConfig),
        make_unique<TestUserLabelClusterConstraintsSuite>(credsIssuerConfig),
        make_unique<TestArmFailSafeSuite>(credsIssuerConfig),
        make_unique<TestFanControlSuite>(credsIssuerConfig),
        make_unique<TestAccessControlConstraintsSuite>(credsIssuerConfig),
        make_unique<TestLevelControlWithOnOffDependencySuite>(credsIssuerConfig),
        make_unique<TestCommissioningWindowSuite>(credsIssuerConfig),
        make_unique<TestCommissionerNodeIdSuite>(credsIssuerConfig),
        make_unique<TestMultiAdminSuite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_1_1Suite>(credsIssuerConfig),
        make_unique<TestSubscribe_OnOffSuite>(credsIssuerConfig),
        make_unique<TestSubscribe_AdministratorCommissioningSuite>(credsIssuerConfig),
        make_unique<DL_UsersAndCredentialsSuite>(credsIssuerConfig),
        make_unique<DL_LockUnlockSuite>(credsIssuerConfig),
        make_unique<DL_SchedulesSuite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_5Suite>(credsIssuerConfig),
        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),
        make_unique<Test_TC_G_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_G_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_1_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_16Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_17Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_18Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_19Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_20Suite>(credsIssuerConfig),
        make_unique<Test_TC_DD_3_21Suite>(credsIssuerConfig),
        make_unique<TestGroupDemoCommandSuite>(credsIssuerConfig),
        make_unique<TestGroupDemoConfigSuite>(credsIssuerConfig),
        make_unique<Test_TC_G_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_G_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_G_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_BDX_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_BR_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BR_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BR_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_BR_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_DA_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_BINFO_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BINFO_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_OPCREDS_3_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_16Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_17Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_18Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_19Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_20Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_21Suite>(credsIssuerConfig),
        make_unique<Test_TC_CNET_4_22Suite>(credsIssuerConfig),
        make_unique<Test_TC_DLOG_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DLOG_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DLOG_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DESC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGETH_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CGEN_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGGEN_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_I_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ILL_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_4_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_5_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_5_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_6_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_6_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_6_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_IDM_8_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LOWPOWER_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_8_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_APPLAUNCHER_3_9_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_16Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAINPUT_3_17Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CHANNEL_5_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_KEYPADINPUT_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_MEDIAPLAYBACK_6_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_7_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_AUDIOOUTPUT_7_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CONTENTLAUNCHER_10_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_MC_11_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MC_11_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ALOGIN_12_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_11Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_12Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_14Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_15Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_16Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_17Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_18Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_19Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_20Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_21Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_22Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_13Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_23Suite>(credsIssuerConfig),
        make_unique<Test_TC_CADMIN_1_24Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_MOD_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_2_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SU_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_PSCFG_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_1_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_1_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_2_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_7Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_9Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_5_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_6_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_WNCV_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLW_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_OCC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PS_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BOOL_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_4_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_5_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_6_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_9_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_9_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_9_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_CC_9_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_8Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_2_10Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DRLK_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_LCFG_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_7_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LVL_8_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_OO_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_RH_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SWTCH_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_SWTCH_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TMP_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TMP_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSTAT_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_TSUIC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_3_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGTHREAD_3_4Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LTIME_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LTIME_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BIND_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BIND_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BIND_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_S_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_PCC_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_5Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_6Suite>(credsIssuerConfig),
        make_unique<Test_TC_BRBINFO_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_BRBINFO_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACE_1_2Suite>(credsIssuerConfig),
#endif // CONFIG_ENABLE_YAML_TESTS
    };

    commands.Register(clusterName, clusterCommands);
}
