Skip to content

Commit e5acdc9

Browse files
Fix logic error in codegen data model: write privileges should only exist if attribute is NOT read-only (#34161)
* Tests update * Restyle * Make clang-tidy happy * Restyle and fix one more clang-tidy error --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com>
1 parent d31cb54 commit e5acdc9

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

src/app/codegen-data-model/CodegenDataModel.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ void LoadAttributeInfo(const ConcreteAttributePath & path, const EmberAfAttribut
115115
InteractionModel::AttributeInfo * info)
116116
{
117117
info->readPrivilege = RequiredPrivilege::ForReadAttribute(path);
118-
if (attribute.IsReadOnly())
118+
if (!attribute.IsReadOnly())
119119
{
120120
info->writePrivilege = RequiredPrivilege::ForWriteAttribute(path);
121121
}

src/app/codegen-data-model/tests/TestCodegenModelViaMocks.cpp

+21-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ constexpr NodeId kTestNodeId = 0xFFFF'1234'ABCD'4321;
5959

6060
constexpr EndpointId kEndpointIdThatIsMissing = kMockEndpointMin - 1;
6161

62+
constexpr AttributeId kReadOnlyAttributeId = 0x5001;
63+
6264
static_assert(kEndpointIdThatIsMissing != kInvalidEndpointId);
6365
static_assert(kEndpointIdThatIsMissing != kMockEndpoint1);
6466
static_assert(kEndpointIdThatIsMissing != kMockEndpoint2);
@@ -190,6 +192,11 @@ const MockNodeConfig gTestNodeConfig({
190192
}),
191193
MockClusterConfig(MockClusterId(3), {
192194
ClusterRevision::Id, FeatureMap::Id,
195+
MockAttributeConfig(
196+
kReadOnlyAttributeId,
197+
ZCL_INT32U_ATTRIBUTE_TYPE,
198+
ATTRIBUTE_MASK_NULLABLE // NOTE: explicltly NOT ATTRIBUTE_MASK_WRITABLE
199+
)
193200
}),
194201
MockClusterConfig(MockClusterId(4), {
195202
ClusterRevision::Id,
@@ -809,9 +816,22 @@ TEST(TestCodegenModelViaMocks, GetAttributeInfo)
809816
ASSERT_TRUE(info.has_value());
810817
EXPECT_FALSE(info->flags.Has(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
811818

819+
// Mocks always set everything as R/W with administrative privileges
820+
EXPECT_EQ(info->readPrivilege, chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
821+
EXPECT_EQ(info->writePrivilege, chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
822+
812823
info = model.GetAttributeInfo(ConcreteAttributePath(kMockEndpoint2, MockClusterId(2), MockAttributeId(2)));
813824
ASSERT_TRUE(info.has_value());
814-
EXPECT_TRUE(info->flags.Has(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
825+
EXPECT_TRUE(info->flags.Has(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
826+
EXPECT_EQ(info->readPrivilege, chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
827+
EXPECT_EQ(info->writePrivilege, chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
828+
829+
// test a read-only attribute, which will not have a write privilege
830+
info = model.GetAttributeInfo(ConcreteAttributePath(kMockEndpoint3, MockClusterId(3), kReadOnlyAttributeId));
831+
ASSERT_TRUE(info.has_value());
832+
EXPECT_FALSE(info->flags.Has(AttributeQualityFlags::kListAttribute)); // NOLINT(bugprone-unchecked-optional-access)
833+
EXPECT_EQ(info->readPrivilege, chip::Access::Privilege::kAdminister); // NOLINT(bugprone-unchecked-optional-access)
834+
EXPECT_FALSE(info->writePrivilege.has_value()); // NOLINT(bugprone-unchecked-optional-access)
815835
}
816836

817837
// global attributes are EXPLICITLY not supported

0 commit comments

Comments
 (0)