Refresh IM Invoke encoding with latest spec (#11169)

diff --git a/src/app/tests/TestMessageDef.cpp b/src/app/tests/TestMessageDef.cpp
index bd160f8..2b2e68a 100644
--- a/src/app/tests/TestMessageDef.cpp
+++ b/src/app/tests/TestMessageDef.cpp
@@ -23,10 +23,9 @@
  */
 
 #include <app/AppBuildConfig.h>
-#include <app/MessageDef/CommandDataIB.h>
-#include <app/MessageDef/CommandList.h>
 #include <app/MessageDef/EventFilters.h>
-#include <app/MessageDef/InvokeCommand.h>
+#include <app/MessageDef/InvokeRequestMessage.h>
+#include <app/MessageDef/InvokeResponseMessage.h>
 #include <app/MessageDef/ReadRequestMessage.h>
 #include <app/MessageDef/ReportDataMessage.h>
 #include <app/MessageDef/SubscribeRequestMessage.h>
@@ -246,7 +245,7 @@
 
 void BuildCommandPath(nlTestSuite * apSuite, CommandPathIB::Builder & aCommandPathBuilder)
 {
-    aCommandPathBuilder.EndpointId(1).ClusterId(3).CommandId(4).EndOfCommandPath();
+    aCommandPathBuilder.EndpointId(1).ClusterId(3).CommandId(4).EndOfCommandPathIB();
     NL_TEST_ASSERT(apSuite, aCommandPathBuilder.GetError() == CHIP_NO_ERROR);
 }
 
@@ -592,7 +591,7 @@
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
 
-    CommandPathIB::Builder commandPathBuilder = aCommandDataIBBuilder.CreateCommandPathBuilder();
+    CommandPathIB::Builder commandPathBuilder = aCommandDataIBBuilder.CreatePath();
     NL_TEST_ASSERT(apSuite, aCommandDataIBBuilder.GetError() == CHIP_NO_ERROR);
     BuildCommandPath(apSuite, commandPathBuilder);
 
@@ -600,7 +599,8 @@
     {
         chip::TLV::TLVWriter * pWriter = aCommandDataIBBuilder.GetWriter();
         chip::TLV::TLVType dummyType   = chip::TLV::kTLVType_NotSpecified;
-        err = pWriter->StartContainer(chip::TLV::ContextTag(CommandDataIB::kCsTag_Data), chip::TLV::kTLVType_Structure, dummyType);
+        err = pWriter->StartContainer(chip::TLV::ContextTag(chip::to_underlying(CommandDataIB::Tag::kData)),
+                                      chip::TLV::kTLVType_Structure, dummyType);
         NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
 
         err = pWriter->PutBoolean(chip::TLV::ContextTag(1), true);
@@ -622,7 +622,7 @@
     err = aCommandDataIBParser.CheckSchemaValidity();
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
 #endif
-    err = aCommandDataIBParser.GetCommandPath(&commandPathParser);
+    err = aCommandDataIBParser.GetPath(&commandPathParser);
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
 
     {
@@ -644,55 +644,212 @@
     }
 }
 
-void BuildCommandDataIBWithStatusCode(nlTestSuite * apSuite, CommandDataIB::Builder & aCommandDataIBBuilder)
+void BuildCommandStatusIB(nlTestSuite * apSuite, CommandStatusIB::Builder & aCommandStatusIBBuilder)
 {
-    CommandPathIB::Builder commandPathBuilder = aCommandDataIBBuilder.CreateCommandPathBuilder();
-    NL_TEST_ASSERT(apSuite, aCommandDataIBBuilder.GetError() == CHIP_NO_ERROR);
+    CommandPathIB::Builder commandPathBuilder = aCommandStatusIBBuilder.CreatePath();
+    NL_TEST_ASSERT(apSuite, aCommandStatusIBBuilder.GetError() == CHIP_NO_ERROR);
     BuildCommandPath(apSuite, commandPathBuilder);
 
-    StatusIB::Builder statusIBBuilder = aCommandDataIBBuilder.CreateStatusIBBuilder();
+    StatusIB::Builder statusIBBuilder = aCommandStatusIBBuilder.CreateErrorStatus();
     NL_TEST_ASSERT(apSuite, statusIBBuilder.GetError() == CHIP_NO_ERROR);
     BuildStatusIB(apSuite, statusIBBuilder);
 
-    aCommandDataIBBuilder.EndOfCommandDataIB();
-    NL_TEST_ASSERT(apSuite, aCommandDataIBBuilder.GetError() == CHIP_NO_ERROR);
+    aCommandStatusIBBuilder.EndOfCommandStatusIB();
+    NL_TEST_ASSERT(apSuite, aCommandStatusIBBuilder.GetError() == CHIP_NO_ERROR);
 }
 
-void ParseCommandDataIBWithStatusCode(nlTestSuite * apSuite, CommandDataIB::Parser & aCommandDataIBParser)
+void ParseCommandStatusIB(nlTestSuite * apSuite, CommandStatusIB::Parser & aCommandStatusIBParser)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
     CommandPathIB::Parser commandPathParser;
-    StatusIB::Parser StatusIBParser;
+    StatusIB::Parser statusParser;
 #if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
-    err = aCommandDataIBParser.CheckSchemaValidity();
+    err = aCommandStatusIBParser.CheckSchemaValidity();
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
 #endif
-    err = aCommandDataIBParser.GetCommandPath(&commandPathParser);
+    err = aCommandStatusIBParser.GetPath(&commandPathParser);
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
 
-    err = aCommandDataIBParser.GetStatusIB(&StatusIBParser);
+    err = aCommandStatusIBParser.GetErrorStatus(&statusParser);
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
 }
 
