|
|
|
@@ -63,7 +63,7 @@ TEST_CASE("CFDP Source Handler", "[cfdp]") {
|
|
|
|
|
PutRequest putRequest(remoteId, srcNameLv, destNameLv);
|
|
|
|
|
CHECK(sourceHandler.initialize() == OK);
|
|
|
|
|
|
|
|
|
|
auto onePduSentCheck = [&](SourceHandler::FsmResult& fsmResult, TmTcMessage& tmtcMessage,
|
|
|
|
|
auto onePduSentCheck = [&](const SourceHandler::FsmResult& fsmResult, TmTcMessage& tmtcMessage,
|
|
|
|
|
const uint8_t** pduPtr) {
|
|
|
|
|
CHECK(fsmResult.errors == 0);
|
|
|
|
|
CHECK(fsmResult.packetsSent == 1);
|
|
|
|
@@ -74,9 +74,10 @@ TEST_CASE("CFDP Source Handler", "[cfdp]") {
|
|
|
|
|
*pduPtr = accessor.second.data();
|
|
|
|
|
return std::move(accessor);
|
|
|
|
|
};
|
|
|
|
|
auto genericMetadataCheck = [&](SourceHandler::FsmResult& fsmResult, size_t expectedFileSize,
|
|
|
|
|
uint16_t expectedSeqNum) {
|
|
|
|
|
auto genericMetadataCheck = [&](const SourceHandler::FsmResult& fsmResult,
|
|
|
|
|
size_t expectedFileSize, uint16_t expectedSeqNum) {
|
|
|
|
|
CHECK(fsmResult.errors == 0);
|
|
|
|
|
CHECK(fsmResult.callStatus == CallStatus::CALL_AGAIN);
|
|
|
|
|
TmTcMessage tmtcMessage;
|
|
|
|
|
const uint8_t* pduPtr;
|
|
|
|
|
auto accessor = onePduSentCheck(fsmResult, tmtcMessage, &pduPtr);
|
|
|
|
@@ -108,9 +109,10 @@ TEST_CASE("CFDP Source Handler", "[cfdp]") {
|
|
|
|
|
CHECK(!metadataInfo.isClosureRequested());
|
|
|
|
|
mqMock.clearMessages();
|
|
|
|
|
};
|
|
|
|
|
auto genericEofCheck = [&](SourceHandler::FsmResult& fsmResult, size_t expectedFileSize,
|
|
|
|
|
auto genericEofCheck = [&](const SourceHandler::FsmResult& fsmResult, size_t expectedFileSize,
|
|
|
|
|
uint32_t expectedChecksum, uint16_t expectedSeqNum) {
|
|
|
|
|
CHECK(fsmResult.errors == 0);
|
|
|
|
|
CHECK(fsmResult.callStatus == CallStatus::CALL_AGAIN);
|
|
|
|
|
TmTcMessage tmtcMessage;
|
|
|
|
|
const uint8_t* pduPtr;
|
|
|
|
|
auto accessor = onePduSentCheck(fsmResult, tmtcMessage, &pduPtr);
|
|
|
|
@@ -126,12 +128,20 @@ TEST_CASE("CFDP Source Handler", "[cfdp]") {
|
|
|
|
|
auto transactionId = TransactionId(localId, seqNum);
|
|
|
|
|
CHECK(userMock.eofSentRecvd.size() == 1);
|
|
|
|
|
CHECK(userMock.eofSentRecvd.back() == transactionId);
|
|
|
|
|
CHECK(userMock.finishedRecvd.size() == 1);
|
|
|
|
|
CHECK(userMock.finishedRecvd.back().first == transactionId);
|
|
|
|
|
CHECK(eofInfo.getChecksum() == expectedChecksum);
|
|
|
|
|
CHECK(eofInfo.getConditionCode() == ConditionCode::NO_ERROR);
|
|
|
|
|
CHECK(eofInfo.getFileSize().value() == expectedFileSize);
|
|
|
|
|
};
|
|
|
|
|
auto genericNoticeOfCompletionCheck = [&](const SourceHandler::FsmResult& fsmResult,
|
|
|
|
|
uint16_t expectedSeqNum) {
|
|
|
|
|
CHECK(fsmResult.callStatus == CallStatus::DONE);
|
|
|
|
|
CHECK(userMock.finishedRecvd.size() == 1);
|
|
|
|
|
CHECK(userMock.finishedRecvd.back().first ==
|
|
|
|
|
TransactionId(localId, TransactionSeqNum(cfdp::WidthInBytes::TWO_BYTES, expectedSeqNum)));
|
|
|
|
|
CHECK(sourceHandler.getStep() == SourceHandler::TransactionStep::IDLE);
|
|
|
|
|
CHECK(sourceHandler.getState() == CfdpState::IDLE);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
SECTION("Test Basic") {
|
|
|
|
|
CHECK(sourceHandler.getState() == CfdpState::IDLE);
|
|
|
|
|
CHECK(sourceHandler.getStep() == SourceHandler::TransactionStep::IDLE);
|
|
|
|
@@ -141,16 +151,17 @@ TEST_CASE("CFDP Source Handler", "[cfdp]") {
|
|
|
|
|
CHECK(sourceHandler.transactionStart(putRequest, cfg) == OK);
|
|
|
|
|
|
|
|
|
|
size_t expectedFileSize = 0;
|
|
|
|
|
SourceHandler::FsmResult& fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
const SourceHandler::FsmResult& fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
// Verify metadata PDU was sent.
|
|
|
|
|
genericMetadataCheck(fsmResult, expectedFileSize, 0);
|
|
|
|
|
|
|
|
|
|
fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
sourceHandler.stateMachine();
|
|
|
|
|
// Verify EOF PDU was sent. No file data PDU is sent for an empty file and the checksum is 0.
|
|
|
|
|
genericEofCheck(fsmResult, expectedFileSize, 0, 0);
|
|
|
|
|
|
|
|
|
|
CHECK(sourceHandler.getStep() == SourceHandler::TransactionStep::IDLE);
|
|
|
|
|
CHECK(sourceHandler.getState() == CfdpState::IDLE);
|
|
|
|
|
// Verify notice of completion.
|
|
|
|
|
sourceHandler.stateMachine();
|
|
|
|
|
genericNoticeOfCompletionCheck(fsmResult, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SECTION("Transfer small file") {
|
|
|
|
@@ -161,13 +172,13 @@ TEST_CASE("CFDP Source Handler", "[cfdp]") {
|
|
|
|
|
FileOpParams params(srcFileName.c_str(), expectedFileSize);
|
|
|
|
|
fsMock.writeToFile(params, reinterpret_cast<const uint8_t*>(fileContent.data()));
|
|
|
|
|
CHECK(sourceHandler.transactionStart(putRequest, cfg) == OK);
|
|
|
|
|
SourceHandler::FsmResult& fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
const SourceHandler::FsmResult& fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
|
|
|
|
|
// Verify metadata PDU was sent.
|
|
|
|
|
genericMetadataCheck(fsmResult, expectedFileSize, expectedSeqNum);
|
|
|
|
|
|
|
|
|
|
// Verify that a small file data PDU was sent.
|
|
|
|
|
fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
sourceHandler.stateMachine();
|
|
|
|
|
TmTcMessage tmtcMessage;
|
|
|
|
|
const uint8_t* pduPtr;
|
|
|
|
|
auto accessor = onePduSentCheck(fsmResult, tmtcMessage, &pduPtr);
|
|
|
|
@@ -185,15 +196,16 @@ TEST_CASE("CFDP Source Handler", "[cfdp]") {
|
|
|
|
|
CHECK(dataReadBack == fileContent);
|
|
|
|
|
mqMock.clearMessages();
|
|
|
|
|
|
|
|
|
|
fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
sourceHandler.stateMachine();
|
|
|
|
|
|
|
|
|
|
etl::crc32 crcCalc;
|
|
|
|
|
crcCalc.add(fileContent.data(), fileContent.data() + fileContent.size());
|
|
|
|
|
// Verify EOF PDU was sent.
|
|
|
|
|
genericEofCheck(fsmResult, expectedFileSize, crcCalc.value(), expectedSeqNum);
|
|
|
|
|
|
|
|
|
|
CHECK(sourceHandler.getStep() == SourceHandler::TransactionStep::IDLE);
|
|
|
|
|
CHECK(sourceHandler.getState() == CfdpState::IDLE);
|
|
|
|
|
// Verify notice of completion.
|
|
|
|
|
sourceHandler.stateMachine();
|
|
|
|
|
genericNoticeOfCompletionCheck(fsmResult, expectedSeqNum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SECTION("Transfer two segment file") {
|
|
|
|
@@ -212,16 +224,17 @@ TEST_CASE("CFDP Source Handler", "[cfdp]") {
|
|
|
|
|
FileOpParams params(srcFileName.c_str(), expectedFileSize);
|
|
|
|
|
fsMock.writeToFile(params, reinterpret_cast<const uint8_t*>(largerFileData.data()));
|
|
|
|
|
CHECK(sourceHandler.transactionStart(putRequest, cfg) == OK);
|
|
|
|
|
SourceHandler::FsmResult& fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
const SourceHandler::FsmResult& fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
// Verify metadata PDU was sent.
|
|
|
|
|
genericMetadataCheck(fsmResult, expectedFileSize, expectedSeqNum);
|
|
|
|
|
|
|
|
|
|
// Check first file data PDU. It should have the maximum file segment size.
|
|
|
|
|
fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
sourceHandler.stateMachine();
|
|
|
|
|
TmTcMessage tmtcMessage;
|
|
|
|
|
const uint8_t* pduPtr;
|
|
|
|
|
FileDataInfo fdInfo;
|
|
|
|
|
{
|
|
|
|
|
CHECK(fsmResult.callStatus == CallStatus::CALL_AGAIN);
|
|
|
|
|
auto accessor = onePduSentCheck(fsmResult, tmtcMessage, &pduPtr);
|
|
|
|
|
FileDataReader fdReader(pduPtr, accessor.second.size(), fdInfo);
|
|
|
|
|
// 10 byte PDU header, 4 byte offset, 255 byte file data
|
|
|
|
@@ -239,31 +252,35 @@ TEST_CASE("CFDP Source Handler", "[cfdp]") {
|
|
|
|
|
mqMock.clearMessages();
|
|
|
|
|
|
|
|
|
|
// Check second file data PDU.
|
|
|
|
|
fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
auto accessor = onePduSentCheck(fsmResult, tmtcMessage, &pduPtr);
|
|
|
|
|
FileDataReader fdReader(pduPtr, accessor.second.size(), fdInfo);
|
|
|
|
|
// 10 byte PDU header, 4 byte offset, remaining file data (400 - 255 == 145).
|
|
|
|
|
CHECK(accessor.second.size() == 10 + 4 + largerFileData.size() - MAX_FILE_SEGMENT_SIZE);
|
|
|
|
|
CHECK(fdReader.parseData() == OK);
|
|
|
|
|
CHECK(fdInfo.getOffset().value() == MAX_FILE_SEGMENT_SIZE);
|
|
|
|
|
size_t fileDataSize = 0;
|
|
|
|
|
const uint8_t* fileData = fdInfo.getFileData(&fileDataSize);
|
|
|
|
|
// Maximum file segment size.
|
|
|
|
|
REQUIRE(fileDataSize == largerFileData.size() - MAX_FILE_SEGMENT_SIZE);
|
|
|
|
|
for (unsigned i = 0; i < fileDataSize; i++) {
|
|
|
|
|
CHECK(fileData[i] == largerFileData[MAX_FILE_SEGMENT_SIZE + i]);
|
|
|
|
|
sourceHandler.stateMachine();
|
|
|
|
|
{
|
|
|
|
|
CHECK(fsmResult.callStatus == CallStatus::CALL_AGAIN);
|
|
|
|
|
auto accessor = onePduSentCheck(fsmResult, tmtcMessage, &pduPtr);
|
|
|
|
|
FileDataReader fdReader(pduPtr, accessor.second.size(), fdInfo);
|
|
|
|
|
// 10 byte PDU header, 4 byte offset, remaining file data (400 - 255 == 145).
|
|
|
|
|
CHECK(accessor.second.size() == 10 + 4 + largerFileData.size() - MAX_FILE_SEGMENT_SIZE);
|
|
|
|
|
CHECK(fdReader.parseData() == OK);
|
|
|
|
|
CHECK(fdInfo.getOffset().value() == MAX_FILE_SEGMENT_SIZE);
|
|
|
|
|
size_t fileDataSize = 0;
|
|
|
|
|
const uint8_t* fileData = fdInfo.getFileData(&fileDataSize);
|
|
|
|
|
// Maximum file segment size.
|
|
|
|
|
REQUIRE(fileDataSize == largerFileData.size() - MAX_FILE_SEGMENT_SIZE);
|
|
|
|
|
for (unsigned i = 0; i < fileDataSize; i++) {
|
|
|
|
|
CHECK(fileData[i] == largerFileData[MAX_FILE_SEGMENT_SIZE + i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mqMock.clearMessages();
|
|
|
|
|
|
|
|
|
|
// Check EOF and verify checksum.
|
|
|
|
|
fsmResult = sourceHandler.stateMachine();
|
|
|
|
|
sourceHandler.stateMachine();
|
|
|
|
|
|
|
|
|
|
etl::crc32 crcCalc;
|
|
|
|
|
crcCalc.add(largerFileData.data(), largerFileData.data() + largerFileData.size());
|
|
|
|
|
// Verify EOF PDU was sent.
|
|
|
|
|
genericEofCheck(fsmResult, expectedFileSize, crcCalc.value(), expectedSeqNum);
|
|
|
|
|
|
|
|
|
|
CHECK(sourceHandler.getStep() == SourceHandler::TransactionStep::IDLE);
|
|
|
|
|
CHECK(sourceHandler.getState() == CfdpState::IDLE);
|
|
|
|
|
// Verify notice of completion.
|
|
|
|
|
sourceHandler.stateMachine();
|
|
|
|
|
genericNoticeOfCompletionCheck(fsmResult, expectedSeqNum);
|
|
|
|
|
}
|
|
|
|
|
}
|