Fix status code in CommandDataElement (#5792)
Summary of Changes:
-- Per IM spec, status element in IM is TLV Array instead of struct.
-- Remove extra clusterId in status element
-- Add IM status code unit test.
diff --git a/src/app/tests/TestMessageDef.cpp b/src/app/tests/TestMessageDef.cpp
index f0c4680..0b53c06 100644
--- a/src/app/tests/TestMessageDef.cpp
+++ b/src/app/tests/TestMessageDef.cpp
@@ -578,6 +578,35 @@
}
}
+void BuildCommandDataElementWithStatusCode(nlTestSuite * apSuite, CommandDataElement::Builder & aCommandDataElementBuilder)
+{
+ CommandPath::Builder commandPathBuilder = aCommandDataElementBuilder.CreateCommandPathBuilder();
+ NL_TEST_ASSERT(apSuite, aCommandDataElementBuilder.GetError() == CHIP_NO_ERROR);
+ BuildCommandPath(apSuite, commandPathBuilder);
+
+ StatusElement::Builder statusElementBuilder = aCommandDataElementBuilder.CreateStatusElementBuilder();
+ NL_TEST_ASSERT(apSuite, statusElementBuilder.GetError() == CHIP_NO_ERROR);
+ BuildStatusElement(apSuite, statusElementBuilder);
+
+ aCommandDataElementBuilder.EndOfCommandDataElement();
+ NL_TEST_ASSERT(apSuite, aCommandDataElementBuilder.GetError() == CHIP_NO_ERROR);
+}
+
+void ParseCommandDataElementWithStatusCode(nlTestSuite * apSuite, CommandDataElement::Parser & aCommandDataElementParser)
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ CommandPath::Parser commandPathParser;
+ StatusElement::Parser statusElementParser;
+ err = aCommandDataElementParser.CheckSchemaValidity();
+ NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+ err = aCommandDataElementParser.GetCommandPath(&commandPathParser);
+ NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+ err = aCommandDataElementParser.GetStatusElement(&statusElementParser);
+ NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+}
+
void BuildCommandList(nlTestSuite * apSuite, CommandList::Builder & aCommandListBuilder)
{
CommandDataElement::Builder commandDataElementBuilder = aCommandListBuilder.CreateCommandDataElementBuilder();
@@ -1077,6 +1106,30 @@
ParseCommandDataElement(apSuite, commandDataElementParser);
}
+void CommandDataElementWithStatusCodeTest(nlTestSuite * apSuite, void * apContext)
+{
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ CommandDataElement::Builder commandDataElementBuilder;
+ CommandDataElement::Parser commandDataElementParser;
+ chip::System::PacketBufferTLVWriter writer;
+ chip::System::PacketBufferTLVReader reader;
+ writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
+ commandDataElementBuilder.Init(&writer);
+ BuildCommandDataElementWithStatusCode(apSuite, commandDataElementBuilder);
+ chip::System::PacketBufferHandle buf;
+ err = writer.Finalize(&buf);
+ NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+ DebugPrettyPrint(buf);
+
+ reader.Init(std::move(buf));
+ err = reader.Next();
+ NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+ commandDataElementParser.Init(reader);
+ ParseCommandDataElementWithStatusCode(apSuite, commandDataElementParser);
+}
+
void CommandListTest(nlTestSuite * apSuite, void * apContext)
{
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -1226,6 +1279,7 @@
NL_TEST_DEF("AttributeDataListTest", AttributeDataListTest),
NL_TEST_DEF("AttributeDataVersionListTest", AttributeDataVersionListTest),
NL_TEST_DEF("CommandDataElementTest", CommandDataElementTest),
+ NL_TEST_DEF("CommandDataElementWithStatusCodeTest", CommandDataElementWithStatusCodeTest),
NL_TEST_DEF("CommandListTest", CommandListTest),
NL_TEST_DEF("ReportDataTest", ReportDataTest),
NL_TEST_DEF("InvokeCommandTest", InvokeCommandTest),