diff --git a/examples/shell/cc13x2x7_26x2x7/include/CHIPProjectConfig.h b/examples/shell/cc13x2x7_26x2x7/include/CHIPProjectConfig.h index e7cf8a0ad56c5b..969a02acb089ca 100644 --- a/examples/shell/cc13x2x7_26x2x7/include/CHIPProjectConfig.h +++ b/examples/shell/cc13x2x7_26x2x7/include/CHIPProjectConfig.h @@ -73,7 +73,7 @@ * * A size, in bytes, of the individual debug event logging buffer. */ -#define CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE (512) +#define CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE (256) #define MATTER_CC13X2_26X2_PLATFORM_LOG_ENABLED 0 diff --git a/src/app/tests/suites/TestAccessControlCluster.yaml b/src/app/tests/suites/TestAccessControlCluster.yaml index ea6425ca7daa29..7377d4f8d33cd0 100644 --- a/src/app/tests/suites/TestAccessControlCluster.yaml +++ b/src/app/tests/suites/TestAccessControlCluster.yaml @@ -69,6 +69,18 @@ tests: { Cluster: 18, Endpoint: 19, DeviceType: null }, ], }, + { + FabricIndex: 0, + Privilege: 3, # operate + AuthMode: 2, # case + Subjects: [20, 21, 22, 23], + Targets: + [ + { Cluster: null, Endpoint: 24, DeviceType: null }, + { Cluster: 25, Endpoint: null, DeviceType: null }, + { Cluster: 26, Endpoint: 27, DeviceType: null }, + ], + }, ] - label: "Verify" @@ -112,6 +124,18 @@ tests: { Cluster: 18, Endpoint: 19, DeviceType: null }, ], }, + { + FabricIndex: 1, + Privilege: 3, # operate + AuthMode: 2, # case + Subjects: [20, 21, 22, 23], + Targets: + [ + { Cluster: null, Endpoint: 24, DeviceType: null }, + { Cluster: 25, Endpoint: null, DeviceType: null }, + { Cluster: 26, Endpoint: 27, DeviceType: null }, + ], + }, ] - label: "Write entries empty lists" @@ -476,6 +500,18 @@ tests: { Cluster: 26, Endpoint: 27, DeviceType: null }, ], }, + { + FabricIndex: 0, + Privilege: 3, # operate + AuthMode: 2, # case + Subjects: [28, 29, 30, 31], + Targets: + [ + { Cluster: null, Endpoint: 32, DeviceType: null }, + { Cluster: 33, Endpoint: null, DeviceType: null }, + { Cluster: 34, Endpoint: 35, DeviceType: null }, + ], + }, ] response: error: RESOURCE_EXHAUSTED @@ -521,6 +557,18 @@ tests: { Cluster: 18, Endpoint: 19, DeviceType: null }, ], }, + { + FabricIndex: 1, + Privilege: 1, # view + AuthMode: 2, # case + Subjects: [20, 21, 22, 23], + Targets: + [ + { Cluster: null, Endpoint: 24, DeviceType: null }, + { Cluster: 25, Endpoint: null, DeviceType: null }, + { Cluster: 26, Endpoint: 27, DeviceType: null }, + ], + }, ] # note missing last entry @@ -571,4 +619,4 @@ tests: attribute: "AccessControlEntriesPerFabric" response: constraints: - minValue: 3 + minValue: 4 diff --git a/src/app/tests/suites/TestGroupKeyManagementCluster.yaml b/src/app/tests/suites/TestGroupKeyManagementCluster.yaml index 06bd25aff2bb69..dbd728018f77aa 100644 --- a/src/app/tests/suites/TestGroupKeyManagementCluster.yaml +++ b/src/app/tests/suites/TestGroupKeyManagementCluster.yaml @@ -33,7 +33,7 @@ tests: attribute: "maxGroupsPerFabric" response: constraints: - minValue: 2 + minValue: 4 - label: "Read maxGroupKeysPerFabric" command: "readAttribute" @@ -123,6 +123,8 @@ tests: { FabricIndex: 1, GroupId: 0x0101, GroupKeySetID: 0x01a2 }, { FabricIndex: 1, GroupId: 0x0102, GroupKeySetID: 0x01a1 }, { FabricIndex: 1, GroupId: 0x0102, GroupKeySetID: 0x01a2 }, + { FabricIndex: 1, GroupId: 0x0103, GroupKeySetID: 0x01a1 }, + { FabricIndex: 1, GroupId: 0x0103, GroupKeySetID: 0x01a2 }, ] response: error: FAILURE @@ -134,8 +136,9 @@ tests: value: [ { FabricIndex: 1, GroupId: 0x0101, GroupKeySetID: 0x01a1 }, - { FabricIndex: 1, GroupId: 0x0102, GroupKeySetID: 0x01a1 }, { FabricIndex: 1, GroupId: 0x0102, GroupKeySetID: 0x01a2 }, + { FabricIndex: 1, GroupId: 0x0103, GroupKeySetID: 0x01a1 }, + { FabricIndex: 1, GroupId: 0x0104, GroupKeySetID: 0x01a2 }, ] - label: "Read Group Keys" @@ -145,8 +148,9 @@ tests: value: [ { FabricIndex: 1, GroupId: 0x0101, GroupKeySetID: 0x01a1 }, - { FabricIndex: 1, GroupId: 0x0102, GroupKeySetID: 0x01a1 }, { FabricIndex: 1, GroupId: 0x0102, GroupKeySetID: 0x01a2 }, + { FabricIndex: 1, GroupId: 0x0103, GroupKeySetID: 0x01a1 }, + { FabricIndex: 1, GroupId: 0x0104, GroupKeySetID: 0x01a2 }, ] - label: "Add Group 1" @@ -183,6 +187,40 @@ tests: - name: "GroupID" value: 0x0102 + - label: "Add Group 3" + cluster: "Groups" + endpoint: 1 + command: "AddGroup" + arguments: + values: + - name: "GroupID" + value: 0x0103 + - name: "GroupName" + value: "Group #3" + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: 0x0103 + + - label: "Add Group 4" + cluster: "Groups" + endpoint: 1 + command: "AddGroup" + arguments: + values: + - name: "GroupID" + value: 0x0104 + - name: "GroupName" + value: "Group #4" + response: + values: + - name: "Status" + value: 0 + - name: "GroupID" + value: 0x0104 + - label: "Read GroupTable" command: "readAttribute" attribute: "GroupTable" @@ -201,6 +239,18 @@ tests: Endpoints: [1], GroupName: "Group #2", }, + { + FabricIndex: 1, + GroupId: 0x0103, + endpoints: [1], + GroupName: "Group #3", + }, + { + FabricIndex: 1, + GroupId: 0x0104, + endpoints: [1], + GroupName: "Group #4", + }, ] - label: "KeySet Remove 1" @@ -267,6 +317,18 @@ tests: Endpoints: [1], GroupName: "Group #2", }, + { + FabricIndex: 1, + GroupId: 0x0103, + endpoints: [1], + GroupName: "Group #3", + }, + { + FabricIndex: 1, + GroupId: 0x0104, + endpoints: [1], + GroupName: "Group #4", + }, ] - label: "Remove All" diff --git a/src/lib/core/CHIPConfig.h b/src/lib/core/CHIPConfig.h index 399df9452263c4..18966b90775c0d 100644 --- a/src/lib/core/CHIPConfig.h +++ b/src/lib/core/CHIPConfig.h @@ -983,6 +983,17 @@ extern const char CHIP_NON_PRODUCTION_MARKER[]; #define CHIP_CONFIG_DEVICE_MAX_ACTIVE_DEVICES 4 #endif +/** + * @def CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC + * + * @brief Defines the number of "endpoint->controlling group" mappings per fabric. + * + * Binds to number of GroupMapping entries per fabric + */ +#ifndef CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC +#define CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC 1 +#endif + /** * @def CHIP_CONFIG_MAX_GROUPS_PER_FABRIC * @@ -991,7 +1002,11 @@ extern const char CHIP_NON_PRODUCTION_MARKER[]; * Binds to number of GroupState entries to support per fabric */ #ifndef CHIP_CONFIG_MAX_GROUPS_PER_FABRIC -#define CHIP_CONFIG_MAX_GROUPS_PER_FABRIC 3 +#define CHIP_CONFIG_MAX_GROUPS_PER_FABRIC (4 * CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC) +#endif + +#if CHIP_CONFIG_MAX_GROUPS_PER_FABRIC < (4 * CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC) +#error "Please ensure CHIP_CONFIG_MAX_GROUPS_PER_FABRIC meets minimum requirements. See Group Limits in the specification." #endif /** @@ -1009,17 +1024,6 @@ extern const char CHIP_NON_PRODUCTION_MARKER[]; #error "Please ensure CHIP_CONFIG_MAX_GROUP_KEYS_PER_FABRIC > 0 to support at least the IPK." #endif -/** - * @def CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC - * - * @brief Defines the number of "endpoint->controlling group" mappings per fabric. - * - * Binds to number of GroupMapping entries per fabric - */ -#ifndef CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC -#define CHIP_CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC 1 -#endif - /** * @def CHIP_CONFIG_MAX_GROUP_CONCURRENT_ITERATORS * @@ -1047,7 +1051,7 @@ extern const char CHIP_NON_PRODUCTION_MARKER[]; * example access control code. */ #ifndef CHIP_CONFIG_EXAMPLE_ACCESS_CONTROL_MAX_ENTRIES_PER_FABRIC -#define CHIP_CONFIG_EXAMPLE_ACCESS_CONTROL_MAX_ENTRIES_PER_FABRIC 3 +#define CHIP_CONFIG_EXAMPLE_ACCESS_CONTROL_MAX_ENTRIES_PER_FABRIC 4 #endif /** diff --git a/src/python_testing/TC_RR_1_1.py b/src/python_testing/TC_RR_1_1.py index c9704416f6d2a7..026220c9ceb9ba 100644 --- a/src/python_testing/TC_RR_1_1.py +++ b/src/python_testing/TC_RR_1_1.py @@ -17,16 +17,20 @@ import asyncio import logging +import math import queue import random import time from binascii import hexlify from threading import Event +from typing import Any, Dict, List import chip.CertificateAuthority import chip.clusters as Clusters import chip.FabricAdmin +from chip import ChipDeviceCtrl from chip.clusters.Attribute import AttributeStatus, SubscriptionTransaction, TypedAttributePath +from chip.clusters.Types import NullValue from chip.interaction_model import Status as StatusEnum from chip.utils import CommissioningBuildingBlocks from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main @@ -174,7 +178,7 @@ async def test_TC_RR_1_1(self): node_label = await self.read_single_attribute(client, node_id=self.dut_node_id, endpoint=0, attribute=Clusters.BasicInformation.Attributes.NodeLabel) asserts.assert_equal(node_label, BEFORE_LABEL, "NodeLabel must match what was written") - # Step 3: Add 3 Access Control entries on DUT with a list of 4 Subjects and 3 Targets with the following parameters (...) + # Step 3: Add 4 Access Control entries on DUT with a list of 4 Subjects and 3 Targets with the following parameters (...) logging.info("Step 3: Fill ACL table so that all minimas are reached") for idx in range(num_fabrics_to_commission): @@ -351,6 +355,57 @@ async def test_TC_RR_1_1(self): else: logging.info("Step 9: Skipped due to no UserLabel cluster instances") + # Step 10: Count all group cluster instances + # and ensure MaxGroupsPerFabric >= 4 * counted_groups_clusters. + logging.info("Step 10: Validating groups support minimums") + groups_cluster_endpoints: Dict[int, Any] = await dev_ctrl.ReadAttribute(self.dut_node_id, [Clusters.Groups]) + counted_groups_clusters: int = len(groups_cluster_endpoints) + + # The test for Step 10 and all of Steps 11 to 14 are only performed if Groups cluster instances are found. + if counted_groups_clusters > 0: + indicated_max_groups_per_fabric: int = await self.read_single_attribute(dev_ctrl, + node_id=self.dut_node_id, + endpoint=0, + attribute=Clusters.GroupKeyManagement.Attributes.MaxGroupsPerFabric) + if indicated_max_groups_per_fabric < 4 * counted_groups_clusters: + asserts.fail(f"Failed Step 10: MaxGroupsPerFabric < 4 * counted_groups_clusters") + + # Step 11: Confirm MaxGroupKeysPerFabric meets the minimum requirement of 3. + indicated_max_group_keys_per_fabric: int = await self.read_single_attribute(dev_ctrl, + node_id=self.dut_node_id, + endpoint=0, + attribute=Clusters.GroupKeyManagement.Attributes.MaxGroupKeysPerFabric) + if indicated_max_group_keys_per_fabric < 3: + asserts.fail(f"Failed Step 11: MaxGroupKeysPerFabric < 3") + + # Create a list of per-fabric clients to use for filling group resources accross all fabrics. + fabric_unique_clients: List[Any] = [] + for fabric_idx in range(num_fabrics_to_commission): + fabric_number: int = fabric_idx + 1 + # Client is client A for each fabric to set the Label field + client_name: str = "RD%dA" % fabric_number + fabric_unique_clients.append(client_by_name[client_name]) + + # Step 12: Write and verify indicated_max_group_keys_per_fabric group keys to all fabrics. + group_keys: List[List[Clusters.GroupKeyManagement.Structs.GroupKeySetStruct]] = await self.fill_and_validate_group_key_sets( + num_fabrics_to_commission, fabric_unique_clients, indicated_max_group_keys_per_fabric) + + # Step 13: Write and verify indicated_max_groups_per_fabric group/key mappings for all fabrics. + # First, Generate list of unique group/key mappings + group_key_map: List[Dict[int, int]] = [{} for _ in range(num_fabrics_to_commission)] + for fabric_idx in range(num_fabrics_to_commission): + for group_idx in range(indicated_max_groups_per_fabric): + group_id: int = fabric_idx * indicated_max_groups_per_fabric + group_idx + 1 + group_key_idx: int = group_idx % len(group_keys[fabric_idx]) + group_key_map[fabric_idx][group_id] = group_keys[fabric_idx][group_key_idx].groupKeySetID + + await self.fill_and_validate_group_key_map(num_fabrics_to_commission, fabric_unique_clients, group_key_map) + + # Step 14: Add all the groups to the discovered groups-supporting endpoints and verify GroupTable + group_table_written: List[Dict[int, Clusters.GroupKeyManagement.Structs.GroupInfoMapStruct]] = await self.add_all_groups( + num_fabrics_to_commission, fabric_unique_clients, group_key_map, groups_cluster_endpoints, indicated_max_groups_per_fabric) + await self.validate_group_table(num_fabrics_to_commission, fabric_unique_clients, group_table_written) + def random_string(self, length) -> str: rnd = self._pseudo_random_generator return "".join([rnd.choice("abcdef0123456789") for _ in range(length)])[:length] @@ -378,6 +433,171 @@ async def fill_user_label_list(self, dev_ctrl, target_node_id): asserts.assert_equal(read_back_labels, labels, "LabelList attribute must match what was written") + async def fill_and_validate_group_key_sets(self, + fabrics: int, + clients: List[Any], + keys_per_fabric: int) -> List[List[Clusters.GroupKeyManagement.Structs.GroupKeySetStruct]]: + # Step 12: Write indicated_max_group_keys_per_fabric group keys to all fabrics. + group_keys: List[List[Clusters.GroupKeyManagement.Structs.GroupKeySetStruct]] = [[] for _ in range(fabrics)] + for fabric_idx in range(fabrics): + client: Any = clients[fabric_idx] + + # Write, skip the IPK key set. + for group_key_cluster_idx in range(1, keys_per_fabric): + group_key_list_idx: int = group_key_cluster_idx - 1 + + logging.info("Step 12: Setting group key on fabric %d at index '%d'" % (fabric_idx+1, group_key_cluster_idx)) + group_keys[fabric_idx].append(self.build_group_key(fabric_idx, group_key_cluster_idx, keys_per_fabric)) + await client.SendCommand(self.dut_node_id, 0, Clusters.GroupKeyManagement.Commands.KeySetWrite(group_keys[fabric_idx][group_key_list_idx])) + + # Step 12 verification: After all the key sets were written, read all the information back. + for fabric_idx in range(fabrics): + client: Any = clients[fabric_idx] + + # Read, skip the IPK key set. + for group_key_cluster_idx in range(1, keys_per_fabric): + group_key_list_idx: int = group_key_cluster_idx - 1 + + logging.info("Step 12: Reading back group key on fabric %d at index ''%d'" % (fabric_idx+1, group_key_cluster_idx)) + key_set = await client.SendCommand(self.dut_node_id, 0, + Clusters.GroupKeyManagement.Commands.KeySetRead( + group_keys[fabric_idx][group_key_list_idx].groupKeySetID), + responseType=Clusters.GroupKeyManagement.Commands.KeySetReadResponse) + + asserts.assert_equal(group_keys[fabric_idx][group_key_list_idx].groupKeySetID, + key_set.groupKeySet.groupKeySetID, "Received incorrect key set.") + asserts.assert_equal(group_keys[fabric_idx][group_key_list_idx].groupKeySecurityPolicy, + key_set.groupKeySet.groupKeySecurityPolicy) + asserts.assert_equal(group_keys[fabric_idx][group_key_list_idx].epochStartTime0, + key_set.groupKeySet.epochStartTime0) + asserts.assert_equal(group_keys[fabric_idx][group_key_list_idx].epochStartTime1, + key_set.groupKeySet.epochStartTime1) + asserts.assert_equal(group_keys[fabric_idx][group_key_list_idx].epochStartTime2, + key_set.groupKeySet.epochStartTime2) + asserts.assert_equal(NullValue, key_set.groupKeySet.epochKey0, + "Value for epochKey0 included in KeySetReadResponse. It must not be.") + asserts.assert_equal(NullValue, key_set.groupKeySet.epochKey1, + "Value for epochKey1 included in KeySetReadResponse. It must not be.") + asserts.assert_equal(NullValue, key_set.groupKeySet.epochKey2, + "Value for epochKey2 included in KeySetReadResponse. It must not be.") + + return group_keys + + async def fill_and_validate_group_key_map(self, + fabrics: int, + clients: List[Any], + group_key_map: List[Dict[int, int]]) -> None: + # Step 13: Write and verify indicated_max_groups_per_fabric group/key mappings for all fabrics. + mapping_structs: List[List[Clusters.GroupKeyManagement.Structs.GroupKeyMapStruct]] = [[] for _ in range(fabrics)] + for fabric_idx in range(fabrics): + client: Any = clients[fabric_idx] + fabric_idx_matter: int = fabric_idx + 1 + + for group in group_key_map[fabric_idx]: + mapping_structs[fabric_idx].append(Clusters.GroupKeyManagement.Structs.GroupKeyMapStruct(groupId=group, + groupKeySetID=group_key_map[fabric_idx][group], + fabricIndex=fabric_idx_matter)) + + logging.info("Step 13: Setting group key map on fabric %d" % (fabric_idx_matter)) + await client.WriteAttribute(self.dut_node_id, [(0, Clusters.GroupKeyManagement.Attributes.GroupKeyMap(mapping_structs[fabric_idx]))]) + + # Step 13 verification: After all the group key maps were written, read all the information back. + for fabric_idx in range(fabrics): + client: Any = clients[fabric_idx] + fabric_idx_matter: int = fabric_idx + 1 + + logging.info("Step 13: Reading group key map on fabric %d" % (fabric_idx_matter)) + group_key_map_readback = await self.read_single_attribute(client, node_id=self.dut_node_id, endpoint=0, attribute=Clusters.GroupKeyManagement.Attributes.GroupKeyMap) + + found_entry: int = 0 + for read_entry in group_key_map_readback: + if read_entry.fabricIndex != fabric_idx_matter: + continue + + written_entry = next(entry for entry in mapping_structs[fabric_idx] if entry.groupId == read_entry.groupId) + found_entry += 1 + asserts.assert_equal(written_entry.groupId, read_entry.groupId) + asserts.assert_equal(written_entry.groupKeySetID, read_entry.groupKeySetID) + asserts.assert_equal(written_entry.fabricIndex, read_entry.fabricIndex) + + asserts.assert_equal(found_entry, len(mapping_structs[fabric_idx]), + "GroupKeyMap does not match the length of written data.") + + async def add_all_groups(self, + fabrics: int, + clients: List[Any], + group_key_map: List[Dict[int, int]], + group_endpoints: Dict[int, Any], + groups_per_fabric: int) -> List[Dict[int, Clusters.GroupKeyManagement.Structs.GroupInfoMapStruct]]: + # Step 14: Add indicated_max_groups_per_fabric to each fabric through the Groups clusters on supporting endpoints. + written_group_table_map: List[Dict[int, Clusters.GroupKeyManagement.Structs.GroupInfoMapStruct]] = [ + {} for _ in range(fabrics)] + for fabric_idx in range(fabrics): + client: Any = clients[fabric_idx] + fabric_idx_matter: int = fabric_idx + 1 + + base_groups_per_endpoint: int = math.floor(groups_per_fabric / len(group_endpoints)) + groups_remainder: int = groups_per_fabric % len(group_endpoints) + fabric_group_index: int = 0 + + for endpoint_id in group_endpoints: + groups_to_add: int = base_groups_per_endpoint + groups_remainder + groups_remainder -= 1 + + feature_map: int = await self.read_single_attribute(client, + node_id=self.dut_node_id, + endpoint=endpoint_id, + attribute=Clusters.Groups.Attributes.FeatureMap) + name_featrure_bit: int = 0 + name_supported: bool = (feature_map & (1 << name_featrure_bit)) != 0 + + # Write groups to cluster + for group_id in group_key_map[fabric_idx]: + group_name: str = self.random_string(16) if name_supported else "" + command: Clusters.Groups.Commands.AddGroup = Clusters.Groups.Commands.AddGroup( + groupID=group_id, groupName=group_name) + written_group_table_map[fabric_idx][group_id] = Clusters.GroupKeyManagement.Structs.GroupInfoMapStruct(groupId=group_id, + groupName=group_name, + fabricIndex=fabric_idx_matter, + endpoints=[endpoint_id]) + add_response: Clusters.Groups.Commands.AddGroupResponse = await client.SendCommand(self.dut_node_id, endpoint_id, command, + responseType=Clusters.Groups.Commands.AddGroupResponse) + asserts.assert_equal(StatusEnum.Success, add_response.status) + asserts.assert_equal(group_id, add_response.groupID) + + # for endpoint_id in group_endpoints + fabric_group_index += groups_to_add + + return written_group_table_map + + async def validate_group_table(self, + fabrics: int, + clients: List[Any], + group_table_written: List[Dict[int, Clusters.GroupKeyManagement.Structs.GroupInfoMapStruct]]) -> None: + for fabric_idx in range(fabrics): + client: Any = clients[fabric_idx] + fabric_idx_matter: int = fabric_idx + 1 + + group_table_read: List[Clusters.GroupKeyManagement.Attributes.GroupTable] = await self.read_single_attribute( + client, node_id=self.dut_node_id, endpoint=0, attribute=Clusters.GroupKeyManagement.Attributes.GroupTable) + + found_groups: int = 0 + for read_entry in group_table_read: + if read_entry.fabricIndex != fabric_idx_matter: + continue + + found_groups += 1 + asserts.assert_in(read_entry.groupId, group_table_written[fabric_idx], "Group missing from group map") + written_entry: Clusters.GroupKeyManagement.Structs.GroupInfoMapStruct = group_table_written[ + fabric_idx][read_entry.groupId] + asserts.assert_equal(written_entry.groupId, read_entry.groupId) + asserts.assert_equal(written_entry.endpoints, read_entry.endpoints) + asserts.assert_equal(written_entry.groupName, read_entry.groupName) + asserts.assert_equal(written_entry.fabricIndex, read_entry.fabricIndex) + + asserts.assert_equal(found_groups, len(group_table_written[fabric_idx]), + "Found group count does not match written value.") + def build_acl(self, fabric_number, client_by_name, num_controllers_per_fabric): acl = [] @@ -398,6 +618,11 @@ def build_acl(self, fabric_number, client_by_name, num_controllers_per_fabric): # - AuthMode field: CASE (2) # - Subjects field: [0x3000_0000_0000_0001, 0x3000_0000_0000_0002, 0x3000_0000_0000_0003, 0x3000_0000_0000_0004] # - Targets field: [{Cluster: 0xFFF1_FC40, DeviceType: 0xFFF1_FC20}, {Cluster: 0xFFF1_FC41, DeviceType: 0xFFF1_FC21}, {Cluster: 0xFFF1_FC02, DeviceType: 0xFFF1_FC42}] + # . struct + # - Privilege field: View (3) + # - AuthMode field: CASE (2) + # - Subjects field: [0x4000_0000_0000_0001, 0x4000_0000_0000_0002, 0x4000_0000_0000_0003, 0x4000_0000_0000_0004] + # - Targets field: [{Cluster: 0xFFF1_FC80, DeviceType: 0xFFF1_FC20}, {Cluster: 0xFFF1_FC81, DeviceType: 0xFFF1_FC21}, {Cluster: 0xFFF1_FC82, DeviceType: 0xFFF1_FC22}] # Administer ACL entry admin_subjects = [0xFFFF_FFFD_0001_0001, 0x2000_0000_0000_0001, 0x2000_0000_0000_0002, 0x2000_0000_0000_0003] @@ -441,8 +666,41 @@ def build_acl(self, fabric_number, client_by_name, num_controllers_per_fabric): targets=operate_targets) acl.append(operate_acl_entry) + # Operate ACL entry + view_subjects = [0x4000_0000_0000_0001, 0x4000_0000_0000_0002, 0x4000_0000_0000_0003, 0x4000_0000_0000_0004] + view_targets = [ + Clusters.AccessControl.Structs.Target(cluster=0xFFF1_FC80, deviceType=0xFFF1_BC20), + Clusters.AccessControl.Structs.Target(cluster=0xFFF1_FC81, deviceType=0xFFF1_BC21), + Clusters.AccessControl.Structs.Target(cluster=0xFFF1_FC82, deviceType=0xFFF1_BC22) + ] + + view_acl_entry = Clusters.AccessControl.Structs.AccessControlEntryStruct(privilege=Clusters.AccessControl.Enums.AccessControlEntryPrivilegeEnum.kView, + authMode=Clusters.AccessControl.Enums.AccessControlEntryAuthModeEnum.kCase, + subjects=view_subjects, + targets=view_targets) + acl.append(view_acl_entry) + return acl + def build_group_key(self, fabric_index: int, group_key_index: int, keys_per_fabric: int) -> Clusters.GroupKeyManagement.Structs.GroupKeySetStruct: + asserts.assert_not_equal(group_key_index, 0, "TH Internal Error: IPK key set index (0) should not be re-generated.") + + # groupKeySetID is definted as uint16 in the Matter specification. + # To easily test that the stored values are unique, unique values are created accross all fabrics. + # However, it is only required that values be unique within a fabric according to the specifiction. + # If a device ever provides over 65535 total key sets, then this will need to be updated. + set_id: int = fabric_index*keys_per_fabric + group_key_index + asserts.assert_less_equal( + set_id, 0xFFFF, "Invalid Key Set ID. This may be a limitation of the test harness, not the device under test.") + return Clusters.GroupKeyManagement.Structs.GroupKeySetStruct(groupKeySetID=set_id, + groupKeySecurityPolicy=Clusters.GroupKeyManagement.Enums.GroupKeySecurityPolicy.kTrustFirst, + epochKey0=self.random_string(16).encode(), + epochStartTime0=(set_id * 4), + epochKey1=self.random_string(16).encode(), + epochStartTime1=(set_id * 4 + 1), + epochKey2=self.random_string(16).encode(), + epochStartTime2=(set_id * 4 + 2)) + if __name__ == "__main__": default_matter_test_main(maximize_cert_chains=True, controller_cat_tags=[0x0001_0001]) diff --git a/zzz_generated/chip-tool/zap-generated/test/Commands.h b/zzz_generated/chip-tool/zap-generated/test/Commands.h index a898df02de63f3..6732447eae678b 100644 --- a/zzz_generated/chip-tool/zap-generated/test/Commands.h +++ b/zzz_generated/chip-tool/zap-generated/test/Commands.h @@ -762,7 +762,58 @@ class TestAccessControlClusterSuite : public TestCommand CheckNoMoreListItems("acl[2].targets.Value()", iter_3, 3)); } VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U)); - VerifyOrReturn(CheckNoMoreListItems("acl", iter_0, 3)); + VerifyOrReturn(CheckNextListItemDecodes("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( + "acl[3].subjects.Value()", iter_3, 0)); + VerifyOrReturn(CheckValue("acl[3].subjects.Value()[0]", iter_3.GetValue(), 20ULL)); + VerifyOrReturn(CheckNextListItemDecodes( + "acl[3].subjects.Value()", iter_3, 1)); + VerifyOrReturn(CheckValue("acl[3].subjects.Value()[1]", iter_3.GetValue(), 21ULL)); + VerifyOrReturn(CheckNextListItemDecodes( + "acl[3].subjects.Value()", iter_3, 2)); + VerifyOrReturn(CheckValue("acl[3].subjects.Value()[2]", iter_3.GetValue(), 22ULL)); + VerifyOrReturn(CheckNextListItemDecodes( + "acl[3].subjects.Value()", iter_3, 3)); + VerifyOrReturn(CheckValue("acl[3].subjects.Value()[3]", iter_3.GetValue(), 23ULL)); + VerifyOrReturn(CheckNoMoreListItems("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( + "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( + "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( + "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("acl[3].targets.Value()", iter_3, 3)); + } + VerifyOrReturn(CheckValue("acl[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U)); + VerifyOrReturn(CheckNoMoreListItems("acl", iter_0, 4)); } } break; @@ -1074,7 +1125,58 @@ class TestAccessControlClusterSuite : public TestCommand CheckNoMoreListItems("acl[2].targets.Value()", iter_3, 3)); } VerifyOrReturn(CheckValue("acl[2].fabricIndex", iter_0.GetValue().fabricIndex, 1U)); - VerifyOrReturn(CheckNoMoreListItems("acl", iter_0, 3)); + VerifyOrReturn(CheckNextListItemDecodes("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( + "acl[3].subjects.Value()", iter_3, 0)); + VerifyOrReturn(CheckValue("acl[3].subjects.Value()[0]", iter_3.GetValue(), 20ULL)); + VerifyOrReturn(CheckNextListItemDecodes( + "acl[3].subjects.Value()", iter_3, 1)); + VerifyOrReturn(CheckValue("acl[3].subjects.Value()[1]", iter_3.GetValue(), 21ULL)); + VerifyOrReturn(CheckNextListItemDecodes( + "acl[3].subjects.Value()", iter_3, 2)); + VerifyOrReturn(CheckValue("acl[3].subjects.Value()[2]", iter_3.GetValue(), 22ULL)); + VerifyOrReturn(CheckNextListItemDecodes( + "acl[3].subjects.Value()", iter_3, 3)); + VerifyOrReturn(CheckValue("acl[3].subjects.Value()[3]", iter_3.GetValue(), 23ULL)); + VerifyOrReturn(CheckNoMoreListItems("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( + "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( + "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( + "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("acl[3].targets.Value()", iter_3, 3)); + } + VerifyOrReturn(CheckValue("acl[3].fabricIndex", iter_0.GetValue().fabricIndex, 1U)); + VerifyOrReturn(CheckNoMoreListItems("acl", iter_0, 4)); } } break; @@ -1121,7 +1223,7 @@ class TestAccessControlClusterSuite : public TestCommand { uint16_t value; VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); - VerifyOrReturn(CheckConstraintMinValue("value", value, 3U)); + VerifyOrReturn(CheckConstraintMinValue("value", value, 4U)); } break; default: @@ -1159,7 +1261,7 @@ class TestAccessControlClusterSuite : public TestCommand { auto * listHolder_0 = - new ListHolder(3); + new ListHolder(4); listFreer.add(listHolder_0); listHolder_0->mList[0].privilege = @@ -1281,8 +1383,51 @@ class TestAccessControlClusterSuite : public TestCommand } listHolder_0->mList[2].fabricIndex = 0U; + listHolder_0->mList[3].privilege = + static_cast(3); + listHolder_0->mList[3].authMode = + static_cast(2); + listHolder_0->mList[3].subjects.SetNonNull(); + + { + auto * listHolder_3 = new ListHolder(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(listHolder_3->mList, 4); + } + listHolder_0->mList[3].targets.SetNonNull(); + + { + auto * listHolder_3 = new ListHolder(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(listHolder_3->mList, + 3); + } + listHolder_0->mList[3].fabricIndex = 0U; + value = chip::app::DataModel::List( - listHolder_0->mList, 3); + listHolder_0->mList, 4); } return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value, chip::NullOptional, chip::NullOptional); @@ -1718,7 +1863,7 @@ class TestAccessControlClusterSuite : public TestCommand { auto * listHolder_0 = - new ListHolder(4); + new ListHolder(5); listFreer.add(listHolder_0); listHolder_0->mList[0].privilege = @@ -1883,8 +2028,51 @@ class TestAccessControlClusterSuite : public TestCommand } listHolder_0->mList[3].fabricIndex = 0U; + listHolder_0->mList[4].privilege = + static_cast(3); + listHolder_0->mList[4].authMode = + static_cast(2); + listHolder_0->mList[4].subjects.SetNonNull(); + + { + auto * listHolder_3 = new ListHolder(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(listHolder_3->mList, 4); + } + listHolder_0->mList[4].targets.SetNonNull(); + + { + auto * listHolder_3 = new ListHolder(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(listHolder_3->mList, + 3); + } + listHolder_0->mList[4].fabricIndex = 0U; + value = chip::app::DataModel::List( - listHolder_0->mList, 4); + listHolder_0->mList, 5); } return WriteAttribute(kIdentityAlpha, GetEndpoint(0), AccessControl::Id, AccessControl::Attributes::Acl::Id, value, chip::NullOptional, chip::NullOptional); @@ -85368,7 +85556,7 @@ class TestGroupKeyManagementClusterSuite : public TestCommand { public: TestGroupKeyManagementClusterSuite(CredentialIssuerCommands * credsIssuerConfig) : - TestCommand("TestGroupKeyManagementCluster", 29, credsIssuerConfig) + TestCommand("TestGroupKeyManagementCluster", 31, credsIssuerConfig) { AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); AddArgument("cluster", &mCluster); @@ -85418,7 +85606,7 @@ class TestGroupKeyManagementClusterSuite : public TestCommand { uint16_t value; VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value))); - VerifyOrReturn(CheckConstraintMinValue("value", value, 2U)); + VerifyOrReturn(CheckConstraintMinValue("value", value, 4U)); } break; case 2: @@ -85480,13 +85668,17 @@ class TestGroupKeyManagementClusterSuite : public TestCommand VerifyOrReturn(CheckValue("groupKeyMap[0].fabricIndex", iter_0.GetValue().fabricIndex, 1U)); VerifyOrReturn(CheckNextListItemDecodes("groupKeyMap", iter_0, 1)); VerifyOrReturn(CheckValue("groupKeyMap[1].groupId", iter_0.GetValue().groupId, 258U)); - VerifyOrReturn(CheckValue("groupKeyMap[1].groupKeySetID", iter_0.GetValue().groupKeySetID, 417U)); + VerifyOrReturn(CheckValue("groupKeyMap[1].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U)); VerifyOrReturn(CheckValue("groupKeyMap[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U)); VerifyOrReturn(CheckNextListItemDecodes("groupKeyMap", iter_0, 2)); - VerifyOrReturn(CheckValue("groupKeyMap[2].groupId", iter_0.GetValue().groupId, 258U)); - VerifyOrReturn(CheckValue("groupKeyMap[2].groupKeySetID", iter_0.GetValue().groupKeySetID, 418U)); + 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(CheckNoMoreListItems("groupKeyMap", iter_0, 3)); + VerifyOrReturn(CheckNextListItemDecodes("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("groupKeyMap", iter_0, 4)); } } break; @@ -85509,6 +85701,24 @@ class TestGroupKeyManagementClusterSuite : public TestCommand } break; case 12: + 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 13: + 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 14: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::DecodableList< @@ -85545,17 +85755,29 @@ class TestGroupKeyManagementClusterSuite : public TestCommand 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(CheckNoMoreListItems("groupTable", iter_0, 2)); + VerifyOrReturn(CheckNextListItemDecodes("groupTable", iter_0, 2)); + VerifyOrReturn(CheckValue("groupTable[2].groupId", iter_0.GetValue().groupId, 259U)); + 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("groupTable", iter_0, 3)); + VerifyOrReturn(CheckValue("groupTable[3].groupId", iter_0.GetValue().groupId, 260U)); + 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("groupTable", iter_0, 4)); } } break; - case 13: + case 15: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; - case 14: + case 16: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND)); break; - case 15: + case 17: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::Clusters::GroupKeyManagement::Commands::KeySetReadResponse::DecodableType value; @@ -85576,7 +85798,7 @@ class TestGroupKeyManagementClusterSuite : public TestCommand CheckValue("groupKeySet.epochStartTime2.Value()", value.groupKeySet.epochStartTime2.Value(), 2110002ULL)); } break; - case 16: + case 18: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::Clusters::Groups::Commands::RemoveGroupResponse::DecodableType value; @@ -85585,7 +85807,7 @@ class TestGroupKeyManagementClusterSuite : public TestCommand VerifyOrReturn(CheckValue("groupID", value.groupID, 257U)); } break; - case 17: + case 19: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::DecodableList< @@ -85608,14 +85830,26 @@ class TestGroupKeyManagementClusterSuite : public TestCommand 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(CheckNoMoreListItems("groupTable", iter_0, 1)); + VerifyOrReturn(CheckNextListItemDecodes("groupTable", iter_0, 1)); + VerifyOrReturn(CheckValue("groupTable[1].groupId", iter_0.GetValue().groupId, 259U)); + 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("groupTable", iter_0, 2)); + VerifyOrReturn(CheckValue("groupTable[2].groupId", iter_0.GetValue().groupId, 260U)); + 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("groupTable", iter_0, 3)); } } break; - case 18: + case 20: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; - case 19: + case 21: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::DecodableList< @@ -85628,17 +85862,11 @@ class TestGroupKeyManagementClusterSuite : public TestCommand } } 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_NOT_FOUND)); - break; case 22: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; case 23: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND)); break; case 24: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); @@ -85647,6 +85875,12 @@ class TestGroupKeyManagementClusterSuite : public TestCommand 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)); + break; + case 28: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::DecodableList< @@ -85663,10 +85897,10 @@ class TestGroupKeyManagementClusterSuite : public TestCommand } } break; - case 27: + case 29: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; - case 28: + case 30: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); { chip::app::DataModel::DecodableList< @@ -85822,7 +86056,7 @@ class TestGroupKeyManagementClusterSuite : public TestCommand chip::app::DataModel::List value; { - auto * listHolder_0 = new ListHolder(4); + auto * listHolder_0 = new ListHolder(6); listFreer.add(listHolder_0); listHolder_0->mList[0].groupId = 257U; @@ -85841,8 +86075,16 @@ class TestGroupKeyManagementClusterSuite : public TestCommand 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; + value = chip::app::DataModel::List( - listHolder_0->mList, 4); + listHolder_0->mList, 6); } return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional); @@ -85853,7 +86095,7 @@ class TestGroupKeyManagementClusterSuite : public TestCommand chip::app::DataModel::List value; { - auto * listHolder_0 = new ListHolder(3); + auto * listHolder_0 = new ListHolder(4); listFreer.add(listHolder_0); listHolder_0->mList[0].groupId = 257U; @@ -85861,15 +86103,19 @@ class TestGroupKeyManagementClusterSuite : public TestCommand listHolder_0->mList[0].fabricIndex = 1U; listHolder_0->mList[1].groupId = 258U; - listHolder_0->mList[1].groupKeySetID = 417U; + listHolder_0->mList[1].groupKeySetID = 418U; listHolder_0->mList[1].fabricIndex = 1U; - listHolder_0->mList[2].groupId = 258U; - listHolder_0->mList[2].groupKeySetID = 418U; + 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( - listHolder_0->mList, 3); + listHolder_0->mList, 4); } return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional); @@ -85900,12 +86146,32 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } case 12: { - LogStep(12, "Read GroupTable"); + LogStep(12, "Add Group 3"); + ListFreer listFreer; + chip::app::Clusters::Groups::Commands::AddGroup::Type value; + value.groupID = 259U; + value.groupName = chip::Span("Group #3garbage: not in length on purpose", 8); + return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional + + ); + } + case 13: { + LogStep(13, "Add Group 4"); + ListFreer listFreer; + chip::app::Clusters::Groups::Commands::AddGroup::Type value; + value.groupID = 260U; + value.groupName = chip::Span("Group #4garbage: not in length on purpose", 8); + return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::AddGroup::Id, value, chip::NullOptional + + ); + } + case 14: { + LogStep(14, "Read GroupTable"); return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional); } - case 13: { - LogStep(13, "KeySet Remove 1"); + case 15: { + LogStep(15, "KeySet Remove 1"); ListFreer listFreer; chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value; value.groupKeySetID = 417U; @@ -85914,8 +86180,8 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 14: { - LogStep(14, "KeySet Read (removed)"); + case 16: { + LogStep(16, "KeySet Read (removed)"); ListFreer listFreer; chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value; value.groupKeySetID = 417U; @@ -85924,8 +86190,8 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 15: { - LogStep(15, "KeySet Read (not removed)"); + case 17: { + LogStep(17, "KeySet Read (not removed)"); ListFreer listFreer; chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value; value.groupKeySetID = 418U; @@ -85934,8 +86200,8 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 16: { - LogStep(16, "Remove Group 1"); + case 18: { + LogStep(18, "Remove Group 1"); ListFreer listFreer; chip::app::Clusters::Groups::Commands::RemoveGroup::Type value; value.groupID = 257U; @@ -85944,13 +86210,13 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 17: { - LogStep(17, "Read GroupTable 2"); + case 19: { + LogStep(19, "Read GroupTable 2"); return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional); } - case 18: { - LogStep(18, "Remove All"); + case 20: { + LogStep(20, "Remove All"); ListFreer listFreer; chip::app::Clusters::Groups::Commands::RemoveAllGroups::Type value; return SendCommand(kIdentityAlpha, GetEndpoint(1), Groups::Id, Groups::Commands::RemoveAllGroups::Id, value, @@ -85958,13 +86224,13 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 19: { - LogStep(19, "Read GroupTable 3"); + case 21: { + LogStep(21, "Read GroupTable 3"); return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional); } - case 20: { - LogStep(20, "KeySet Remove 2"); + case 22: { + LogStep(22, "KeySet Remove 2"); ListFreer listFreer; chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value; value.groupKeySetID = 418U; @@ -85973,8 +86239,8 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 21: { - LogStep(21, "KeySet Read (also removed)"); + case 23: { + LogStep(23, "KeySet Read (also removed)"); ListFreer listFreer; chip::app::Clusters::GroupKeyManagement::Commands::KeySetRead::Type value; value.groupKeySetID = 418U; @@ -85983,8 +86249,8 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 22: { - LogStep(22, "KeySet Write 1"); + case 24: { + LogStep(24, "KeySet Write 1"); ListFreer listFreer; chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value; @@ -86018,8 +86284,8 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 23: { - LogStep(23, "KeySet Write 2"); + case 25: { + LogStep(25, "KeySet Write 2"); ListFreer listFreer; chip::app::Clusters::GroupKeyManagement::Commands::KeySetWrite::Type value; @@ -86053,8 +86319,8 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 24: { - LogStep(24, "Map Group 1 and Group 2 to KeySet 1 and group 2 to KeySet 2"); + case 26: { + LogStep(26, "Map Group 1 and Group 2 to KeySet 1 and group 2 to KeySet 2"); ListFreer listFreer; chip::app::DataModel::List value; @@ -86080,8 +86346,8 @@ class TestGroupKeyManagementClusterSuite : public TestCommand return WriteAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Attributes::GroupKeyMap::Id, value, chip::NullOptional, chip::NullOptional); } - case 25: { - LogStep(25, "Remove keyset 1"); + case 27: { + LogStep(27, "Remove keyset 1"); ListFreer listFreer; chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value; value.groupKeySetID = 417U; @@ -86090,13 +86356,13 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 26: { - LogStep(26, "TH verifies GroupKeyMap entries for KeySet 1 have been removed"); + case 28: { + LogStep(28, "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 27: { - LogStep(27, "Remove keyset 2"); + case 29: { + LogStep(29, "Remove keyset 2"); ListFreer listFreer; chip::app::Clusters::GroupKeyManagement::Commands::KeySetRemove::Type value; value.groupKeySetID = 418U; @@ -86105,8 +86371,8 @@ class TestGroupKeyManagementClusterSuite : public TestCommand ); } - case 28: { - LogStep(28, "TH verifies GroupKeyMap entries for KeySet 2 have been removed"); + case 30: { + LogStep(30, "TH verifies GroupKeyMap entries for KeySet 2 have been removed"); return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id, GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional); } diff --git a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h index 198e2d05b1d2e6..67cb70140968e0 100644 --- a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h +++ b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h @@ -603,6 +603,38 @@ class TestAccessControlCluster : public TestCommandBridge { } ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:0U]; + temp_0[3] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init]; + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).privilege = [NSNumber numberWithUnsignedChar:3U]; + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).authMode = [NSNumber numberWithUnsignedChar:2U]; + { + NSMutableArray * temp_3 = [[NSMutableArray alloc] init]; + temp_3[0] = [NSNumber numberWithUnsignedLongLong:20ULL]; + temp_3[1] = [NSNumber numberWithUnsignedLongLong:21ULL]; + temp_3[2] = [NSNumber numberWithUnsignedLongLong:22ULL]; + temp_3[3] = [NSNumber numberWithUnsignedLongLong:23ULL]; + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).subjects = temp_3; + } + { + NSMutableArray * temp_3 = [[NSMutableArray alloc] init]; + temp_3[0] = [[MTRAccessControlClusterTarget alloc] init]; + ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil; + ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:24U]; + ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil; + + temp_3[1] = [[MTRAccessControlClusterTarget alloc] init]; + ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:25UL]; + ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil; + ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil; + + temp_3[2] = [[MTRAccessControlClusterTarget alloc] init]; + ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:26UL]; + ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:27U]; + ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil; + + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).targets = temp_3; + } + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).fabricIndex = [NSNumber numberWithUnsignedChar:0U]; + aclArgument = temp_0; } [cluster writeAttributeACLWithValue:aclArgument @@ -636,7 +668,7 @@ class TestAccessControlCluster : public TestCommandBridge { { id actualValue = value; - VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast(3))); + VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast(4))); VerifyOrReturn(CheckValue("Privilege", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U)); VerifyOrReturn(CheckValue("AuthMode", @@ -905,6 +937,99 @@ class TestAccessControlCluster : public TestCommandBridge { .deviceType)); VerifyOrReturn(CheckValue("FabricIndex", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).fabricIndex, 1U)); + VerifyOrReturn(CheckValue("Privilege", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).privilege, 3U)); + VerifyOrReturn(CheckValue("AuthMode", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).authMode, 2U)); + VerifyOrReturn(CheckValueNonNull( + "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects)); + VerifyOrReturn(CheckValue("Subjects", + [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects count], + static_cast(4))); + VerifyOrReturn(CheckValue("", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[0], 20ULL)); + VerifyOrReturn(CheckValue("", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[1], 21ULL)); + VerifyOrReturn(CheckValue("", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[2], 22ULL)); + VerifyOrReturn(CheckValue("", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[3], 23ULL)); + VerifyOrReturn(CheckValueNonNull( + "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).targets)); + VerifyOrReturn(CheckValue("Targets", + [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).targets count], + static_cast(3))); + VerifyOrReturn(CheckValueNull("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[0]) + .cluster)); + VerifyOrReturn(CheckValueNonNull("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[0]) + .endpoint)); + VerifyOrReturn(CheckValue("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[0]) + .endpoint, + 24U)); + VerifyOrReturn(CheckValueNull("DeviceType", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[0]) + .deviceType)); + VerifyOrReturn(CheckValueNonNull("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[1]) + .cluster)); + VerifyOrReturn(CheckValue("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[1]) + .cluster, + 25UL)); + VerifyOrReturn(CheckValueNull("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[1]) + .endpoint)); + VerifyOrReturn(CheckValueNull("DeviceType", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[1]) + .deviceType)); + VerifyOrReturn(CheckValueNonNull("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .cluster)); + VerifyOrReturn(CheckValue("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .cluster, + 26UL)); + VerifyOrReturn(CheckValueNonNull("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .endpoint)); + VerifyOrReturn(CheckValue("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .endpoint, + 27U)); + VerifyOrReturn(CheckValueNull("DeviceType", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .deviceType)); + VerifyOrReturn(CheckValue("FabricIndex", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).fabricIndex, 1U)); } NextTest(); @@ -1749,6 +1874,38 @@ class TestAccessControlCluster : public TestCommandBridge { } ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).fabricIndex = [NSNumber numberWithUnsignedChar:0U]; + temp_0[4] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init]; + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).privilege = [NSNumber numberWithUnsignedChar:3U]; + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).authMode = [NSNumber numberWithUnsignedChar:2U]; + { + NSMutableArray * temp_3 = [[NSMutableArray alloc] init]; + temp_3[0] = [NSNumber numberWithUnsignedLongLong:28ULL]; + temp_3[1] = [NSNumber numberWithUnsignedLongLong:29ULL]; + temp_3[2] = [NSNumber numberWithUnsignedLongLong:30ULL]; + temp_3[3] = [NSNumber numberWithUnsignedLongLong:31ULL]; + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).subjects = temp_3; + } + { + NSMutableArray * temp_3 = [[NSMutableArray alloc] init]; + temp_3[0] = [[MTRAccessControlClusterTarget alloc] init]; + ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil; + ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:32U]; + ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil; + + temp_3[1] = [[MTRAccessControlClusterTarget alloc] init]; + ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:33UL]; + ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil; + ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil; + + temp_3[2] = [[MTRAccessControlClusterTarget alloc] init]; + ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:34UL]; + ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:35U]; + ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil; + + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).targets = temp_3; + } + ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).fabricIndex = [NSNumber numberWithUnsignedChar:0U]; + aclArgument = temp_0; } [cluster writeAttributeACLWithValue:aclArgument @@ -1785,7 +1942,7 @@ class TestAccessControlCluster : public TestCommandBridge { { id actualValue = value; - VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast(3))); + VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast(4))); VerifyOrReturn(CheckValue("Privilege", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U)); VerifyOrReturn(CheckValue("AuthMode", @@ -2054,6 +2211,99 @@ class TestAccessControlCluster : public TestCommandBridge { .deviceType)); VerifyOrReturn(CheckValue("FabricIndex", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).fabricIndex, 1U)); + VerifyOrReturn(CheckValue("Privilege", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).privilege, 1U)); + VerifyOrReturn(CheckValue("AuthMode", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).authMode, 2U)); + VerifyOrReturn(CheckValueNonNull( + "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects)); + VerifyOrReturn(CheckValue("Subjects", + [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects count], + static_cast(4))); + VerifyOrReturn(CheckValue("", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[0], 20ULL)); + VerifyOrReturn(CheckValue("", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[1], 21ULL)); + VerifyOrReturn(CheckValue("", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[2], 22ULL)); + VerifyOrReturn(CheckValue("", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[3], 23ULL)); + VerifyOrReturn(CheckValueNonNull( + "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).targets)); + VerifyOrReturn(CheckValue("Targets", + [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).targets count], + static_cast(3))); + VerifyOrReturn(CheckValueNull("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[0]) + .cluster)); + VerifyOrReturn(CheckValueNonNull("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[0]) + .endpoint)); + VerifyOrReturn(CheckValue("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[0]) + .endpoint, + 24U)); + VerifyOrReturn(CheckValueNull("DeviceType", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[0]) + .deviceType)); + VerifyOrReturn(CheckValueNonNull("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[1]) + .cluster)); + VerifyOrReturn(CheckValue("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[1]) + .cluster, + 25UL)); + VerifyOrReturn(CheckValueNull("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[1]) + .endpoint)); + VerifyOrReturn(CheckValueNull("DeviceType", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[1]) + .deviceType)); + VerifyOrReturn(CheckValueNonNull("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .cluster)); + VerifyOrReturn(CheckValue("Cluster", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .cluster, + 26UL)); + VerifyOrReturn(CheckValueNonNull("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .endpoint)); + VerifyOrReturn(CheckValue("Endpoint", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .endpoint, + 27U)); + VerifyOrReturn(CheckValueNull("DeviceType", + ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *) + actualValue[3]) + .targets[2]) + .deviceType)); + VerifyOrReturn(CheckValue("FabricIndex", + ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).fabricIndex, 1U)); } NextTest(); @@ -2186,7 +2436,7 @@ class TestAccessControlCluster : public TestCommandBridge { VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0)); - VerifyOrReturn(CheckConstraintMinValue("accessControlEntriesPerFabric", [value unsignedShortValue], 3U)); + VerifyOrReturn(CheckConstraintMinValue("accessControlEntriesPerFabric", [value unsignedShortValue], 4U)); NextTest(); }]; @@ -132181,72 +132431,80 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { err = TestAddGroup2_11(); break; case 12: - ChipLogProgress(chipTool, " ***** Test Step 12 : Read GroupTable\n"); - err = TestReadGroupTable_12(); + ChipLogProgress(chipTool, " ***** Test Step 12 : Add Group 3\n"); + err = TestAddGroup3_12(); break; case 13: - ChipLogProgress(chipTool, " ***** Test Step 13 : KeySet Remove 1\n"); - err = TestKeySetRemove1_13(); + ChipLogProgress(chipTool, " ***** Test Step 13 : Add Group 4\n"); + err = TestAddGroup4_13(); break; case 14: - ChipLogProgress(chipTool, " ***** Test Step 14 : KeySet Read (removed)\n"); - err = TestKeySetReadRemoved_14(); + ChipLogProgress(chipTool, " ***** Test Step 14 : Read GroupTable\n"); + err = TestReadGroupTable_14(); break; case 15: - ChipLogProgress(chipTool, " ***** Test Step 15 : KeySet Read (not removed)\n"); - err = TestKeySetReadNotRemoved_15(); + ChipLogProgress(chipTool, " ***** Test Step 15 : KeySet Remove 1\n"); + err = TestKeySetRemove1_15(); break; case 16: - ChipLogProgress(chipTool, " ***** Test Step 16 : Remove Group 1\n"); - err = TestRemoveGroup1_16(); + ChipLogProgress(chipTool, " ***** Test Step 16 : KeySet Read (removed)\n"); + err = TestKeySetReadRemoved_16(); break; case 17: - ChipLogProgress(chipTool, " ***** Test Step 17 : Read GroupTable 2\n"); - err = TestReadGroupTable2_17(); + ChipLogProgress(chipTool, " ***** Test Step 17 : KeySet Read (not removed)\n"); + err = TestKeySetReadNotRemoved_17(); break; case 18: - ChipLogProgress(chipTool, " ***** Test Step 18 : Remove All\n"); - err = TestRemoveAll_18(); + ChipLogProgress(chipTool, " ***** Test Step 18 : Remove Group 1\n"); + err = TestRemoveGroup1_18(); break; case 19: - ChipLogProgress(chipTool, " ***** Test Step 19 : Read GroupTable 3\n"); - err = TestReadGroupTable3_19(); + ChipLogProgress(chipTool, " ***** Test Step 19 : Read GroupTable 2\n"); + err = TestReadGroupTable2_19(); break; case 20: - ChipLogProgress(chipTool, " ***** Test Step 20 : KeySet Remove 2\n"); - err = TestKeySetRemove2_20(); + ChipLogProgress(chipTool, " ***** Test Step 20 : Remove All\n"); + err = TestRemoveAll_20(); break; case 21: - ChipLogProgress(chipTool, " ***** Test Step 21 : KeySet Read (also removed)\n"); - err = TestKeySetReadAlsoRemoved_21(); + ChipLogProgress(chipTool, " ***** Test Step 21 : Read GroupTable 3\n"); + err = TestReadGroupTable3_21(); break; case 22: - ChipLogProgress(chipTool, " ***** Test Step 22 : KeySet Write 1\n"); - err = TestKeySetWrite1_22(); + ChipLogProgress(chipTool, " ***** Test Step 22 : KeySet Remove 2\n"); + err = TestKeySetRemove2_22(); break; case 23: - ChipLogProgress(chipTool, " ***** Test Step 23 : KeySet Write 2\n"); - err = TestKeySetWrite2_23(); + ChipLogProgress(chipTool, " ***** Test Step 23 : KeySet Read (also removed)\n"); + err = TestKeySetReadAlsoRemoved_23(); break; case 24: - ChipLogProgress(chipTool, " ***** Test Step 24 : Map Group 1 and Group 2 to KeySet 1 and group 2 to KeySet 2\n"); - err = TestMapGroup1AndGroup2ToKeySet1AndGroup2ToKeySet2_24(); + ChipLogProgress(chipTool, " ***** Test Step 24 : KeySet Write 1\n"); + err = TestKeySetWrite1_24(); break; case 25: - ChipLogProgress(chipTool, " ***** Test Step 25 : Remove keyset 1\n"); - err = TestRemoveKeyset1_25(); + ChipLogProgress(chipTool, " ***** Test Step 25 : KeySet Write 2\n"); + err = TestKeySetWrite2_25(); break; case 26: - ChipLogProgress(chipTool, " ***** Test Step 26 : TH verifies GroupKeyMap entries for KeySet 1 have been removed\n"); - err = TestThVerifiesGroupKeyMapEntriesForKeySet1HaveBeenRemoved_26(); + ChipLogProgress(chipTool, " ***** Test Step 26 : Map Group 1 and Group 2 to KeySet 1 and group 2 to KeySet 2\n"); + err = TestMapGroup1AndGroup2ToKeySet1AndGroup2ToKeySet2_26(); break; case 27: - ChipLogProgress(chipTool, " ***** Test Step 27 : Remove keyset 2\n"); - err = TestRemoveKeyset2_27(); + ChipLogProgress(chipTool, " ***** Test Step 27 : Remove keyset 1\n"); + err = TestRemoveKeyset1_27(); break; case 28: - ChipLogProgress(chipTool, " ***** Test Step 28 : TH verifies GroupKeyMap entries for KeySet 2 have been removed\n"); - err = TestThVerifiesGroupKeyMapEntriesForKeySet2HaveBeenRemoved_28(); + ChipLogProgress(chipTool, " ***** Test Step 28 : TH verifies GroupKeyMap entries for KeySet 1 have been removed\n"); + err = TestThVerifiesGroupKeyMapEntriesForKeySet1HaveBeenRemoved_28(); + break; + case 29: + ChipLogProgress(chipTool, " ***** Test Step 29 : Remove keyset 2\n"); + err = TestRemoveKeyset2_29(); + break; + case 30: + ChipLogProgress(chipTool, " ***** Test Step 30 : TH verifies GroupKeyMap entries for KeySet 2 have been removed\n"); + err = TestThVerifiesGroupKeyMapEntriesForKeySet2HaveBeenRemoved_30(); break; } @@ -132302,13 +132560,13 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; case 14: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND)); + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; case 15: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; case 16: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND)); break; case 17: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); @@ -132323,13 +132581,13 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); break; case 21: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND)); + 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)); + VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND)); break; case 24: VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); @@ -132346,6 +132604,12 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { 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)); + break; } // Go on to the next test. @@ -132359,7 +132623,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { private: std::atomic_uint16_t mTestIndex; - const uint16_t mTestCount = 29; + const uint16_t mTestCount = 31; chip::Optional mNodeId; chip::Optional mCluster; @@ -132389,7 +132653,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0)); - VerifyOrReturn(CheckConstraintMinValue("maxGroupsPerFabric", [value unsignedShortValue], 2U)); + VerifyOrReturn(CheckConstraintMinValue("maxGroupsPerFabric", [value unsignedShortValue], 4U)); NextTest(); }]; @@ -132623,6 +132887,16 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U]; ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).fabricIndex = [NSNumber numberWithUnsignedChar:1U]; + temp_0[4] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[4]).groupId = [NSNumber numberWithUnsignedShort:259U]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[4]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[4]).fabricIndex = [NSNumber numberWithUnsignedChar:1U]; + + temp_0[5] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[5]).groupId = [NSNumber numberWithUnsignedShort:259U]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[5]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[5]).fabricIndex = [NSNumber numberWithUnsignedChar:1U]; + groupKeyMapArgument = temp_0; } [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument @@ -132661,14 +132935,19 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { temp_0[1] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init]; ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupId = [NSNumber numberWithUnsignedShort:258U]; - ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U]; ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U]; temp_0[2] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init]; - ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupId = [NSNumber numberWithUnsignedShort:258U]; - ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupId = [NSNumber numberWithUnsignedShort:259U]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U]; ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:1U]; + temp_0[3] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).groupId = [NSNumber numberWithUnsignedShort:260U]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U]; + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).fabricIndex = [NSNumber numberWithUnsignedChar:1U]; + groupKeyMapArgument = temp_0; } [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument @@ -132705,7 +132984,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { { id actualValue = value; VerifyOrReturn( - CheckValue("GroupKeyMap", [actualValue count], static_cast(3))); + CheckValue("GroupKeyMap", [actualValue count], static_cast(4))); VerifyOrReturn(CheckValue("GroupId", ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).groupId, 257U)); VerifyOrReturn(CheckValue("GroupKeySetID", @@ -132718,18 +132997,26 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).groupId, 258U)); VerifyOrReturn(CheckValue("GroupKeySetID", ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).groupKeySetID, - 417U)); + 418U)); VerifyOrReturn(CheckValue("FabricIndex", ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).fabricIndex, 1U)); VerifyOrReturn(CheckValue("GroupId", - ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).groupId, 258U)); + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).groupId, 259U)); VerifyOrReturn(CheckValue("GroupKeySetID", ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).groupKeySetID, - 418U)); + 417U)); VerifyOrReturn(CheckValue("FabricIndex", ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).fabricIndex, 1U)); + VerifyOrReturn(CheckValue("GroupId", + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[3]).groupId, 260U)); + VerifyOrReturn(CheckValue("GroupKeySetID", + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[3]).groupKeySetID, + 418U)); + VerifyOrReturn(CheckValue("FabricIndex", + ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[3]).fabricIndex, + 1U)); } NextTest(); @@ -132804,7 +133091,73 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestReadGroupTable_12() + CHIP_ERROR TestAddGroup3_12() + { + + MTRBaseDevice * device = GetDevice("alpha"); + commissionerNodeId = mCommissionerNodeId.ValueOr(0); + __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue]; + VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE); + + __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init]; + params.groupID = [NSNumber numberWithUnsignedShort:259U]; + params.groupName = @"Group #3"; + [cluster addGroupWithParams:params + completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) { + NSLog(@"Add Group 3 Error: %@", err); + + VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0)); + + { + id actualValue = values.status; + VerifyOrReturn(CheckValue("Status", actualValue, 0U)); + } + + { + id actualValue = values.groupID; + VerifyOrReturn(CheckValue("GroupID", actualValue, 259U)); + } + + NextTest(); + }]; + + return CHIP_NO_ERROR; + } + + CHIP_ERROR TestAddGroup4_13() + { + + MTRBaseDevice * device = GetDevice("alpha"); + commissionerNodeId = mCommissionerNodeId.ValueOr(0); + __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue]; + VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE); + + __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init]; + params.groupID = [NSNumber numberWithUnsignedShort:260U]; + params.groupName = @"Group #4"; + [cluster addGroupWithParams:params + completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) { + NSLog(@"Add Group 4 Error: %@", err); + + VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0)); + + { + id actualValue = values.status; + VerifyOrReturn(CheckValue("Status", actualValue, 0U)); + } + + { + id actualValue = values.groupID; + VerifyOrReturn(CheckValue("GroupID", actualValue, 260U)); + } + + NextTest(); + }]; + + return CHIP_NO_ERROR; + } + + CHIP_ERROR TestReadGroupTable_14() { MTRBaseDevice * device = GetDevice("alpha"); @@ -132825,7 +133178,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { { id actualValue = value; - VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast(2))); + VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast(4))); VerifyOrReturn(CheckValue("GroupId", ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 257U)); VerifyOrReturn(CheckValue("Endpoints", @@ -132856,6 +133209,22 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { VerifyOrReturn(CheckValue("FabricIndex", ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).fabricIndex, 1U)); + VerifyOrReturn(CheckValue("GroupId", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).groupId, 259U)); + VerifyOrReturn(CheckValueAsString("GroupName", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).groupName, + @"Group #3")); + VerifyOrReturn(CheckValue("FabricIndex", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).fabricIndex, + 1U)); + VerifyOrReturn(CheckValue("GroupId", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[3]).groupId, 260U)); + VerifyOrReturn(CheckValueAsString("GroupName", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[3]).groupName, + @"Group #4")); + VerifyOrReturn(CheckValue("FabricIndex", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[3]).fabricIndex, + 1U)); } NextTest(); @@ -132864,7 +133233,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestKeySetRemove1_13() + CHIP_ERROR TestKeySetRemove1_15() { MTRBaseDevice * device = GetDevice("alpha"); @@ -132888,7 +133257,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestKeySetReadRemoved_14() + CHIP_ERROR TestKeySetReadRemoved_16() { MTRBaseDevice * device = GetDevice("alpha"); @@ -132916,7 +133285,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestKeySetReadNotRemoved_15() + CHIP_ERROR TestKeySetReadNotRemoved_17() { MTRBaseDevice * device = GetDevice("alpha"); @@ -132968,7 +133337,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestRemoveGroup1_16() + CHIP_ERROR TestRemoveGroup1_18() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133000,7 +133369,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestReadGroupTable2_17() + CHIP_ERROR TestReadGroupTable2_19() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133021,7 +133390,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { { id actualValue = value; - VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast(1))); + VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast(3))); VerifyOrReturn(CheckValue("GroupId", ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 258U)); VerifyOrReturn(CheckValue("Endpoints", @@ -133037,6 +133406,22 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { VerifyOrReturn(CheckValue("FabricIndex", ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).fabricIndex, 1U)); + VerifyOrReturn(CheckValue("GroupId", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).groupId, 259U)); + VerifyOrReturn(CheckValueAsString("GroupName", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).groupName, + @"Group #3")); + VerifyOrReturn(CheckValue("FabricIndex", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).fabricIndex, + 1U)); + VerifyOrReturn(CheckValue("GroupId", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).groupId, 260U)); + VerifyOrReturn(CheckValueAsString("GroupName", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).groupName, + @"Group #4")); + VerifyOrReturn(CheckValue("FabricIndex", + ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).fabricIndex, + 1U)); } NextTest(); @@ -133045,7 +133430,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestRemoveAll_18() + CHIP_ERROR TestRemoveAll_20() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133064,7 +133449,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestReadGroupTable3_19() + CHIP_ERROR TestReadGroupTable3_21() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133094,7 +133479,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestKeySetRemove2_20() + CHIP_ERROR TestKeySetRemove2_22() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133118,7 +133503,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestKeySetReadAlsoRemoved_21() + CHIP_ERROR TestKeySetReadAlsoRemoved_23() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133146,7 +133531,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestKeySetWrite1_22() + CHIP_ERROR TestKeySetWrite1_24() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133187,7 +133572,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestKeySetWrite2_23() + CHIP_ERROR TestKeySetWrite2_25() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133228,7 +133613,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestMapGroup1AndGroup2ToKeySet1AndGroup2ToKeySet2_24() + CHIP_ERROR TestMapGroup1AndGroup2ToKeySet1AndGroup2ToKeySet2_26() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133270,7 +133655,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestRemoveKeyset1_25() + CHIP_ERROR TestRemoveKeyset1_27() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133294,7 +133679,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestThVerifiesGroupKeyMapEntriesForKeySet1HaveBeenRemoved_26() + CHIP_ERROR TestThVerifiesGroupKeyMapEntriesForKeySet1HaveBeenRemoved_28() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133333,7 +133718,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestRemoveKeyset2_27() + CHIP_ERROR TestRemoveKeyset2_29() { MTRBaseDevice * device = GetDevice("alpha"); @@ -133357,7 +133742,7 @@ class TestGroupKeyManagementCluster : public TestCommandBridge { return CHIP_NO_ERROR; } - CHIP_ERROR TestThVerifiesGroupKeyMapEntriesForKeySet2HaveBeenRemoved_28() + CHIP_ERROR TestThVerifiesGroupKeyMapEntriesForKeySet2HaveBeenRemoved_30() { MTRBaseDevice * device = GetDevice("alpha");