Skip to content

Commit 050353e

Browse files
jmartinez-silabssoares-sergiorestyled-commits
authored
[Groupcast] Fix an issue where replaceEndpoints field was allowed for a Sender only (project-chip#43362)
* Fix a issue where replaceEndpoints field was alloew for a Sender only * Update src/app/clusters/groupcast/GroupcastLogic.cpp Co-authored-by: Sergio Soares <sergiosoares@google.com> * Restyled by clang-format --------- Co-authored-by: Sergio Soares <sergiosoares@google.com> Co-authored-by: Restyled.io <commits@restyled.io>
1 parent e0d84be commit 050353e

2 files changed

Lines changed: 22 additions & 0 deletions

File tree

src/app/clusters/groupcast/GroupcastLogic.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ Status GroupcastLogic::JoinGroup(FabricIndex fabric_index, const Groupcast::Comm
145145
VerifyOrReturnError(mFeatures.Has(Groupcast::Feature::kListener), Status::ConstraintError);
146146
}
147147

148+
// ReplaceEndpoints can only be present if kListener feature is supported
149+
VerifyOrReturnError(!data.replaceEndpoints.HasValue() || mFeatures.Has(Groupcast::Feature::kListener), Status::ConstraintError);
150+
148151
// Check endpoints
149152
size_t endpoint_count = 0;
150153
err = data.endpoints.ComputeSize(&endpoint_count);

src/app/clusters/groupcast/tests/TestGroupcastCluster.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,25 @@ TEST_F(TestGroupcastCluster, TestJoinGroupCommand)
788788
EXPECT_EQ(result.status.value().GetStatusCode().GetStatus(), // NOLINT(bugprone-unchecked-optional-access)
789789
Protocols::InteractionModel::Status::Success);
790790

791+
// Join group: ReplaceEndpoints
792+
data.replaceEndpoints = MakeOptional(true);
793+
result = tester.Invoke(Commands::JoinGroup::Id, data);
794+
ASSERT_TRUE(result.status.has_value());
795+
EXPECT_EQ(result.status.value().GetStatusCode().GetStatus(), // NOLINT(bugprone-unchecked-optional-access)
796+
Protocols::InteractionModel::Status::ConstraintError);
797+
798+
data.replaceEndpoints = MakeOptional(false);
799+
result = tester.Invoke(Commands::JoinGroup::Id, data);
800+
ASSERT_TRUE(result.status.has_value());
801+
EXPECT_EQ(result.status.value().GetStatusCode().GetStatus(), // NOLINT(bugprone-unchecked-optional-access)
802+
Protocols::InteractionModel::Status::ConstraintError);
803+
804+
data.replaceEndpoints.ClearValue();
805+
result = tester.Invoke(Commands::JoinGroup::Id, data);
806+
ASSERT_TRUE(result.status.has_value());
807+
EXPECT_EQ(result.status.value().GetStatusCode().GetStatus(), // NOLINT(bugprone-unchecked-optional-access)
808+
Protocols::InteractionModel::Status::Success);
809+
791810
// Join group: Non-empty endpoints
792811
data.groupID = 3;
793812
data.endpoints = DataModel::List<const EndpointId>(kEndpoints, MATTER_ARRAY_SIZE(kEndpoints));

0 commit comments

Comments
 (0)