-void BuildCommandList(nlTestSuite * apSuite, CommandList::Builder & aCommandListBuilder)
+void BuildWrongInvokeResponseIB(nlTestSuite * apSuite, InvokeResponseIB::Builder & aInvokeResponseIBBuilder)
 {
-    CommandDataIB::Builder commandDataIBBuilder = aCommandListBuilder.CreateCommandDataIBBuilder();
-    NL_TEST_ASSERT(apSuite, aCommandListBuilder.GetError() == CHIP_NO_ERROR);
-    BuildCommandDataIB(apSuite, commandDataIBBuilder);
-
-    aCommandListBuilder.EndOfCommandList();
-    NL_TEST_ASSERT(apSuite, aCommandListBuilder.GetError() == CHIP_NO_ERROR);
+    CommandDataIB::Builder commandDataBuilder = aInvokeResponseIBBuilder.CreateCommand();
+    NL_TEST_ASSERT(apSuite, aInvokeResponseIBBuilder.GetError() == CHIP_NO_ERROR);
+    BuildCommandDataIB(apSuite, commandDataBuilder);
+    CommandStatusIB::Builder commandStatusBuilder = aInvokeResponseIBBuilder.CreateStatus();
+    NL_TEST_ASSERT(apSuite, aInvokeResponseIBBuilder.GetError() == CHIP_NO_ERROR);
+    BuildCommandStatusIB(apSuite, commandStatusBuilder);
+    aInvokeResponseIBBuilder.EndOfInvokeResponseIB();
+    NL_TEST_ASSERT(apSuite, aInvokeResponseIBBuilder.GetError() == CHIP_NO_ERROR);
 }
 
