Skip to content

Commit 6f1c553

Browse files
committed
Re-organize a bit ... boilerplate still seems A LOT
1 parent 3d50093 commit 6f1c553

File tree

3 files changed

+61
-43
lines changed

3 files changed

+61
-43
lines changed

src/app/codegen-interaction-model/tests/TestAttributeReportIBsEncoding.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -104,5 +104,27 @@ CHIP_ERROR DecodeAttributeReportIBs(ByteSpan data, std::vector<DecodedAttributeD
104104
return err;
105105
}
106106

107+
CHIP_ERROR EncodedReportIBs::StartEncoding(app::AttributeReportIBs::Builder & builder)
108+
{
109+
mEncodeWriter.Init(mTlvDataBuffer);
110+
ReturnErrorOnFailure(mEncodeWriter.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, mOuterStructureType));
111+
return builder.Init(&mEncodeWriter, to_underlying(ReportDataMessage::Tag::kAttributeReportIBs));
112+
}
113+
114+
CHIP_ERROR EncodedReportIBs::FinishEncoding(app::AttributeReportIBs::Builder & builder)
115+
{
116+
builder.EndOfContainer();
117+
ReturnErrorOnFailure(mEncodeWriter.EndContainer(mOuterStructureType));
118+
ReturnErrorOnFailure(mEncodeWriter.Finalize());
119+
120+
mDecodeSpan = ByteSpan(mTlvDataBuffer, mEncodeWriter.GetLengthWritten());
121+
return CHIP_NO_ERROR;
122+
}
123+
124+
CHIP_ERROR EncodedReportIBs::Decode(std::vector<DecodedAttributeData> & decoded_items)
125+
{
126+
return DecodeAttributeReportIBs(mDecodeSpan, decoded_items);
127+
}
128+
107129
} // namespace Test
108130
} // namespace chip

src/app/codegen-interaction-model/tests/TestAttributeReportIBsEncoding.h

+27
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@
1818

1919
#include <app/ConcreteAttributePath.h>
2020
#include <app/MessageDef/AttributeDataIB.h>
21+
#include <app/MessageDef/AttributeReportIBs.h>
22+
#include <app/MessageDef/ReportDataMessage.h>
2123
#include <lib/core/DataModelTypes.h>
2224
#include <lib/core/TLVReader.h>
25+
#include <lib/core/TLVWriter.h>
2326

2427
#include <vector>
2528

@@ -37,5 +40,29 @@ struct DecodedAttributeData
3740

3841
CHIP_ERROR DecodeAttributeReportIBs(ByteSpan data, std::vector<DecodedAttributeData> & decoded_items);
3942

43+
/// Maintains an internal TLV buffer for data encoding and
44+
/// decoding for ReportIBs.
45+
///
46+
/// Main use case is that explicit TLV layouts (structure and container starting) need to be
47+
/// prepared to have a proper AttributeReportIBs::Builder/parser to exist.
48+
class EncodedReportIBs
49+
{
50+
public:
51+
/// Initialize the report structures required to encode a
52+
CHIP_ERROR StartEncoding(app::AttributeReportIBs::Builder & builder);
53+
CHIP_ERROR FinishEncoding(app::AttributeReportIBs::Builder & builder);
54+
55+
/// Decode the embedded attribute report IBs.
56+
/// The TLVReaders inside data have a lifetime tied to the current object (its readers point
57+
/// inside the current object)
58+
CHIP_ERROR Decode(std::vector<DecodedAttributeData> & decoded_items);
59+
60+
private:
61+
uint8_t mTlvDataBuffer[1024];
62+
TLV::TLVType mOuterStructureType;
63+
TLV::TLVWriter mEncodeWriter;
64+
ByteSpan mDecodeSpan;
65+
};
66+
4067
} // namespace Test
4168
} // namespace chip

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

+12-43
Original file line numberDiff line numberDiff line change
@@ -426,18 +426,12 @@ TEST(TestCodegenModelViaMocks, EmberAttributeReadAclDeny)
426426
ASSERT_TRUE(info.has_value());
427427

428428
DataVersion dataVersion = info->dataVersion; // NOLINT(bugprone-unchecked-optional-access)
429-
430-
uint8_t tlvBuffer[1024];
431-
432-
TLV::TLVWriter tlvWriter;
433-
tlvWriter.Init(tlvBuffer);
434-
429+
EncodedReportIBs reportIBs;
435430
AttributeReportIBs::Builder builder;
436-
CHIP_ERROR err = builder.Init(&tlvWriter);
437-
ASSERT_EQ(err, CHIP_NO_ERROR);
438-
AttributeValueEncoder encoder(builder, kAdminSubjectDescriptor, readRequest.path, dataVersion);
431+
ASSERT_EQ(reportIBs.StartEncoding(builder), CHIP_NO_ERROR);
432+
AttributeValueEncoder encoder(builder, kDenySubjectDescriptor, readRequest.path, dataVersion);
439433

