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