-void ParseCommandList(nlTestSuite * apSuite, chip::TLV::TLVReader & aReader)
+void BuildInvokeResponseIBWithCommandDataIB(nlTestSuite * apSuite, InvokeResponseIB::Builder & aInvokeResponseIBBuilder)
+{
+    CommandDataIB::Builder commandDataBuilder = aInvokeResponseIBBuilder.CreateCommand();
+    NL_TEST_ASSERT(apSuite, aInvokeResponseIBBuilder.GetError() == CHIP_NO_ERROR);
+    BuildCommandDataIB(apSuite, commandDataBuilder);
+    aInvokeResponseIBBuilder.EndOfInvokeResponseIB();
+    NL_TEST_ASSERT(apSuite, aInvokeResponseIBBuilder.GetError() == CHIP_NO_ERROR);
+}
+
+void BuildInvokeResponseIBWithCommandStatusIB(nlTestSuite * apSuite, InvokeResponseIB::Builder & aInvokeResponseIBBuilder)
+{
+    CommandStatusIB::Builder commandStatusBuilder = aInvokeResponseIBBuilder.CreateStatus();
+    NL_TEST_ASSERT(apSuite, aInvokeResponseIBBuilder.GetError() == CHIP_NO_ERROR);
+    BuildCommandStatusIB(apSuite, commandStatusBuilder);
+    aInvokeResponseIBBuilder.EndOfInvokeResponseIB();
+    NL_TEST_ASSERT(apSuite, aInvokeResponseIBBuilder.GetError() == CHIP_NO_ERROR);
+}
+
+void ParseInvokeResponseIBWithCommandDataIB(nlTestSuite * apSuite, InvokeResponseIB::Parser & aInvokeResponseIBParser)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
-    CommandList::Parser commandListParser;
-    err = commandListParser.Init(aReader);
+    CommandDataIB::Parser commandDataParser;
+    CommandStatusIB::Parser statusIBParser;
+#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
+    err = aInvokeResponseIBParser.CheckSchemaValidity();
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+#endif
+    err = aInvokeResponseIBParser.GetCommand(&commandDataParser);
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+}
+
+void ParseInvokeResponseIBWithCommandStatusIB(nlTestSuite * apSuite, InvokeResponseIB::Parser & aInvokeResponseIBParser)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    CommandDataIB::Parser commandDataParser;
+    CommandStatusIB::Parser statusIBParser;
+#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
+    err = aInvokeResponseIBParser.CheckSchemaValidity();
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+#endif
+    err = aInvokeResponseIBParser.GetStatus(&statusIBParser);
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+}
+
+void ParseWrongInvokeResponseIB(nlTestSuite * apSuite, InvokeResponseIB::Parser & aInvokeResponseIBParser)
+{
+    CommandDataIB::Parser commandDataParser;
+    CommandStatusIB::Parser statusIBParser;
+#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
+    CHIP_ERROR err = aInvokeResponseIBParser.CheckSchemaValidity();
+    NL_TEST_ASSERT(apSuite, err != CHIP_NO_ERROR);
+#endif
+}
+
+void BuildInvokeRequests(nlTestSuite * apSuite, InvokeRequests::Builder & aInvokeRequestsBuilder)
+{
+    CommandDataIB::Builder aCommandDataIBBuilder = aInvokeRequestsBuilder.CreateCommandData();
+    NL_TEST_ASSERT(apSuite, aInvokeRequestsBuilder.GetError() == CHIP_NO_ERROR);
+    BuildCommandDataIB(apSuite, aCommandDataIBBuilder);
+
+    aInvokeRequestsBuilder.EndOfInvokeRequests();
+    NL_TEST_ASSERT(apSuite, aInvokeRequestsBuilder.GetError() == CHIP_NO_ERROR);
+}
+
+void ParseInvokeRequests(nlTestSuite * apSuite, chip::TLV::TLVReader & aReader)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    InvokeRequests::Parser invokeRequestsParser;
+    err = invokeRequestsParser.Init(aReader);
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
 
 #if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
