From 428da017bae2d83310fa3bc142253afe73990497 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 6 Sep 2022 13:45:43 +0200 Subject: [PATCH] empty file transfer unittest almost done --- src/fsfw/cfdp/handler/DestHandler.cpp | 3 +++ unittests/cfdp/handler/testDestHandler.cpp | 18 +++++++++++++++++- unittests/mocks/cfdp/UserMock.cpp | 8 +++++--- unittests/mocks/cfdp/UserMock.h | 1 + 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/fsfw/cfdp/handler/DestHandler.cpp b/src/fsfw/cfdp/handler/DestHandler.cpp index 6cda227e..e1578c9b 100644 --- a/src/fsfw/cfdp/handler/DestHandler.cpp +++ b/src/fsfw/cfdp/handler/DestHandler.cpp @@ -224,6 +224,9 @@ ReturnValue_t cfdp::DestHandler::handleEofPdu(const cfdp::PacketInfo& info) { } tp.fileSize.setFileSize(fileSizeFromEof, std::nullopt); } + if (dp.cfg.indicCfg.eofRecvIndicRequired) { + dp.user.eofRecvIndication(getTransactionId()); + } if (fsmRes.step == TransactionStep::RECEIVING_FILE_DATA_PDUS) { if (fsmRes.state == CfdpStates::BUSY_CLASS_1_NACKED) { fsmRes.step = TransactionStep::TRANSFER_COMPLETION; diff --git a/unittests/cfdp/handler/testDestHandler.cpp b/unittests/cfdp/handler/testDestHandler.cpp index 388f766d..7a3253a2 100644 --- a/unittests/cfdp/handler/testDestHandler.cpp +++ b/unittests/cfdp/handler/testDestHandler.cpp @@ -66,7 +66,7 @@ TEST_CASE("CFDP Dest Handler", "[cfdp]") { StringLv destName(destNameString); FileSize cfdpFileSize(0); MetadataInfo info(false, cfdp::ChecksumTypes::NULL_CHECKSUM, size, srcName, destName); - auto seqNum = TransactionSeqNum(UnsignedByteField(1)); + TransactionSeqNum seqNum(UnsignedByteField(1)); PduConfig conf(remoteId, localId, TransmissionModes::UNACKNOWLEDGED, seqNum); MetadataPduCreator metadataCreator(conf, info); store_address_t storeId; @@ -82,6 +82,7 @@ TEST_CASE("CFDP Dest Handler", "[cfdp]") { REQUIRE(res.callStatus == CallStatus::CALL_AGAIN); // Assert that the packet was deleted after handling REQUIRE(not tcStore.hasDataAtId(storeId)); + REQUIRE(packetInfoList.empty()); destHandler.performStateMachine(); REQUIRE(userMock.metadataRecvd.size() == 1); MetadataRecvdParams& params = userMock.metadataRecvd.back(); @@ -90,6 +91,7 @@ TEST_CASE("CFDP Dest Handler", "[cfdp]") { REQUIRE(params.fileSize == 0); REQUIRE(strcmp(params.destFileName, "hello-cpy.txt") == 0); REQUIRE(strcmp(params.sourceFileName, "hello.txt") == 0); + userMock.metadataRecvd.pop(); REQUIRE(fsMock.fileMap.find("hello-cpy.txt") != fsMock.fileMap.end()); REQUIRE(res.result == OK); REQUIRE(res.callStatus == CallStatus::CALL_AFTER_DELAY); @@ -99,6 +101,20 @@ TEST_CASE("CFDP Dest Handler", "[cfdp]") { EofPduCreator eofCreator(conf, eofInfo); REQUIRE(tcStore.getFreeElement(&storeId, eofCreator.getSerializedSize(), &ptr) == OK); REQUIRE(eofCreator.serialize(ptr, serLen, eofCreator.getSerializedSize()) == OK); + packetInfo = PacketInfo(eofCreator.getPduType(), eofCreator.getDirectiveCode(), storeId); + packetInfoList.push_back(packetInfo); + auto transactionId = destHandler.getTransactionId(); + // After EOF, operation is done because no closure was requested + destHandler.performStateMachine(); + REQUIRE(res.result == OK); + REQUIRE(res.state == CfdpStates::IDLE); + REQUIRE(res.step == DestHandler::TransactionStep::IDLE); + // Assert that the packet was deleted after handling + REQUIRE(not tcStore.hasDataAtId(storeId)); + REQUIRE(packetInfoList.empty()); + REQUIRE(userMock.eofsRevd.size() == 1); + auto& eofId = userMock.eofsRevd.back(); + CHECK(eofId == transactionId); } SECTION("Small File Transfer") {} diff --git a/unittests/mocks/cfdp/UserMock.cpp b/unittests/mocks/cfdp/UserMock.cpp index f701a28b..04d9f4f4 100644 --- a/unittests/mocks/cfdp/UserMock.cpp +++ b/unittests/mocks/cfdp/UserMock.cpp @@ -8,7 +8,9 @@ void UserMock::transactionIndication(const TransactionId& id) {} void UserMock::eofSentIndication(const TransactionId& id) {} void UserMock::abandonedIndication(const TransactionId& id, cfdp::ConditionCode code, uint64_t progress) {} -void UserMock::eofRecvIndication(const TransactionId& id) {} + +void UserMock::eofRecvIndication(const TransactionId& id) { eofsRevd.push(id); } + void UserMock::transactionFinishedIndication(const TransactionFinishedParams& finishedParams) {} void UserMock::metadataRecvdIndication(const MetadataRecvdParams& params) { @@ -24,8 +26,8 @@ void UserMock::faultIndication(const TransactionId& id, cfdp::ConditionCode code } void UserMock::reset() { - auto empty = std::queue(); - metadataRecvd.swap(empty); + std::queue().swap(eofsRevd); + std::queue().swap(metadataRecvd); } } // namespace cfdp diff --git a/unittests/mocks/cfdp/UserMock.h b/unittests/mocks/cfdp/UserMock.h index 523392bd..7d9cfef8 100644 --- a/unittests/mocks/cfdp/UserMock.h +++ b/unittests/mocks/cfdp/UserMock.h @@ -24,6 +24,7 @@ class UserMock : public UserBase { void faultIndication(const TransactionId& id, ConditionCode code, size_t progress) override; std::queue metadataRecvd; + std::queue eofsRevd; void reset(); };