@@ -189,6 +189,49 @@ struct UseMockNodeConfig
189
189
~UseMockNodeConfig () { ResetMockNodeConfig (); }
190
190
};
191
191
192
+ struct TestReadRequest
193
+ {
194
+ ReadAttributeRequest request;
195
+
196
+ // encoded-used classes
197
+ EncodedReportIBs encodedIBs;
198
+ AttributeReportIBs::Builder reportBuilder;
199
+ std::unique_ptr<AttributeValueEncoder> encoder;
200
+
201
+ TestReadRequest (const Access::SubjectDescriptor & subject, const ConcreteAttributePath & path)
202
+ {
203
+ // operationFlags is 0 i.e. not internal
204
+ // readFlags is 0 i.e. not fabric filtered
205
+ // dataVersion is missing (no data version filtering)
206
+ request.subjectDescriptor = subject;
207
+ request.path = path;
208
+ }
209
+
210
+ std::unique_ptr<AttributeValueEncoder> StartEncoding (chip::app::InteractionModel::Model * model)
211
+ {
212
+ std::optional<ClusterInfo> info = model->GetClusterInfo (request.path );
213
+ if (!info.has_value ())
214
+ {
215
+ ChipLogError (Test, " Missing cluster information - no data version" );
216
+ return nullptr ;
217
+ }
218
+
219
+ DataVersion dataVersion = info->dataVersion ; // NOLINT(bugprone-unchecked-optional-access)
220
+
221
+ CHIP_ERROR err = encodedIBs.StartEncoding (reportBuilder);
222
+ if (err != CHIP_NO_ERROR)
223
+ {
224
+ ChipLogError (Test, " FAILURE starting encoding %" CHIP_ERROR_FORMAT, err.Format ());
225
+ return nullptr ;
226
+ }
227
+
228
+ // TODO: isFabricFiltered? EncodeState?
229
+ return std::make_unique<AttributeValueEncoder>(reportBuilder, request.subjectDescriptor .value (), request.path , dataVersion);
230
+ }
231
+
232
+ CHIP_ERROR FinishEncoding () { return encodedIBs.FinishEncoding (reportBuilder); }
233
+ };
234
+
192
235
} // namespace
193
236
194
237
TEST (TestCodegenModelViaMocks, IterateOverEndpoints)
@@ -414,25 +457,11 @@ TEST(TestCodegenModelViaMocks, EmberAttributeReadAclDeny)
414
457
chip::app::CodegenDataModel::Model model;
415
458
ScopedMockAccessControl accessControl;
416
459
417
- ReadAttributeRequest readRequest;
418
-
419
- // operationFlags is 0 i.e. not internal
420
- // readFlags is 0 i.e. not fabric filtered
421
- // dataVersion is missing (no data version filtering)
422
- readRequest.subjectDescriptor = kDenySubjectDescriptor ;
423
- readRequest.path = ConcreteAttributePath (kMockEndpoint1 , MockClusterId (1 ), MockAttributeId (10 ));
460
+ TestReadRequest testRequest (kDenySubjectDescriptor ,
461
+ ConcreteAttributePath (kMockEndpoint1 , MockClusterId (1 ), MockAttributeId (10 )));
462
+ std::unique_ptr<AttributeValueEncoder> encoder = testRequest.StartEncoding (&model);
424
463
425
- std::optional<ClusterInfo> info = model.GetClusterInfo (readRequest.path );
426
- ASSERT_TRUE (info.has_value ());
427
-
428
- DataVersion dataVersion = info->dataVersion ; // NOLINT(bugprone-unchecked-optional-access)
429
- EncodedReportIBs reportIBs;
430
- AttributeReportIBs::Builder builder;
431
- ASSERT_EQ (reportIBs.StartEncoding (builder), CHIP_NO_ERROR);
432
- AttributeValueEncoder encoder (builder, kDenySubjectDescriptor , readRequest.path , dataVersion);
433
-
434
- CHIP_ERROR err = model.ReadAttribute (readRequest, encoder);
435
- ASSERT_EQ (err, CHIP_ERROR_ACCESS_DENIED);
464
+ ASSERT_EQ (model.ReadAttribute (testRequest.request , *encoder), CHIP_ERROR_ACCESS_DENIED);
436
465
}
437
466
438
467
TEST (TestCodegenModelViaMocks, EmberAttributeInvalidRead)
@@ -441,25 +470,11 @@ TEST(TestCodegenModelViaMocks, EmberAttributeInvalidRead)
441
470
chip::app::CodegenDataModel::Model model;
442
471
ScopedMockAccessControl accessControl;
443
472
444
- ReadAttributeRequest readRequest;
445
-
446
- // operationFlags is 0 i.e. not internal
447
- // readFlags is 0 i.e. not fabric filtered
448
- // dataVersion is missing (no data version filtering)
449
- readRequest.subjectDescriptor = kAdminSubjectDescriptor ;
450
- readRequest.path = ConcreteAttributePath (kMockEndpoint1 , MockClusterId (1 ), MockAttributeId (10 ));
473
+ TestReadRequest testRequest (kAdminSubjectDescriptor ,
474
+ ConcreteAttributePath (kMockEndpoint1 , MockClusterId (1 ), MockAttributeId (10 )));
475
+ std::unique_ptr<AttributeValueEncoder> encoder = testRequest.StartEncoding (&model);
451
476
452
- std::optional<ClusterInfo> info = model.GetClusterInfo (readRequest.path );
453
- ASSERT_TRUE (info.has_value ());
454
-
455
- DataVersion dataVersion = info->dataVersion ; // NOLINT(bugprone-unchecked-optional-access)
456
- EncodedReportIBs reportIBs;
457
- AttributeReportIBs::Builder builder;
458
- ASSERT_EQ (reportIBs.StartEncoding (builder), CHIP_NO_ERROR);
459
- AttributeValueEncoder encoder (builder, kAdminSubjectDescriptor , readRequest.path , dataVersion);
460
-
461
- CHIP_ERROR err = model.ReadAttribute (readRequest, encoder);
462
- ASSERT_EQ (err, CHIP_IM_GLOBAL_STATUS (UnsupportedAttribute));
477
+ ASSERT_EQ (model.ReadAttribute (testRequest.request , *encoder), CHIP_IM_GLOBAL_STATUS (UnsupportedAttribute));
463
478
}
464
479
465
480
TEST (TestCodegenModelViaMocks, EmberAttributeRead)
@@ -468,51 +483,30 @@ TEST(TestCodegenModelViaMocks, EmberAttributeRead)
468
483
chip::app::CodegenDataModel::Model model;
469
484
ScopedMockAccessControl accessControl;
470
485
471
- // /////// INPUT ARGUMENTS SETUP
472
- ReadAttributeRequest readRequest;
473
-
474
- // operationFlags is 0 i.e. not internal
475
- // readFlags is 0 i.e. not fabric filtered
476
- // dataVersion is missing (no data version filtering)
477
- readRequest.subjectDescriptor = kAdminSubjectDescriptor ;
478
- readRequest.path = ConcreteAttributePath (kMockEndpoint3 , MockClusterId (2 ), MockAttributeId (3 ));
479
-
480
- std::optional<ClusterInfo> info = model.GetClusterInfo (readRequest.path );
481
- ASSERT_TRUE (info.has_value ());
482
-
483
- DataVersion dataVersion = info->dataVersion ; // NOLINT(bugprone-unchecked-optional-access)
486
+ TestReadRequest testRequest (kAdminSubjectDescriptor ,
487
+ ConcreteAttributePath (kMockEndpoint3 , MockClusterId (2 ), MockAttributeId (3 )));
484
488
485
- EncodedReportIBs reportIBs;
486
- AttributeReportIBs::Builder builder;
487
- ASSERT_EQ (reportIBs.StartEncoding (builder), CHIP_NO_ERROR);
488
- AttributeValueEncoder encoder (builder, kAdminSubjectDescriptor , readRequest.path , dataVersion);
489
+ std::unique_ptr<AttributeValueEncoder> encoder = testRequest.StartEncoding (&model);
489
490
490
- // /////// FAKE DATA SETUP
491
- uint8_t data[] = { 0x01 , 0x02 , 0x03 , 0x04 } ;
492
- chip::Test::SetEmberReadOutput (ByteSpan (data ));
491
+ // Ember encoding for integers is IDENTICAL to the in-memory representation for them
492
+ const uint32_t expected = 0x01020304 ;
493
+ chip::Test::SetEmberReadOutput (ByteSpan (reinterpret_cast < const uint8_t *>(&expected), sizeof (expected) ));
493
494
494
- CHIP_ERROR err = model.ReadAttribute (readRequest, encoder);
495
- ASSERT_EQ (err, CHIP_NO_ERROR);
495
+ ASSERT_EQ (model.ReadAttribute (testRequest.request , *encoder), CHIP_NO_ERROR);
496
496
497
- // /////// OVERHEAD: finish!
498
- ASSERT_EQ (reportIBs.FinishEncoding (builder), CHIP_NO_ERROR);
497
+ ASSERT_EQ (testRequest.FinishEncoding (), CHIP_NO_ERROR);
499
498
500
499
// ///// VALIDATE
501
500
std::vector<DecodedAttributeData> attribute_data;
502
- err = reportIBs.Decode (attribute_data);
503
- ASSERT_EQ (err, CHIP_NO_ERROR);
501
+ ASSERT_EQ (testRequest.encodedIBs .Decode (attribute_data), CHIP_NO_ERROR);
504
502
ASSERT_EQ (attribute_data.size (), 1u );
505
503
506
504
const DecodedAttributeData & encodedData = attribute_data[0 ];
507
- ASSERT_EQ (encodedData.attributePath , readRequest .path );
505
+ ASSERT_EQ (encodedData.attributePath , testRequest. request .path );
508
506
509
507
// data element should be a uint32 encoded as TLV
510
508
ASSERT_EQ (encodedData.dataReader .GetType (), TLV::kTLVType_UnsignedInteger );
511
- uint32_t expected;
512
- static_assert (sizeof (expected) == sizeof (data));
513
- memcpy (&expected, data, sizeof (expected));
514
509
uint32_t actual;
515
- err = encodedData.dataReader .Get (actual);
516
- ASSERT_EQ (CHIP_NO_ERROR, err);
510
+ ASSERT_EQ (encodedData.dataReader .Get (actual), CHIP_NO_ERROR);
517
511
ASSERT_EQ (actual, expected);
518
512
}
0 commit comments