@@ -1576,36 +1576,31 @@ void TestCommandInteraction::TestCommandHandlerRejectMultipleIdenticalCommands(n
1576
1576
CHIP_ERROR err = CHIP_NO_ERROR;
1577
1577
1578
1578
isCommandDispatched = false ;
1579
- mockCommandSenderDelegate.ResetCounter ();
1580
- app::CommandSender commandSender (&mockCommandSenderDelegate, &ctx.GetExchangeManager ());
1579
+ mockCommandSenderExtendedDelegate.ResetCounter ();
1580
+ PendingResponseTrackerImpl pendingResponseTracker;
1581
+ app::CommandSender commandSender (kCommandSenderTestOnlyMarker , &mockCommandSenderExtendedDelegate, &ctx.GetExchangeManager (),
1582
+ &pendingResponseTracker);
1581
1583
1582
- {
1583
- // Command ID is not important here, since the command handler should reject the commands without handling it.
1584
- auto commandPathParams = MakeTestCommandPath ( kTestCommandIdCommandSpecificResponse );
1584
+ app::CommandSender::ConfigParameters configParameters;
1585
+ configParameters. SetRemoteMaxPathsPerInvoke ( 2 );
1586
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender. SetCommandSenderConfig (configParameters) );
1585
1587
1586
- commandSender.AllocateBuffer ();
1588
+ // Command ID is not important here, since the command handler should reject the commands without handling it.
1589
+ auto commandPathParams = MakeTestCommandPath (kTestCommandIdCommandSpecificResponse );
1587
1590
1588
- // TODO(#30453): CommandSender does support sending multiple commands, update this test to use that.
1589
- for (int i = 0 ; i < 2 ; i++)
1590
- {
1591
- InvokeRequests::Builder & invokeRequests = commandSender.mInvokeRequestBuilder .GetInvokeRequests ();
1592
- CommandDataIB::Builder & invokeRequest = invokeRequests.CreateCommandData ();
1593
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequests.GetError ());
1594
- CommandPathIB::Builder & path = invokeRequest.CreatePath ();
1595
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.GetError ());
1596
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == path.Encode (commandPathParams));
1597
- NL_TEST_ASSERT (apSuite,
1598
- CHIP_NO_ERROR ==
1599
- invokeRequest.GetWriter ()->StartContainer (TLV::ContextTag (CommandDataIB::Tag::kFields ),
1600
- TLV::kTLVType_Structure ,
1601
- commandSender.mDataElementContainerType ));
1602
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.GetWriter ()->PutBoolean (chip::TLV::ContextTag (1 ), true ));
1603
- NL_TEST_ASSERT (apSuite,
1604
- CHIP_NO_ERROR == invokeRequest.GetWriter ()->EndContainer (commandSender.mDataElementContainerType ));
1605
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.EndOfCommandDataIB ());
1606
- }
1591
+ for (uint16_t i = 0 ; i < 2 ; i++)
1592
+ {
1593
+ app::CommandSender::PrepareCommandParameters prepareCommandParams;
1594
+ prepareCommandParams.SetStartDataStruct (true );
1595
+ prepareCommandParams.SetCommandRef (i);
1596
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.PrepareCommand (commandPathParams, prepareCommandParams));
1597
+ NL_TEST_ASSERT (apSuite,
1598
+ CHIP_NO_ERROR == commandSender.GetCommandDataIBTLVWriter ()->PutBoolean (chip::TLV::ContextTag (1 ), true ));
1607
1599
1608
- commandSender.MoveToState (app::CommandSender::State::AddedCommand);
1600
+ app::CommandSender::FinishCommandParameters finishCommandParams;
1601
+ finishCommandParams.SetEndDataStruct (true );
1602
+ finishCommandParams.SetCommandRef (i);
1603
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.FinishCommand (finishCommandParams));
1609
1604
}
1610
1605
1611
1606
err = commandSender.SendCommandRequest (ctx.GetSessionBobToAlice ());
@@ -1615,60 +1610,62 @@ void TestCommandInteraction::TestCommandHandlerRejectMultipleIdenticalCommands(n
1615
1610
ctx.DrainAndServiceIO ();
1616
1611
1617
1612
NL_TEST_ASSERT (apSuite,
1618
- mockCommandSenderDelegate.onResponseCalledTimes == 0 && mockCommandSenderDelegate.onFinalCalledTimes == 1 &&
1619
- mockCommandSenderDelegate.onErrorCalledTimes == 1 );
1613
+ mockCommandSenderExtendedDelegate.onResponseCalledTimes == 0 &&
1614
+ mockCommandSenderExtendedDelegate.onFinalCalledTimes == 1 &&
1615
+ mockCommandSenderExtendedDelegate.onErrorCalledTimes == 1 );
1620
1616
NL_TEST_ASSERT (apSuite, !chip::isCommandDispatched);
1621
1617
1622
1618
NL_TEST_ASSERT (apSuite, GetNumActiveHandlerObjects () == 0 );
1623
1619
NL_TEST_ASSERT (apSuite, ctx.GetExchangeManager ().GetNumActiveExchanges () == 0 );
1624
1620
}
1625
1621
1622
+ #if CONFIG_BUILD_FOR_HOST_UNIT_TEST
1623
+
1626
1624
void TestCommandInteraction::TestCommandHandlerRejectsMultipleCommandsWithIdenticalCommandRef (nlTestSuite * apSuite,
1627
1625
void * apContext)
1628
1626
{
1629
1627
TestContext & ctx = *static_cast <TestContext *>(apContext);
1630
1628
CHIP_ERROR err = CHIP_NO_ERROR;
1631
1629
1632
1630
isCommandDispatched = false ;
1633
- mockCommandSenderDelegate.ResetCounter ();
1631
+ mockCommandSenderExtendedDelegate.ResetCounter ();
1632
+ PendingResponseTrackerImpl pendingResponseTracker;
1633
+ app::CommandSender commandSender (kCommandSenderTestOnlyMarker , &mockCommandSenderExtendedDelegate, &ctx.GetExchangeManager (),
1634
+ &pendingResponseTracker);
1634
1635
1635
- // Using commandSender to help build afterward we take the buffer to feed into standalone CommandHandler
1636
- app::CommandSender commandSender (&mockCommandSenderDelegate, &ctx.GetExchangeManager ());
1636
+ app::CommandSender::ConfigParameters configParameters;
1637
+ configParameters.SetRemoteMaxPathsPerInvoke (2 );
1638
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.SetCommandSenderConfig (configParameters));
1637
1639
1638
- size_t numberOfCommandsToSend = 2 ;
1640
+ uint16_t numberOfCommandsToSend = 2 ;
1639
1641
{
1640
1642
CommandPathParams requestCommandPaths[] = {
1641
1643
MakeTestCommandPath (kTestCommandIdWithData ),
1642
1644
MakeTestCommandPath (kTestCommandIdCommandSpecificResponse ),
1643
1645
};
1644
1646
1645
- commandSender. AllocateBuffer () ;
1647
+ uint16_t hardcodedCommandRef = 0 ;
1646
1648
1647
- // TODO(#30453): CommandSender does support sending multiple commands, update this test to use that.
1648
- for (size_t i = 0 ; i < numberOfCommandsToSend; i++)
1649
+ for (uint16_t i = 0 ; i < numberOfCommandsToSend; i++)
1649
1650
{
1650
- InvokeRequests::Builder & invokeRequests = commandSender.mInvokeRequestBuilder .GetInvokeRequests ();
1651
- CommandDataIB::Builder & invokeRequest = invokeRequests.CreateCommandData ();
1652
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequests.GetError ());
1653
- CommandPathIB::Builder & path = invokeRequest.CreatePath ();
1654
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.GetError ());
1655
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == path.Encode (requestCommandPaths[i]));
1651
+ app::CommandSender::PrepareCommandParameters prepareCommandParams;
1652
+ prepareCommandParams.SetStartDataStruct (true );
1653
+ prepareCommandParams.SetCommandRef (i);
1654
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.PrepareCommand (requestCommandPaths[i], prepareCommandParams));
1656
1655
NL_TEST_ASSERT (apSuite,
1657
- CHIP_NO_ERROR ==
1658
- invokeRequest.GetWriter ()->StartContainer (TLV::ContextTag (CommandDataIB::Tag::kFields ),
1659
- TLV::kTLVType_Structure ,
1660
- commandSender.mDataElementContainerType ));
1661
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.GetWriter ()->PutBoolean (chip::TLV::ContextTag (1 ), true ));
1662
- NL_TEST_ASSERT (apSuite,
1663
- CHIP_NO_ERROR == invokeRequest.GetWriter ()->EndContainer (commandSender.mDataElementContainerType ));
1664
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.Ref (1 ));
1665
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.EndOfCommandDataIB ());
1656
+ CHIP_NO_ERROR == commandSender.GetCommandDataIBTLVWriter ()->PutBoolean (chip::TLV::ContextTag (1 ), true ));
1657
+ // TODO fix this comment
1658
+ // We are taking advantage of the fact that the commandRef was set into finishCommandParams during PrepareCommand
1659
+ // But setting it to a different value here, we are overriding what it was supposed to be.
1660
+ app::CommandSender::FinishCommandParameters finishCommandParams;
1661
+ finishCommandParams.SetEndDataStruct (true );
1662
+ finishCommandParams.SetCommandRef (hardcodedCommandRef);
1663
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.TestOnlyFinishCommand (finishCommandParams));
1666
1664
}
1667
-
1668
- commandSender.MoveToState (app::CommandSender::State::AddedCommand);
1669
1665
}
1670
1666
1671
- CommandHandler commandHandler (&mockCommandHandlerDelegate);
1667
+ BasicCommandPathRegistry<4 > mBasicCommandPathRegistry ;
1668
+ CommandHandler commandHandler (kCommandHandlerTestOnlyMarker , &mockCommandHandlerDelegate, &mBasicCommandPathRegistry );
1672
1669
TestExchangeDelegate delegate;
1673
1670
auto exchange = ctx.NewExchangeToAlice (&delegate, false );
1674
1671
commandHandler.mResponseSender .SetExchangeContext (exchange);
@@ -1696,53 +1693,48 @@ void TestCommandInteraction::TestCommandHandlerRejectsMultipleCommandsWithIdenti
1696
1693
exchange->Close ();
1697
1694
}
1698
1695
1696
+ #endif // CONFIG_BUILD_FOR_HOST_UNIT_TEST
1697
+
1699
1698
void TestCommandInteraction::TestCommandHandlerRejectMultipleCommandsWhenHandlerOnlySupportsOne (nlTestSuite * apSuite,
1700
1699
void * apContext)
1701
1700
{
1702
1701
TestContext & ctx = *static_cast <TestContext *>(apContext);
1703
1702
CHIP_ERROR err = CHIP_NO_ERROR;
1704
1703
1705
1704
isCommandDispatched = false ;
1706
- mockCommandSenderDelegate.ResetCounter ();
1707
1705
1708
- // Using commandSender to help build afterward we take the buffer to feed into standalone CommandHandler
1709
- app::CommandSender commandSender (&mockCommandSenderDelegate, &ctx.GetExchangeManager ());
1706
+ mockCommandSenderExtendedDelegate.ResetCounter ();
1707
+ PendingResponseTrackerImpl pendingResponseTracker;
1708
+ app::CommandSender commandSender (kCommandSenderTestOnlyMarker , &mockCommandSenderExtendedDelegate, &ctx.GetExchangeManager (),
1709
+ &pendingResponseTracker);
1710
1710
1711
- size_t numberOfCommandsToSend = 2 ;
1711
+ app::CommandSender::ConfigParameters configParameters;
1712
+ configParameters.SetRemoteMaxPathsPerInvoke (2 );
1713
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.SetCommandSenderConfig (configParameters));
1714
+
1715
+ uint16_t numberOfCommandsToSend = 2 ;
1712
1716
{
1713
1717
CommandPathParams requestCommandPaths[] = {
1714
1718
MakeTestCommandPath (kTestCommandIdWithData ),
1715
1719
MakeTestCommandPath (kTestCommandIdCommandSpecificResponse ),
1716
1720
};
1717
1721
1718
- commandSender.AllocateBuffer ();
1719
-
1720
- // TODO(#30453): CommandSender does support sending multiple commands, update this test to use that.
1721
- for (size_t i = 0 ; i < numberOfCommandsToSend; i++)
1722
+ for (uint16_t i = 0 ; i < numberOfCommandsToSend; i++)
1722
1723
{
1723
- InvokeRequests::Builder & invokeRequests = commandSender.mInvokeRequestBuilder .GetInvokeRequests ();
1724
- CommandDataIB::Builder & invokeRequest = invokeRequests.CreateCommandData ();
1725
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequests.GetError ());
1726
- CommandPathIB::Builder & path = invokeRequest.CreatePath ();
1727
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.GetError ());
1728
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == path.Encode (requestCommandPaths[i]));
1724
+ app::CommandSender::PrepareCommandParameters prepareCommandParams;
1725
+ prepareCommandParams.SetStartDataStruct (true );
1726
+ prepareCommandParams.SetCommandRef (i);
1727
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.PrepareCommand (requestCommandPaths[i], prepareCommandParams));
1729
1728
NL_TEST_ASSERT (apSuite,
1730
- CHIP_NO_ERROR ==
1731
- invokeRequest.GetWriter ()->StartContainer (TLV::ContextTag (CommandDataIB::Tag::kFields ),
1732
- TLV::kTLVType_Structure ,
1733
- commandSender.mDataElementContainerType ));
1734
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.GetWriter ()->PutBoolean (chip::TLV::ContextTag (1 ), true ));
1735
- NL_TEST_ASSERT (apSuite,
1736
- CHIP_NO_ERROR == invokeRequest.GetWriter ()->EndContainer (commandSender.mDataElementContainerType ));
1737
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.Ref (static_cast <uint16_t >(i)));
1738
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.EndOfCommandDataIB ());
1729
+ CHIP_NO_ERROR == commandSender.GetCommandDataIBTLVWriter ()->PutBoolean (chip::TLV::ContextTag (1 ), true ));
1730
+ app::CommandSender::FinishCommandParameters finishCommandParams;
1731
+ finishCommandParams.SetEndDataStruct (true );
1732
+ finishCommandParams.SetCommandRef (i);
1733
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.FinishCommand (finishCommandParams));
1739
1734
}
1740
-
1741
- commandSender.MoveToState (app::CommandSender::State::AddedCommand);
1742
1735
}
1743
1736
1744
- BasicCommandPathRegistry<4 > mBasicCommandPathRegistry ;
1745
- CommandHandler commandHandler (kCommandHandlerTestOnlyMarker , &mockCommandHandlerDelegate, &mBasicCommandPathRegistry );
1737
+ CommandHandler commandHandler (&mockCommandHandlerDelegate);
1746
1738
TestExchangeDelegate delegate;
1747
1739
auto exchange = ctx.NewExchangeToAlice (&delegate, false );
1748
1740
commandHandler.mResponseSender .SetExchangeContext (exchange);
@@ -1757,9 +1749,9 @@ void TestCommandInteraction::TestCommandHandlerRejectMultipleCommandsWhenHandler
1757
1749
commandDispatchedCount = 0 ;
1758
1750
1759
1751
InteractionModel::Status status = commandHandler.ProcessInvokeRequest (std::move (commandDatabuf), false );
1760
- NL_TEST_ASSERT (apSuite, status == InteractionModel::Status::Success );
1752
+ NL_TEST_ASSERT (apSuite, status == InteractionModel::Status::InvalidAction );
1761
1753
1762
- NL_TEST_ASSERT (apSuite, commandDispatchedCount == 2 );
1754
+ NL_TEST_ASSERT (apSuite, commandDispatchedCount == 0 );
1763
1755
1764
1756
//
1765
1757
// Ordinarily, the ExchangeContext will close itself on a responder exchange when unwinding back from an
@@ -1777,39 +1769,35 @@ void TestCommandInteraction::TestCommandHandlerAcceptMultipleCommands(nlTestSuit
1777
1769
CHIP_ERROR err = CHIP_NO_ERROR;
1778
1770
1779
1771
isCommandDispatched = false ;
1780
- mockCommandSenderDelegate.ResetCounter ();
1781
1772
1782
- // Using commandSender to help build afterward we take the buffer to feed into standalone CommandHandler
1783
- app::CommandSender commandSender (&mockCommandSenderDelegate, &ctx.GetExchangeManager ());
1773
+ mockCommandSenderExtendedDelegate.ResetCounter ();
1774
+ PendingResponseTrackerImpl pendingResponseTracker;
1775
+ app::CommandSender commandSender (kCommandSenderTestOnlyMarker , &mockCommandSenderExtendedDelegate, &ctx.GetExchangeManager (),
1776
+ &pendingResponseTracker);
1777
+
1778
+ app::CommandSender::ConfigParameters configParameters;
1779
+ configParameters.SetRemoteMaxPathsPerInvoke (2 );
1780
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.SetCommandSenderConfig (configParameters));
1784
1781
1785
- size_t numberOfCommandsToSend = 2 ;
1782
+ uint16_t numberOfCommandsToSend = 2 ;
1786
1783
{
1787
1784
CommandPathParams requestCommandPaths[] = {
1788
1785
MakeTestCommandPath (kTestCommandIdWithData ),
1789
1786
MakeTestCommandPath (kTestCommandIdCommandSpecificResponse ),
1790
1787
};
1791
1788
1792
- commandSender.AllocateBuffer ();
1793
-
1794
- // TODO(#30453): CommandSender does support sending multiple commands, update this test to use that.
1795
- for (size_t i = 0 ; i < numberOfCommandsToSend; i++)
1789
+ for (uint16_t i = 0 ; i < numberOfCommandsToSend; i++)
1796
1790
{
1797
- InvokeRequests::Builder & invokeRequests = commandSender.mInvokeRequestBuilder .GetInvokeRequests ();
1798
- CommandDataIB::Builder & invokeRequest = invokeRequests.CreateCommandData ();
1799
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequests.GetError ());
1800
- CommandPathIB::Builder & path = invokeRequest.CreatePath ();
1801
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.GetError ());
1802
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == path.Encode (requestCommandPaths[i]));
1803
- NL_TEST_ASSERT (apSuite,
1804
- CHIP_NO_ERROR ==
1805
- invokeRequest.GetWriter ()->StartContainer (TLV::ContextTag (CommandDataIB::Tag::kFields ),
1806
- TLV::kTLVType_Structure ,
1807
- commandSender.mDataElementContainerType ));
1808
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.GetWriter ()->PutBoolean (chip::TLV::ContextTag (1 ), true ));
1791
+ app::CommandSender::PrepareCommandParameters prepareCommandParams;
1792
+ prepareCommandParams.SetStartDataStruct (true );
1793
+ prepareCommandParams.SetCommandRef (i);
1794
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.PrepareCommand (requestCommandPaths[i], prepareCommandParams));
1809
1795
NL_TEST_ASSERT (apSuite,
1810
- CHIP_NO_ERROR == invokeRequest.GetWriter ()->EndContainer (commandSender.mDataElementContainerType ));
1811
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.Ref (static_cast <uint16_t >(i)));
1812
- NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == invokeRequest.EndOfCommandDataIB ());
1796
+ CHIP_NO_ERROR == commandSender.GetCommandDataIBTLVWriter ()->PutBoolean (chip::TLV::ContextTag (1 ), true ));
1797
+ app::CommandSender::FinishCommandParameters finishCommandParams;
1798
+ finishCommandParams.SetEndDataStruct (true );
1799
+ finishCommandParams.SetCommandRef (i);
1800
+ NL_TEST_ASSERT (apSuite, CHIP_NO_ERROR == commandSender.FinishCommand (finishCommandParams));
1813
1801
}
1814
1802
1815
1803
commandSender.MoveToState (app::CommandSender::State::AddedCommand);
@@ -1826,6 +1814,7 @@ void TestCommandInteraction::TestCommandHandlerAcceptMultipleCommands(nlTestSuit
1826
1814
err = commandSender.Finalize (commandDatabuf);
1827
1815
NL_TEST_ASSERT (apSuite, err == CHIP_NO_ERROR);
1828
1816
1817
+ sendResponse = true ;
1829
1818
mockCommandHandlerDelegate.ResetCounter ();
1830
1819
commandDispatchedCount = 0 ;
1831
1820
@@ -1980,7 +1969,9 @@ const nlTest sTests[] =
1980
1969
NL_TEST_DEF (" TestCommandHandlerWithProcessReceivedNotExistCommand" , chip::app::TestCommandInteraction::TestCommandHandlerWithProcessReceivedNotExistCommand),
1981
1970
NL_TEST_DEF (" TestCommandHandlerWithProcessReceivedEmptyDataMsg" , chip::app::TestCommandInteraction::TestCommandHandlerWithProcessReceivedEmptyDataMsg),
1982
1971
NL_TEST_DEF (" TestCommandHandlerRejectMultipleIdenticalCommands" , chip::app::TestCommandInteraction::TestCommandHandlerRejectMultipleIdenticalCommands),
1972
+ #if CONFIG_BUILD_FOR_HOST_UNIT_TEST
1983
1973
NL_TEST_DEF (" TestCommandHandlerRejectsMultipleCommandsWithIdenticalCommandRef" , chip::app::TestCommandInteraction::TestCommandHandlerRejectsMultipleCommandsWithIdenticalCommandRef),
1974
+ #endif // CONFIG_BUILD_FOR_HOST_UNIT_TEST
1984
1975
NL_TEST_DEF (" TestCommandHandlerRejectMultipleCommandsWhenHandlerOnlySupportsOne" , chip::app::TestCommandInteraction::TestCommandHandlerRejectMultipleCommandsWhenHandlerOnlySupportsOne),
1985
1976
NL_TEST_DEF (" TestCommandHandlerAcceptMultipleCommands" , chip::app::TestCommandInteraction::TestCommandHandlerAcceptMultipleCommands),
1986
1977
NL_TEST_DEF (" TestCommandHandler_FillUpInvokeResponseMessageWhereSecondResponseIsStatusResponse" , chip::app::TestCommandInteraction::TestCommandHandler_FillUpInvokeResponseMessageWhereSecondResponseIsStatusResponse),
0 commit comments