@@ -124,6 +124,13 @@ void VerifyNoMoreOutput(TransferSession & transferSession)
124
124
EXPECT_EQ (event.EventType , TransferSession::OutputEventType::kNone );
125
125
}
126
126
127
+ void VerifyInternalError (TransferSession & transferSession)
128
+ {
129
+ TransferSession::OutputEvent event;
130
+ transferSession.PollOutput (event, kNoAdvanceTime );
131
+ EXPECT_EQ (event.EventType , TransferSession::OutputEventType::kInternalError );
132
+ }
133
+
127
134
// Helper method for initializing two TransferSession objects, generating a TransferInit message, and passing it to a responding
128
135
// TransferSession.
129
136
void SendAndVerifyTransferInit (TransferSession::OutputEvent & outEvent, System::Clock::Timeout timeout, TransferSession & initiator,
@@ -235,6 +242,30 @@ void SendAndVerifyAcceptMsg(TransferSession::OutputEvent & outEvent, TransferSes
235
242
EXPECT_LE (acceptReceiver.GetTransferBlockSize (), initData.MaxBlockSize );
236
243
}
237
244
245
+ void SendAndVerifyRejectMsg (TransferSession::OutputEvent & outEvent, TransferSession & rejectSender, StatusCode reason,
246
+ TransferSession & rejectReceiver)
247
+ {
248
+ CHIP_ERROR err = rejectSender.RejectTransfer (reason);
249
+ EXPECT_EQ (err, CHIP_NO_ERROR);
250
+
251
+ // Verify Sender emits status message for sending
252
+ rejectSender.PollOutput (outEvent, kNoAdvanceTime );
253
+ VerifyNoMoreOutput (rejectSender);
254
+ EXPECT_EQ (outEvent.EventType , TransferSession::OutputEventType::kMsgToSend );
255
+ System::PacketBufferHandle statusReportMsg = outEvent.MsgData .Retain ();
256
+ VerifyStatusReport (std::move (outEvent.MsgData ), reason);
257
+
258
+ // Pass status message to rejectReceiver
259
+ err = AttachHeaderAndSend (outEvent.msgTypeData , std::move (outEvent.MsgData ), rejectReceiver);
260
+ EXPECT_EQ (err, CHIP_NO_ERROR);
261
+
262
+ // Verify received status message.
263
+ rejectReceiver.PollOutput (outEvent, kNoAdvanceTime );
264
+ VerifyInternalError (rejectReceiver);
265
+ EXPECT_EQ (outEvent.EventType , TransferSession::OutputEventType::kStatusReceived );
266
+ EXPECT_EQ (outEvent.statusData .statusCode , reason);
267
+ }
268
+
238
269
// Helper method for preparing a sending a BlockQuery message between two TransferSession objects.
239
270
void SendAndVerifyQuery (TransferSession & queryReceiver, TransferSession & querySender, TransferSession::OutputEvent & outEvent)
240
271
{
@@ -698,3 +729,33 @@ TEST_F(TestBdxTransferSession, TestDuplicateBlockError)
698
729
EXPECT_EQ (outEvent.statusData .statusCode , StatusCode::kBadBlockCounter );
699
730
}
700
731
}
732
+
733
+ TEST_F (TestBdxTransferSession, TestRejectTransfer)
734
+ {
735
+ TransferSession::OutputEvent outEvent;
736
+ TransferSession initiatingReceiver;
737
+ TransferSession respondingSender;
738
+
739
+ // Chosen arbitrarily for this test
740
+ uint16_t proposedBlockSize = 128 ;
741
+ System::Clock::Timeout timeout = System::Clock::Seconds16 (24 );
742
+ TransferControlFlags driveMode = TransferControlFlags::kReceiverDrive ;
743
+
744
+ // ReceiveInit parameters
745
+ TransferSession::TransferInitData initOptions;
746
+ initOptions.TransferCtlFlags = driveMode;
747
+ initOptions.MaxBlockSize = proposedBlockSize;
748
+ char testFileDes[9 ] = { " test.txt" };
749
+ initOptions.FileDesLength = static_cast <uint16_t >(strlen (testFileDes));
750
+ initOptions.FileDesignator = reinterpret_cast <uint8_t *>(testFileDes);
751
+
752
+ // Initialize respondingSender and pass ReceiveInit message
753
+ BitFlags<TransferControlFlags> senderOpts;
754
+ senderOpts.Set (driveMode);
755
+
756
+ SendAndVerifyTransferInit (outEvent, timeout, initiatingReceiver, TransferRole::kReceiver , initOptions, respondingSender,
757
+ senderOpts, proposedBlockSize);
758
+
759
+ // Reject the transfer with a status
760
+ SendAndVerifyRejectMsg (outEvent, respondingSender, StatusCode::kResponderBusy , initiatingReceiver);
761
+ }
0 commit comments