440-
err = model.ReadAttribute(readRequest, encoder);
434+
CHIP_ERROR err = model.ReadAttribute(readRequest, encoder);
441435
ASSERT_EQ(err, CHIP_ERROR_ACCESS_DENIED);
442436
}
443437

@@ -459,21 +453,13 @@ TEST(TestCodegenModelViaMocks, EmberAttributeInvalidRead)
459453
ASSERT_TRUE(info.has_value());
460454

461455
DataVersion dataVersion = info->dataVersion; // NOLINT(bugprone-unchecked-optional-access)
462-
463-
uint8_t tlvBuffer[1024];
464-
465-
TLV::TLVWriter tlvWriter;
466-
tlvWriter.Init(tlvBuffer);
467-
456+
EncodedReportIBs reportIBs;
468457
AttributeReportIBs::Builder builder;
469-
CHIP_ERROR err = builder.Init(&tlvWriter);
470-
ASSERT_EQ(err, CHIP_NO_ERROR);
458+
ASSERT_EQ(reportIBs.StartEncoding(builder), CHIP_NO_ERROR);
471459
AttributeValueEncoder encoder(builder, kAdminSubjectDescriptor, readRequest.path, dataVersion);
472460

473-
err = model.ReadAttribute(readRequest, encoder);
461+
CHIP_ERROR err = model.ReadAttribute(readRequest, encoder);
474462
ASSERT_EQ(err, CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute));
475-
476-
// TODO: value validation here?
477463
}
478464

479465
TEST(TestCodegenModelViaMocks, EmberAttributeRead)
@@ -495,39 +481,22 @@ TEST(TestCodegenModelViaMocks, EmberAttributeRead)
495481

496482
DataVersion dataVersion = info->dataVersion; // NOLINT(bugprone-unchecked-optional-access)
497483

498-
uint8_t tlvBuffer[1024];
499-
500-
TLV::TLVWriter tlvWriter;
501-
tlvWriter.Init(tlvBuffer);
502-
CHIP_ERROR err = CHIP_NO_ERROR;
503-
504-
TLV::TLVType outer;
505-
err = tlvWriter.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, outer);
506-
ASSERT_EQ(err, CHIP_NO_ERROR);
507-
484+
EncodedReportIBs reportIBs;
508485
AttributeReportIBs::Builder builder;
509-
510-
err = builder.Init(&tlvWriter, to_underlying(ReportDataMessage::Tag::kAttributeReportIBs));
511-
ASSERT_EQ(err, CHIP_NO_ERROR);
486+
ASSERT_EQ(reportIBs.StartEncoding(builder), CHIP_NO_ERROR);
512487
AttributeValueEncoder encoder(builder, kAdminSubjectDescriptor, readRequest.path, dataVersion);
513488

514489
uint8_t data[] = { 0x01, 0x02, 0x03, 0x04 };
515490
chip::Test::SetEmberReadOutput(ByteSpan(data));
516491

517-
err = model.ReadAttribute(readRequest, encoder);
492+
CHIP_ERROR err = model.ReadAttribute(readRequest, encoder);
518493
ASSERT_EQ(err, CHIP_NO_ERROR);
519494

520-
builder.EndOfContainer();
521-
522-
err = tlvWriter.EndContainer(outer);
523-
ASSERT_EQ(err, CHIP_NO_ERROR);
524-
525-
err = tlvWriter.Finalize();
526-
ASSERT_EQ(err, CHIP_NO_ERROR);
495+
ASSERT_EQ(reportIBs.FinishEncoding(builder), CHIP_NO_ERROR);
527496

528497
//// VALIDATE
529498
std::vector<DecodedAttributeData> attribute_data;
530-
err = DecodeAttributeReportIBs(ByteSpan(tlvBuffer, tlvWriter.GetLengthWritten()), attribute_data);
499+
err = reportIBs.Decode(attribute_data);
531500
ASSERT_EQ(err, CHIP_NO_ERROR);
532501
ASSERT_EQ(attribute_data.size(), 1u);
533502

0 commit comments

Comments
 (0)