Use a copy constructor everytime we initialize a DataModel::AttributeEntry's instance with an assignment (#39302)
* Making DataModel::AttributeEntry immutable, adding copy constructor calls.
* Restyled by clang-format
---------
Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/src/app/WriteHandler.cpp b/src/app/WriteHandler.cpp
index 6dad635..23708df 100644
--- a/src/app/WriteHandler.cpp
+++ b/src/app/WriteHandler.cpp
@@ -774,10 +774,9 @@
//
// Open issue that needs fixing: https://github.com/project-chip/connectedhomeip/issues/33735
- std::optional<DataModel::AttributeEntry> attributeEntry;
DataModel::AttributeFinder finder(mDataModelProvider);
- attributeEntry = finder.Find(aPath);
+ std::optional<DataModel::AttributeEntry> attributeEntry = finder.Find(aPath);
// if path is not valid, return a spec-compliant return code.
if (!attributeEntry.has_value())
diff --git a/src/app/data-model-provider/MetadataTypes.h b/src/app/data-model-provider/MetadataTypes.h
index b7468ec..5a7625c 100644
--- a/src/app/data-model-provider/MetadataTypes.h
+++ b/src/app/data-model-provider/MetadataTypes.h
@@ -112,7 +112,7 @@
struct AttributeEntry
{
- AttributeId attributeId;
+ const AttributeId attributeId;
// Constructor
diff --git a/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp b/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp
index efac211..ac09f9d 100644
--- a/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp
+++ b/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp
@@ -1193,26 +1193,27 @@
ASSERT_FALSE(finder.Find(ConcreteAttributePath(kMockEndpoint1, MockClusterId(1), MockAttributeId(10))).has_value());
// valid info
- std::optional<AttributeEntry> info = finder.Find(ConcreteAttributePath(kMockEndpoint1, MockClusterId(1), FeatureMap::Id));
- ASSERT_TRUE(info.has_value());
- EXPECT_FALSE(info->HasFlags(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
+ std::optional<AttributeEntry> info1 = finder.Find(ConcreteAttributePath(kMockEndpoint1, MockClusterId(1), FeatureMap::Id));
+ ASSERT_TRUE(info1.has_value());
+ EXPECT_FALSE(info1->HasFlags(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
// Mocks always set everything as R/W with administrative privileges
- EXPECT_EQ(info->GetReadPrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
- EXPECT_EQ(info->GetWritePrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
+ EXPECT_EQ(info1->GetReadPrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
+ EXPECT_EQ(info1->GetWritePrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
- info = finder.Find(ConcreteAttributePath(kMockEndpoint2, MockClusterId(2), MockAttributeId(2)));
- ASSERT_TRUE(info.has_value());
- EXPECT_TRUE(info->HasFlags(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
- EXPECT_EQ(info->GetReadPrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
- EXPECT_EQ(info->GetWritePrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
+ std::optional<AttributeEntry> info2 = finder.Find(ConcreteAttributePath(kMockEndpoint2, MockClusterId(2), MockAttributeId(2)));
+ ASSERT_TRUE(info2.has_value());
+ EXPECT_TRUE(info2->HasFlags(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
+ EXPECT_EQ(info2->GetReadPrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
+ EXPECT_EQ(info2->GetWritePrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
// test a read-only attribute, which will not have a write privilege
- info = finder.Find(ConcreteAttributePath(kMockEndpoint3, MockClusterId(3), kReadOnlyAttributeId));
- ASSERT_TRUE(info.has_value());
- EXPECT_FALSE(info->HasFlags(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
- EXPECT_EQ(info->GetReadPrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
- EXPECT_FALSE(info->GetWritePrivilege().has_value()); // NOLINT(bugprone-unchecked-optional-access)
+ std::optional<AttributeEntry> info3 =
+ finder.Find(ConcreteAttributePath(kMockEndpoint3, MockClusterId(3), kReadOnlyAttributeId));
+ ASSERT_TRUE(info3.has_value());
+ EXPECT_FALSE(info3->HasFlags(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
+ EXPECT_EQ(info3->GetReadPrivilege(), chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
+ EXPECT_FALSE(info3->GetWritePrivilege().has_value()); // NOLINT(bugprone-unchecked-optional-access)
}
// global attributes are EXPLICITLY supported
@@ -1223,17 +1224,18 @@
AttributeFinder finder(&model);
- std::optional<AttributeEntry> info = finder.Find(
+ std::optional<AttributeEntry> info1 = finder.Find(
ConcreteAttributePath(kMockEndpoint1, MockClusterId(1), Clusters::Globals::Attributes::GeneratedCommandList::Id));
- ASSERT_TRUE(info.has_value());
+ ASSERT_TRUE(info1.has_value());
- info = finder.Find(ConcreteAttributePath(kMockEndpoint1, MockClusterId(1), Clusters::Globals::Attributes::AttributeList::Id));
- ASSERT_TRUE(info.has_value());
+ std::optional<AttributeEntry> info2 =
+ finder.Find(ConcreteAttributePath(kMockEndpoint1, MockClusterId(1), Clusters::Globals::Attributes::AttributeList::Id));
+ ASSERT_TRUE(info2.has_value());
- info = finder.Find(
+ std::optional<AttributeEntry> info3 = finder.Find(
ConcreteAttributePath(kMockEndpoint1, MockClusterId(1), Clusters::Globals::Attributes::AcceptedCommandList::Id));
- ASSERT_TRUE(info.has_value());
+ ASSERT_TRUE(info3.has_value());
}
TEST_F(TestCodegenModelViaMocks, IterateOverAcceptedCommands)