-    err = commandListParser.CheckSchemaValidity();
+    err = invokeRequestsParser.CheckSchemaValidity();
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+#endif
+}
+
+void BuildInvokeResponses(nlTestSuite * apSuite, InvokeResponses::Builder & aInvokeResponsesBuilder)
+{
+    InvokeResponseIB::Builder invokeResponseIBBuilder = aInvokeResponsesBuilder.CreateInvokeResponse();
+    NL_TEST_ASSERT(apSuite, aInvokeResponsesBuilder.GetError() == CHIP_NO_ERROR);
+    BuildInvokeResponseIBWithCommandDataIB(apSuite, invokeResponseIBBuilder);
+
+    aInvokeResponsesBuilder.EndOfInvokeResponses();
+    NL_TEST_ASSERT(apSuite, aInvokeResponsesBuilder.GetError() == CHIP_NO_ERROR);
+}
+
+void ParseInvokeResponses(nlTestSuite * apSuite, chip::TLV::TLVReader & aReader)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    InvokeResponses::Parser invokeResponsesParser;
+    err = invokeResponsesParser.Init(aReader);
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
+    err = invokeResponsesParser.CheckSchemaValidity();
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+#endif
+}
+
+void BuildInvokeRequestMessage(nlTestSuite * apSuite, chip::TLV::TLVWriter & aWriter)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    InvokeRequestMessage::Builder invokeRequestMessageBuilder;
+    err = invokeRequestMessageBuilder.Init(&aWriter);
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+    invokeRequestMessageBuilder.SuppressResponse(true);
+    invokeRequestMessageBuilder.TimedRequest(true);
+    InvokeRequests::Builder invokeRequestsBuilder = invokeRequestMessageBuilder.CreateInvokeRequests();
+    NL_TEST_ASSERT(apSuite, invokeRequestsBuilder.GetError() == CHIP_NO_ERROR);
+
+    BuildInvokeRequests(apSuite, invokeRequestsBuilder);
+
+    invokeRequestMessageBuilder.EndOfInvokeRequestMessage();
+    NL_TEST_ASSERT(apSuite, invokeRequestMessageBuilder.GetError() == CHIP_NO_ERROR);
+}
+
+void ParseInvokeRequestMessage(nlTestSuite * apSuite, chip::TLV::TLVReader & aReader)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    InvokeRequestMessage::Parser invokeRequestMessageParser;
+    err = invokeRequestMessageParser.Init(aReader);
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+    bool suppressResponse = false;
+    bool timedRequest     = false;
+    invokeRequestMessageParser.GetSuppressResponse(&suppressResponse);
+    invokeRequestMessageParser.GetTimedRequest(&timedRequest);
+    NL_TEST_ASSERT(apSuite, suppressResponse == true);
+    NL_TEST_ASSERT(apSuite, timedRequest == true);
+#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
+    err = invokeRequestMessageParser.CheckSchemaValidity();
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+#endif
+}
+
+void BuildInvokeResponseMessage(nlTestSuite * apSuite, chip::TLV::TLVWriter & aWriter)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    InvokeResponseMessage::Builder invokeResponseMessageBuilder;
+    err = invokeResponseMessageBuilder.Init(&aWriter);
+
+    invokeResponseMessageBuilder.SuppressResponse(true);
+    InvokeResponses::Builder invokeResponsesBuilder = invokeResponseMessageBuilder.CreateInvokeResponses();
+    NL_TEST_ASSERT(apSuite, invokeResponseMessageBuilder.GetError() == CHIP_NO_ERROR);
+
+    BuildInvokeResponses(apSuite, invokeResponsesBuilder);
+
+    invokeResponseMessageBuilder.EndOfInvokeResponseMessage();
+    NL_TEST_ASSERT(apSuite, invokeResponseMessageBuilder.GetError() == CHIP_NO_ERROR);
+}
+
+void ParseInvokeResponseMessage(nlTestSuite * apSuite, chip::TLV::TLVReader & aReader)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    InvokeResponseMessage::Parser invokeResponseMessageParser;
+    err = invokeResponseMessageParser.Init(aReader);
+    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+
+    bool suppressResponse = false;
+    invokeResponseMessageParser.GetSuppressResponse(&suppressResponse);
+    NL_TEST_ASSERT(apSuite, suppressResponse == true);
+#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
+    err = invokeResponseMessageParser.CheckSchemaValidity();
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
 #endif
 }
@@ -755,40 +912,6 @@
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR && moreChunkedMessages);
 }
 
-void BuildInvokeCommand(nlTestSuite * apSuite, chip::TLV::TLVWriter & aWriter)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-    InvokeCommand::Builder invokeCommandBuilder;
-
-    err = invokeCommandBuilder.Init(&aWriter);
-    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
-
-    CommandList::Builder commandList = invokeCommandBuilder.CreateCommandListBuilder();
-    NL_TEST_ASSERT(apSuite, invokeCommandBuilder.GetError() == CHIP_NO_ERROR);
-    BuildCommandList(apSuite, commandList);
-
-    invokeCommandBuilder.EndOfInvokeCommand();
-    NL_TEST_ASSERT(apSuite, invokeCommandBuilder.GetError() == CHIP_NO_ERROR);
-}
-
-void ParseInvokeCommand(nlTestSuite * apSuite, chip::TLV::TLVReader & aReader)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    InvokeCommand::Parser invokeCommandParser;
-    CommandList::Parser commandListParser;
-
-    err = invokeCommandParser.Init(aReader);
-    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
-
-#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
-    err = invokeCommandParser.CheckSchemaValidity();
-    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
-#endif
-    err = invokeCommandParser.GetCommandList(&commandListParser);
-    NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
-}
-
 void BuildReadRequestMessage(nlTestSuite * apSuite, chip::TLV::TLVWriter & aWriter)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
@@ -1233,7 +1356,7 @@
     ParseEventPaths(apSuite, reader);
 }
 
-void CommandPathTest(nlTestSuite * apSuite, void * apContext)
+void CommandPathIBTest(nlTestSuite * apSuite, void * apContext)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
     chip::System::PacketBufferTLVWriter writer;
@@ -1463,16 +1586,16 @@
     ParseCommandDataIB(apSuite, commandDataIBParser);
 }
 
