From 7f895a7a3857acf74814f65087d15566978b55d2 Mon Sep 17 00:00:00 2001 From: kongr45gpen <electrovesta@gmail.com> Date: Sat, 10 Aug 2019 13:41:13 +0300 Subject: [PATCH] Add MessageParser tests --- inc/etl/String.hpp | 5 ---- src/MessageParser.cpp | 6 +++-- test/MessageParser.cpp | 52 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/inc/etl/String.hpp b/inc/etl/String.hpp index d393c676..c771556a 100644 --- a/inc/etl/String.hpp +++ b/inc/etl/String.hpp @@ -70,11 +70,6 @@ public: etl::string<MAX_SIZE>::append(reinterpret_cast<const char*>(data), n); return *this; } - -// String& append(const String<MAX_SIZE> & str) { -// etl::string<MAX_SIZE>::append(str); -// return *this; -// } }; #endif // ECSS_SERVICES_ETL_STRING_HPP diff --git a/src/MessageParser.cpp b/src/MessageParser.cpp index 2c6534e7..c15dafe4 100644 --- a/src/MessageParser.cpp +++ b/src/MessageParser.cpp @@ -50,6 +50,7 @@ Message MessageParser::parse(uint8_t* data, uint32_t length) { uint8_t secondaryHeaderFlag = data[0] & static_cast<uint8_t>(0x08); uint16_t APID = packetHeaderIdentification & static_cast<uint16_t>(0x07ff); auto sequenceFlags = static_cast<uint8_t>(packetSequenceControl >> 14); + uint16_t packetSequenceCount = packetSequenceControl & (~ 0xc000u); // keep last 14 bits // Returning an internal error, since the Message is not available yet ASSERT_INTERNAL(versionNumber == 0U, ErrorHandler::UnacceptablePacket); @@ -58,6 +59,7 @@ Message MessageParser::parse(uint8_t* data, uint32_t length) { ASSERT_INTERNAL(packetDataLength == (length - 6U), ErrorHandler::UnacceptablePacket); Message message(0, 0, packetType, APID); + message.packetSequenceCount = packetSequenceCount; if (packetType == Message::TC) { parseECSSTCHeader(data + 6, packetDataLength, message); @@ -150,10 +152,10 @@ String<CCSDS_MAX_MESSAGE_SIZE> MessageParser::compose(const Message& message) { ASSERT_INTERNAL((ecssMessage.size() + 6U) <= CCSDS_MAX_MESSAGE_SIZE, ErrorHandler::StringTooLarge); // Parts of the header - uint16_t packetId = 0; // TODO: Add the APID here + uint16_t packetId = message.applicationId; packetId |= (1U << 11U); // Secondary header flag packetId |= (message.packetType == Message::TC) ? (1U << 12U) : (0U); // Ignore-MISRA - uint16_t packetSequenceControl = message.packetSequenceCount; + uint16_t packetSequenceControl = message.packetSequenceCount | (3U << 14U); uint16_t packetDataLength = ecssMessage.size(); // Compile the header diff --git a/test/MessageParser.cpp b/test/MessageParser.cpp index 10bd4f5f..c416f1b5 100644 --- a/test/MessageParser.cpp +++ b/test/MessageParser.cpp @@ -9,30 +9,68 @@ TEST_CASE("TC message parsing", "[MessageParser]") { - MessageParser messageParser; - uint8_t packet[] = {0x18, 0x07, 0xc0, 0x4d, 0x00, 0x0a, 0x20, 0x81, 0x1f, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f}; + uint8_t packet[] = {0x18, 0x07, 0xe0, 0x07, 0x00, 0x0a, 0x20, 0x81, 0x1f, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f}; - Message message = messageParser.parse(packet, 16); + Message message = MessageParser::parse(packet, 16); CHECK(message.packetType == Message::TC); CHECK(message.applicationId == 7); + CHECK(message.packetSequenceCount == 8199); CHECK(message.dataSize == 5); CHECK(message.serviceType == 129); CHECK(message.messageType == 31); CHECK(memcmp(message.data, "hello", 5) == 0); } -TEST_CASE("TC string parsing into a message", "[MessageParser]") {} +TEST_CASE("TC Message parsing into a string", "[MessageParser]") { + uint8_t wantedPacket[] = {0x18, 0x07, 0xe0, 0x07, 0x00, 0x0a, 0x20, 0x81, 0x1f, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, + 0x6f}; + + Message message; + message.packetType = Message::TC; + message.applicationId = 7; + message.serviceType = 129; + message.messageType = 31; + message.packetSequenceCount = 8199; + memcpy(message.data, "hello", 5); + message.dataSize = 5; + + String<CCSDS_MAX_MESSAGE_SIZE> createdPacket = MessageParser::compose(message); + + CHECK(createdPacket.size() == 16); + // The two parentheses are necessary so that Catch2 doesn't try to parse the strings here + CHECK((createdPacket == String<16>(wantedPacket))); +} TEST_CASE("TM message parsing", "[MessageParser]") { - MessageParser messageParser; uint8_t packet[] = {0x08, 0x02, 0xc0, 0x4d, 0x00, 0x0c, 0x20, 0x16, 0x11, - 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x68, 0x69}; + 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x68, 0x69}; - Message message = messageParser.parse(packet, 18); + Message message = MessageParser::parse(packet, 18); CHECK(message.packetType == Message::TM); CHECK(message.applicationId == 2); + CHECK(message.packetSequenceCount == 77); CHECK(message.dataSize == 7); CHECK(message.serviceType == 22); CHECK(message.messageType == 17); CHECK(memcmp(message.data, "hellohi", 7) == 0); } + +TEST_CASE("TM Message parsing into a string", "[MessageParser]") { + uint8_t wantedPacket[] = {0x08, 0x02, 0xc0, 0x4d, 0x00, 0x0c, 0x20, 0x16, 0x11, + 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x68, 0x69}; + + Message message; + message.packetType = Message::TM; + message.applicationId = 2; + message.packetSequenceCount = 77; + message.serviceType = 22; + message.messageType = 17; + memcpy(message.data, "hellohi", 7); + message.dataSize = 7; + + String<CCSDS_MAX_MESSAGE_SIZE> createdPacket = MessageParser::compose(message); + + CHECK(createdPacket.size() == 18); + // The two parentheses are necessary so that Catch2 doesn't try to parse the strings here + CHECK((createdPacket == String<18>(wantedPacket))); +} -- GitLab