Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit da98298

Browse files
harimau-qirexandy31415
authored andcommittedJul 31, 2024
Add the missing implementation for BdxTransferSession::RejectTransfer. (project-chip#34484)
* Add the missing implementation for BdxTransferSession::RejectTransfer. * Style fix. --------- Co-authored-by: Andrei Litvin <andy314@gmail.com>
1 parent 0c86d5a commit da98298

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed
 

‎src/protocols/bdx/BdxTransferSession.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,17 @@ CHIP_ERROR TransferSession::AcceptTransfer(const TransferAcceptData & acceptData
261261
return CHIP_NO_ERROR;
262262
}
263263

264+
CHIP_ERROR TransferSession::RejectTransfer(StatusCode reason)
265+
{
266+
VerifyOrReturnError(mState == TransferState::kNegotiateTransferParams, CHIP_ERROR_INCORRECT_STATE);
267+
VerifyOrReturnError(mPendingOutput == OutputEventType::kNone, CHIP_ERROR_INCORRECT_STATE);
268+
269+
PrepareStatusReport(reason);
270+
mState = TransferState::kTransferDone;
271+
272+
return CHIP_NO_ERROR;
273+
}
274+
264275
CHIP_ERROR TransferSession::PrepareBlockQuery()
265276
{
266277
const MessageType msgType = MessageType::BlockQuery;

‎src/protocols/bdx/tests/TestBdxTransferSession.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,13 @@ void VerifyNoMoreOutput(TransferSession & transferSession)
124124
EXPECT_EQ(event.EventType, TransferSession::OutputEventType::kNone);
125125
}
126126

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+
127134
// Helper method for initializing two TransferSession objects, generating a TransferInit message, and passing it to a responding
128135
// TransferSession.
129136
void SendAndVerifyTransferInit(TransferSession::OutputEvent & outEvent, System::Clock::Timeout timeout, TransferSession & initiator,
@@ -235,6 +242,30 @@ void SendAndVerifyAcceptMsg(TransferSession::OutputEvent & outEvent, TransferSes
235242
EXPECT_LE(acceptReceiver.GetTransferBlockSize(), initData.MaxBlockSize);
236243
}
237244

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+
238269
// Helper method for preparing a sending a BlockQuery message between two TransferSession objects.
239270
void SendAndVerifyQuery(TransferSession & queryReceiver, TransferSession & querySender, TransferSession::OutputEvent & outEvent)
240271
{
@@ -698,3 +729,33 @@ TEST_F(TestBdxTransferSession, TestDuplicateBlockError)
698729
EXPECT_EQ(outEvent.statusData.statusCode, StatusCode::kBadBlockCounter);
699730
}
700731
}
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

Comments
 (0)
Please sign in to comment.