Skip to content

Commit 92c88e4

Browse files
Add a test that exercises receiving an invalid WriteRequest message. (#37053)
1 parent f2ee6d2 commit 92c88e4

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

src/app/tests/TestWriteInteraction.cpp

+70
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919

2020
#include <app-common/zap-generated/cluster-objects.h>
2121
#include <app/InteractionModelEngine.h>
22+
#include <app/MessageDef/StatusResponseMessage.h>
2223
#include <app/reporting/tests/MockReportScheduler.h>
2324
#include <app/tests/AppTestContext.h>
2425
#include <app/tests/test-interaction-model-api.h>
2526
#include <credentials/GroupDataProviderImpl.h>
27+
#include <crypto/CHIPCryptoPAL.h>
2628
#include <crypto/DefaultSessionKeystore.h>
2729
#include <lib/core/CHIPCore.h>
2830
#include <lib/core/ErrorStr.h>
@@ -85,6 +87,7 @@ class TestWriteInteraction : public chip::Test::AppContext
8587
void TestWriteClient();
8688
void TestWriteClientGroup();
8789
void TestWriteHandlerReceiveInvalidMessage();
90+
void TestWriteHandlerReceiveEmptyWriteRequest();
8891
void TestWriteInvalidMessage1();
8992
void TestWriteInvalidMessage2();
9093
void TestWriteInvalidMessage3();
@@ -101,9 +104,30 @@ class TestWriteInteraction : public chip::Test::AppContext
101104

102105
class TestExchangeDelegate : public Messaging::ExchangeDelegate
103106
{
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+
104123
CHIP_ERROR OnMessageReceived(Messaging::ExchangeContext * ec, const PayloadHeader & payloadHeader,
105124
System::PacketBufferHandle && payload) override
106125
{
126+
if (payloadHeader.HasMessageType(Protocols::InteractionModel::MsgType::StatusResponse))
127+
{
128+
CHIP_ERROR err = UpdateLastStatus(std::move(payload));
129+
mLastStatusParsedSuccessfully = (err == CHIP_NO_ERROR);
130+
}
107131
return CHIP_NO_ERROR;
108132
}
109133

@@ -628,6 +652,52 @@ TEST_F(TestWriteInteraction, TestWriteHandlerInvalidateFabric)
628652

629653
#endif
630654

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+
631701
// Write Client sends a write request, receives an unexpected message type, sends a status response to that.
632702
TEST_F_FROM_FIXTURE(TestWriteInteraction, TestWriteInvalidMessage1)
633703
{

0 commit comments

Comments
 (0)