-void CommandDataIBWithStatusCodeTest(nlTestSuite * apSuite, void * apContext)
+void CommandStatusIBTest(nlTestSuite * apSuite, void * apContext)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
-    CommandDataIB::Builder commandDataIBBuilder;
-    CommandDataIB::Parser commandDataIBParser;
+    CommandStatusIB::Builder commandStatusIBBuilder;
+    CommandStatusIB::Parser commandStatusIBParser;
     chip::System::PacketBufferTLVWriter writer;
     chip::System::PacketBufferTLVReader reader;
     writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
-    commandDataIBBuilder.Init(&writer);
-    BuildCommandDataIBWithStatusCode(apSuite, commandDataIBBuilder);
+    commandStatusIBBuilder.Init(&writer);
+    BuildCommandStatusIB(apSuite, commandStatusIBBuilder);
     chip::System::PacketBufferHandle buf;
     err = writer.Finalize(&buf);
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
@@ -1483,19 +1606,20 @@
     err = reader.Next();
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
 
-    commandDataIBParser.Init(reader);
-    ParseCommandDataIBWithStatusCode(apSuite, commandDataIBParser);
+    commandStatusIBParser.Init(reader);
+    ParseCommandStatusIB(apSuite, commandStatusIBParser);
 }
 
-void CommandListTest(nlTestSuite * apSuite, void * apContext)
+void InvokeResponseIBWithCommandDataIBTest(nlTestSuite * apSuite, void * apContext)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
+    InvokeResponseIB::Builder invokeResponseIBBuilder;
+    InvokeResponseIB::Parser invokeResponseIBParser;
     chip::System::PacketBufferTLVWriter writer;
     chip::System::PacketBufferTLVReader reader;
-    CommandList::Builder commandListBuilder;
     writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
-    commandListBuilder.Init(&writer);
-    BuildCommandList(apSuite, commandListBuilder);
+    invokeResponseIBBuilder.Init(&writer);
+    BuildInvokeResponseIBWithCommandDataIB(apSuite, invokeResponseIBBuilder);
     chip::System::PacketBufferHandle buf;
     err = writer.Finalize(&buf);
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
@@ -1505,7 +1629,137 @@
     reader.Init(std::move(buf));
     err = reader.Next();
     NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
-    ParseCommandList(apSuite, reader);
+
+    invokeResponseIBParser.Init(reader);
+    ParseInvokeResponseIBWithCommandDataIB(apSuite, invokeResponseIBParser);
+}
+
+void InvokeResponseIBWithCommandStatusIBTest(nlTestSuite * apSuite, void * apContext)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    InvokeResponseIB::Builder invokeResponseIBBuilder;
+    InvokeResponseIB::Parser invokeResponseIBParser;
+    chip::System::PacketBufferTLVWriter writer;
+    chip::System::PacketBufferTLVReader reader;
+    writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
+    invokeResponseIBBuilder.Init(&writer);
+    BuildInvokeResponseIBWithCommandStatusIB(apSuite, invokeResponseIBBuilder);
+    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);
+
+    invokeResponseIBParser.Init(reader);
+    ParseInvokeResponseIBWithCommandStatusIB(apSuite, invokeResponseIBParser);
+}
+
+void InvokeResponseIBWithMalformDataTest(nlTestSuite * apSuite, void * apContext)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    InvokeResponseIB::Builder invokeResponseIBBuilder;
+    InvokeResponseIB::Parser invokeResponseIBParser;
+    chip::System::PacketBufferTLVWriter writer;
+    chip::System::PacketBufferTLVReader reader;
+    writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
+    invokeResponseIBBuilder.Init(&writer);
+    BuildWrongInvokeResponseIB(apSuite, invokeResponseIBBuilder);
+    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);
+
+    invokeResponseIBParser.Init(reader);
+    ParseWrongInvokeResponseIB(apSuite, invokeResponseIBParser);
+}
+
+void InvokeRequestsTest(nlTestSuite * apSuite, void * apContext)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    chip::System::PacketBufferTLVWriter writer;
+    chip::System::PacketBufferTLVReader reader;
+    InvokeRequests::Builder invokeRequestsBuilder;
+    writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
+    invokeRequestsBuilder.Init(&writer);
+    BuildInvokeRequests(apSuite, invokeRequestsBuilder);
+    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);
+    ParseInvokeRequests(apSuite, reader);
+}
+
+void InvokeResponsesTest(nlTestSuite * apSuite, void * apContext)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    chip::System::PacketBufferTLVWriter writer;
+    chip::System::PacketBufferTLVReader reader;
+    InvokeResponses::Builder invokeResponsesBuilder;
+    writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
+    invokeResponsesBuilder.Init(&writer);
+    BuildInvokeResponses(apSuite, invokeResponsesBuilder);
+    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);
+    ParseInvokeResponses(apSuite, reader);
+}
+
+void InvokeInvokeRequestMessageTest(nlTestSuite * apSuite, void * apContext)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    chip::System::PacketBufferTLVWriter writer;
+    chip::System::PacketBufferTLVReader reader;
+    writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
+    BuildInvokeRequestMessage(apSuite, writer);
+    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);
+    ParseInvokeRequestMessage(apSuite, reader);
+}
+
+void InvokeInvokeResponseMessageTest(nlTestSuite * apSuite, void * apContext)
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    chip::System::PacketBufferTLVWriter writer;
+    chip::System::PacketBufferTLVReader reader;
+    writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
+    BuildInvokeResponseMessage(apSuite, writer);
+    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);
+    ParseInvokeResponseMessage(apSuite, reader);
 }
 
 void ReportDataMessageTest(nlTestSuite * apSuite, void * apContext)
