19
19
20
20
#include < app-common/zap-generated/cluster-objects.h>
21
21
#include < app/InteractionModelEngine.h>
22
+ #include < app/MessageDef/StatusResponseMessage.h>
22
23
#include < app/reporting/tests/MockReportScheduler.h>
23
24
#include < app/tests/AppTestContext.h>
24
25
#include < app/tests/test-interaction-model-api.h>
25
26
#include < credentials/GroupDataProviderImpl.h>
27
+ #include < crypto/CHIPCryptoPAL.h>
26
28
#include < crypto/DefaultSessionKeystore.h>
27
29
#include < lib/core/CHIPCore.h>
28
30
#include < lib/core/ErrorStr.h>
@@ -85,6 +87,7 @@ class TestWriteInteraction : public chip::Test::AppContext
85
87
void TestWriteClient ();
86
88
void TestWriteClientGroup ();
87
89
void TestWriteHandlerReceiveInvalidMessage ();
90
+ void TestWriteHandlerReceiveEmptyWriteRequest ();
88
91
void TestWriteInvalidMessage1 ();
89
92
void TestWriteInvalidMessage2 ();
90
93
void TestWriteInvalidMessage3 ();
@@ -101,9 +104,30 @@ class TestWriteInteraction : public chip::Test::AppContext
101
104
102
105
class TestExchangeDelegate : public Messaging ::ExchangeDelegate
103
106
{
107
+ public:
108
+ Protocols::InteractionModel::Status mLastStatus = Protocols::InteractionModel::Status::Success;
109
+ bool mLastStatusParsedSuccessfully = false ;
110
+
111
+ private:
112
+ CHIP_ERROR UpdateLastStatus (System::PacketBufferHandle && payload)
113
+ {
114
+ StatusResponseMessage::Parser response;
115
+ System::PacketBufferTLVReader reader;
116
+ reader.Init (std::move (payload));
117
+ ReturnErrorOnFailure (response.Init (reader));
118
+ StatusIB status;
119
+ ReturnErrorOnFailure (response.GetStatus (mLastStatus ));
120
+ return CHIP_NO_ERROR;
121
+ }
122
+
104
123
CHIP_ERROR OnMessageReceived (Messaging::ExchangeContext * ec, const PayloadHeader & payloadHeader,
105
124
System::PacketBufferHandle && payload) override
106
125
{
126
+ if (payloadHeader.HasMessageType (Protocols::InteractionModel::MsgType::StatusResponse))
127
+ {
128
+ CHIP_ERROR err = UpdateLastStatus (std::move (payload));
129
+ mLastStatusParsedSuccessfully = (err == CHIP_NO_ERROR);
130
+ }
107
131
return CHIP_NO_ERROR;
108
132
}
109
133
@@ -628,6 +652,52 @@ TEST_F(TestWriteInteraction, TestWriteHandlerInvalidateFabric)
628
652
629
653
#endif
630
654
655
+ // This test sends an invalid (because there is no application payload at all)
656
+ // Write Request message and makes sure that a correct Status Response is
657
+ // received.
658
+ TEST_F_FROM_FIXTURE (TestWriteInteraction, TestWriteHandlerReceiveEmptyWriteRequest)
659
+ {
660
+ Messaging::ReliableMessageMgr * rm = GetExchangeManager ().GetReliableMessageMgr ();
661
+ // Shouldn't have anything in the retransmit table when starting the test.
662
+ EXPECT_EQ (rm->TestGetCountRetransTable (), 0 );
663
+
664
+ TestWriteClientCallback writeCallback;
665
+ auto * engine = chip::app::InteractionModelEngine::GetInstance ();
666
+ EXPECT_EQ (engine->Init (&GetExchangeManager (), &GetFabricTable (), app::reporting::GetDefaultReportScheduler ()), CHIP_NO_ERROR);
667
+
668
+ GetLoopback ().mDroppedMessageCount = 0 ;
669
+ GetLoopback ().mSentMessageCount = 0 ;
670
+ GetLoopback ().mNumMessagesToDrop = 0 ;
671
+
672
+ // Just send an empty message claiming to be a write request.
673
+ System::PacketBufferHandle emptyMessage = System::PacketBufferHandle::New (Crypto::CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES);
674
+
675
+ TestExchangeDelegate delegate;
676
+ delegate.mLastStatusParsedSuccessfully = false ;
677
+
678
+ auto exchange = NewExchangeToAlice (&delegate);
679
+ EXPECT_NE (exchange, nullptr );
680
+
681
+ EXPECT_EQ (exchange->SendMessage (Protocols::InteractionModel::MsgType::WriteRequest, std::move (emptyMessage),
682
+ Messaging::SendMessageFlags::kExpectResponse ),
683
+ CHIP_NO_ERROR);
684
+
685
+ DrainAndServiceIO ();
686
+
687
+ EXPECT_EQ (InteractionModelEngine::GetInstance ()->GetNumActiveWriteHandlers (), 0u );
688
+ EXPECT_EQ (GetLoopback ().mSentMessageCount , 3u ); // Request, response, ack
689
+ EXPECT_EQ (GetLoopback ().mDroppedMessageCount , 0u );
690
+
691
+ EXPECT_TRUE (delegate.mLastStatusParsedSuccessfully );
692
+ EXPECT_EQ (delegate.mLastStatus , Protocols::InteractionModel::Status::InvalidAction);
693
+
694
+ engine->Shutdown ();
695
+ ExpireSessionAliceToBob ();
696
+ ExpireSessionBobToAlice ();
697
+ CreateSessionAliceToBob ();
698
+ CreateSessionBobToAlice ();
699
+ }
700
+
631
701
// Write Client sends a write request, receives an unexpected message type, sends a status response to that.
632
702
TEST_F_FROM_FIXTURE (TestWriteInteraction, TestWriteInvalidMessage1)
633
703
{
0 commit comments