@@ -1527,25 +1781,6 @@
     ParseReportDataMessage(apSuite, reader);
 }
 
-void InvokeCommandTest(nlTestSuite * apSuite, void * apContext)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-    chip::System::PacketBufferTLVWriter writer;
-    chip::System::PacketBufferTLVReader reader;
-    writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
-    BuildInvokeCommand(apSuite, writer);
-    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);
-    ParseInvokeCommand(apSuite, reader);
-}
-
 void ReadRequestMessageTest(nlTestSuite * apSuite, void * apContext)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
@@ -1726,7 +1961,6 @@
                 NL_TEST_DEF("AttributePathListTest", AttributePathListTest),
                 NL_TEST_DEF("EventPathTest", EventPathTest),
                 NL_TEST_DEF("EventPathsTest", EventPathsTest),
-                NL_TEST_DEF("CommandPathTest", CommandPathTest),
                 NL_TEST_DEF("EventDataElementTest", EventDataElementTest),
                 NL_TEST_DEF("EventListTest", EventListTest),
                 NL_TEST_DEF("StatusIBTest", StatusIBTest),
@@ -1735,11 +1969,17 @@
                 NL_TEST_DEF("AttributeDataElementTest", AttributeDataElementTest),
                 NL_TEST_DEF("AttributeDataListTest", AttributeDataListTest),
                 NL_TEST_DEF("AttributeDataVersionListTest", AttributeDataVersionListTest),
+                NL_TEST_DEF("CommandPathIBTest", CommandPathIBTest),
                 NL_TEST_DEF("CommandDataIBTest", CommandDataIBTest),
-                NL_TEST_DEF("CommandDataIBWithStatusCodeTest", CommandDataIBWithStatusCodeTest),
-                NL_TEST_DEF("CommandListTest", CommandListTest),
+                NL_TEST_DEF("CommandStatusIBTest", CommandStatusIBTest),
+                NL_TEST_DEF("InvokeResponseIBWithCommandDataIBTest", InvokeResponseIBWithCommandDataIBTest),
+                NL_TEST_DEF("InvokeResponseIBWithCommandStatusIBTest", InvokeResponseIBWithCommandStatusIBTest),
+                NL_TEST_DEF("InvokeResponseIBWithMalformDataTest", InvokeResponseIBWithMalformDataTest),
+                NL_TEST_DEF("InvokeRequestsTest", InvokeRequestsTest),
+                NL_TEST_DEF("InvokeResponsesTest", InvokeResponsesTest),
+                NL_TEST_DEF("InvokeInvokeRequestMessageTest", InvokeInvokeRequestMessageTest),
+                NL_TEST_DEF("InvokeInvokeResponseMessageTest", InvokeInvokeResponseMessageTest),
                 NL_TEST_DEF("ReportDataMessageTest", ReportDataMessageTest),
-                NL_TEST_DEF("InvokeCommandTest", InvokeCommandTest),
                 NL_TEST_DEF("ReadRequestMessageTest", ReadRequestMessageTest),
                 NL_TEST_DEF("WriteRequestMessageTest", WriteRequestMessageTest),
                 NL_TEST_DEF("WriteResponseMessageTest", WriteResponseMessageTest),