From c0707b9f9874c7492628462afe8cce987fb4568f Mon Sep 17 00:00:00 2001 From: kpetridis <petridkon@gmail.com> Date: Sat, 23 Apr 2022 19:26:26 +0300 Subject: [PATCH] Finalized unit tests for adding report types of specified apps --- .idea/codeStyles/Project.xml | 10 +- inc/ECSS_Definitions.hpp | 2 +- inc/Helpers/AllMessageTypes.hpp | 76 ++++ inc/Helpers/ForwardControlConfiguration.hpp | 18 +- .../RealTimeForwardingControlService.hpp | 17 + .../RealTimeForwardingControlService.cpp | 66 ++- test/Services/RealTimeForwardingControl.cpp | 378 ++++++++---------- 7 files changed, 332 insertions(+), 235 deletions(-) create mode 100644 inc/Helpers/AllMessageTypes.hpp diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index e9c63b78..2afbb623 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -11,15 +11,15 @@ <option name="SPACE_BEFORE_REFERENCE_IN_DECLARATION" value="false" /> <option name="SPACE_AFTER_REFERENCE_IN_DECLARATION" value="true" /> </Objective-C> - <Objective-C-extensions> + <clangFormatSettings> + <option name="ENABLED" value="true" /> + </clangFormatSettings> + <files> <extensions> <pair source="cpp" header="hpp" fileNamingConvention="PASCAL_CASE" /> <pair source="c" header="h" fileNamingConvention="NONE" /> </extensions> - </Objective-C-extensions> - <clangFormatSettings> - <option name="ENABLED" value="true" /> - </clangFormatSettings> + </files> <codeStyleSettings language="ObjectiveC"> <option name="ALIGN_MULTILINE_CHAINED_METHODS" value="true" /> <option name="ALIGN_MULTILINE_FOR" value="false" /> diff --git a/inc/ECSS_Definitions.hpp b/inc/ECSS_Definitions.hpp index 48fbf0f1..866213d2 100644 --- a/inc/ECSS_Definitions.hpp +++ b/inc/ECSS_Definitions.hpp @@ -182,7 +182,7 @@ inline const uint8_t ECSSMaxReportTypeDefinitions = 20; * configuration * @see RealTimeForwardingControlService */ -inline const uint8_t ECSSMaxServiceTypeDefinitions = 15; +inline const uint8_t ECSSMaxServiceTypeDefinitions = 10; /** * The max number of event definition IDs per event report blocking type definition in the event report blocking diff --git a/inc/Helpers/AllMessageTypes.hpp b/inc/Helpers/AllMessageTypes.hpp new file mode 100644 index 00000000..33c6941d --- /dev/null +++ b/inc/Helpers/AllMessageTypes.hpp @@ -0,0 +1,76 @@ +#ifndef ECSS_SERVICES_ALLMESSAGETYPES_HPP +#define ECSS_SERVICES_ALLMESSAGETYPES_HPP + +#include "Services/RequestVerificationService.hpp" +#include "Services/HousekeepingService.hpp" +#include "Services/ParameterStatisticsService.hpp" +#include "Services/EventReportService.hpp" +#include "Services/MemoryManagementService.hpp" +#include "Services/TimeBasedSchedulingService.hpp" +#include "Services/LargePacketTransferService.hpp" +#include "Services/RealTimeForwardingControlService.hpp" +#include "Services/TestService.hpp" +#include "Services/EventActionService.hpp" +#include "Services/ParameterService.hpp" + +class AllMessageTypes { +public: + etl::vector<uint8_t, 15> st01Messages = {RequestVerificationService::MessageType::FailedAcceptanceReport, + RequestVerificationService::MessageType::FailedCompletionOfExecution, + RequestVerificationService::MessageType::FailedProgressOfExecution, + RequestVerificationService::MessageType::FailedRoutingReport, + RequestVerificationService::MessageType::FailedStartOfExecution, + RequestVerificationService::MessageType::SuccessfulAcceptanceReport, + RequestVerificationService::MessageType::SuccessfulCompletionOfExecution, + RequestVerificationService::MessageType::SuccessfulProgressOfExecution, + RequestVerificationService::MessageType::SuccessfulStartOfExecution}; + + etl::vector<uint8_t, 15> st03Messages = { + HousekeepingService::MessageType::DisablePeriodicHousekeepingParametersReport, + HousekeepingService::MessageType::EnablePeriodicHousekeepingParametersReport, + HousekeepingService::MessageType::GenerateOneShotHousekeepingReport, + HousekeepingService::MessageType::HousekeepingParametersReport, + HousekeepingService::MessageType::HousekeepingPeriodicPropertiesReport, + HousekeepingService::MessageType::HousekeepingStructuresReport}; + + etl::vector<uint8_t, 15> st04Messages = { + ParameterStatisticsService::MessageType::ParameterStatisticsDefinitionsReport, + ParameterStatisticsService::MessageType::ParameterStatisticsReport, + }; + + etl::vector<uint8_t, 15> st05Messages = {EventReportService::MessageType::HighSeverityAnomalyReport, + EventReportService::MessageType::DisabledListEventReport, + EventReportService::MessageType::InformativeEventReport, + EventReportService::MessageType::LowSeverityAnomalyReport, + EventReportService::MessageType::MediumSeverityAnomalyReport}; + + etl::vector<uint8_t, 15> st06Messages = {MemoryManagementService::MessageType::CheckRawMemoryDataReport, + MemoryManagementService::MessageType::DumpRawMemoryDataReport}; + + etl::vector<uint8_t, 15> st11Messages = {TimeBasedSchedulingService::MessageType::TimeBasedScheduledSummaryReport}; + + etl::vector<uint8_t, 15> st13Messages = {LargePacketTransferService::MessageType::FirstDownlinkPartReport, + LargePacketTransferService::MessageType::InternalDownlinkPartReport, + LargePacketTransferService::MessageType::LastDownlinkPartReport}; + + etl::vector<uint8_t, 15> st17Messages = {TestService::MessageType::AreYouAliveTestReport, + TestService::MessageType::OnBoardConnectionTestReport}; + + etl::vector<uint8_t, 15> st19Messages = {EventActionService::MessageType::EventActionStatusReport}; + + etl::vector<uint8_t, 15> st20Messages = {ParameterService::MessageType::ParameterValuesReport}; + + etl::map<uint8_t, etl::vector<uint8_t, 15>, 100> messagesOfService = { + {RequestVerificationService::ServiceType, st01Messages}, + {HousekeepingService::ServiceType, st03Messages}, + {ParameterStatisticsService::ServiceType, st04Messages}, + {EventReportService::ServiceType, st05Messages}, + {MemoryManagementService::ServiceType, st06Messages}, + {TimeBasedSchedulingService::ServiceType, st11Messages}, + {LargePacketTransferService::ServiceType, st13Messages}, + {TestService::ServiceType, st17Messages}, + {EventActionService::ServiceType, st19Messages}, + {ParameterService::ServiceType, st20Messages}}; +}; + +#endif diff --git a/inc/Helpers/ForwardControlConfiguration.hpp b/inc/Helpers/ForwardControlConfiguration.hpp index c542450b..00656cbe 100644 --- a/inc/Helpers/ForwardControlConfiguration.hpp +++ b/inc/Helpers/ForwardControlConfiguration.hpp @@ -46,17 +46,25 @@ public: typedef etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> reportTypeDefinitions; /** - * Map containing the Service Type definitions. Each Service Type definition is accessed via its key-name, of type - * uint8, for example '20' for the Parameter Management service. Each Service Type definition, contains the - * list of its own Report Type definitions. + * This is the key for the application process configuration map. It contains a pair with the applicationID and + * the serviceType. */ - typedef etl::map<uint8_t, reportTypeDefinitions, ECSSMaxServiceTypeDefinitions> serviceTypeDefinitions; + typedef std::pair<uint8_t, uint8_t> key; + + // /** + // * Map containing the Service Type definitions. Each Service Type definition is accessed via its key-name, of + //type + // * uint8, for example '20' for the Parameter Management service. Each Service Type definition, contains the + // * list of its own Report Type definitions. + // */ + // typedef etl::map<uint8_t, reportTypeDefinitions, ECSSMaxServiceTypeDefinitions> serviceTypeDefinitions; /** * Map containing the Application Process definitions. Each application has its own ID. The ID is used as a * key to provide access to the list of Service Type definitions, included by the application. */ - etl::map<uint8_t, serviceTypeDefinitions, ECSSMaxControlledApplicationProcesses> definitions; + etl::map<key, reportTypeDefinitions, ECSSMaxControlledApplicationProcesses * ECSSMaxServiceTypeDefinitions> + definitions; ApplicationProcess() = default; }; diff --git a/inc/Services/RealTimeForwardingControlService.hpp b/inc/Services/RealTimeForwardingControlService.hpp index 58361def..ef95db11 100644 --- a/inc/Services/RealTimeForwardingControlService.hpp +++ b/inc/Services/RealTimeForwardingControlService.hpp @@ -6,6 +6,7 @@ #include "ErrorHandler.hpp" #include "etl/vector.h" #include "Helpers/ForwardControlConfiguration.hpp" +#include "Helpers/AllMessageTypes.hpp" /** * Implementation of the ST[14] 'Real Time Forwarding Control Service' as defined in ECSS-E-ST-70-41C. @@ -37,6 +38,11 @@ public: RealTimeForwardingControlService() = default; + /** + * All the message types of every service type. + */ + AllMessageTypes allMessageTypes; + /** * Contains the Application IDs, controlled by the Service. */ @@ -60,6 +66,17 @@ public: ForwardControlConfiguration::EventReportBlocking eventReportBlockingConfiguration; private: + /** + * Counts the number of service types, stored for the specified application process. + */ + uint8_t countServicesOfApplication(uint8_t applicationID); + + /** + * + * Counts the number of report types, stored for the specified service type. + */ + uint8_t countReportsOfService(uint8_t applicationID, uint8_t serviceType); + /** * Checks whether the specified message type already exists in the specified application process and service * type definition. diff --git a/src/Services/RealTimeForwardingControlService.cpp b/src/Services/RealTimeForwardingControlService.cpp index a47bf769..3e9c0ebf 100644 --- a/src/Services/RealTimeForwardingControlService.cpp +++ b/src/Services/RealTimeForwardingControlService.cpp @@ -1,5 +1,21 @@ +#include <iostream> #include "Services/RealTimeForwardingControlService.hpp" +uint8_t RealTimeForwardingControlService::countServicesOfApplication(uint8_t applicationID) { + uint8_t serviceCounter = 0; + for (auto& definition : applicationProcessConfiguration.definitions) { + auto& pair = definition.first; + if (pair.first == applicationID) { + serviceCounter++; + } + } + return serviceCounter; +} + +uint8_t RealTimeForwardingControlService::countReportsOfService(uint8_t applicationID, uint8_t serviceType) { + return applicationProcessConfiguration.definitions[std::make_pair(applicationID, serviceType)].size(); +} + bool RealTimeForwardingControlService::appIsControlled(Message& request, uint8_t applicationId) { if (std::find(controlledApplications.begin(), controlledApplications.end(), applicationId) == controlledApplications.end()) { @@ -23,8 +39,7 @@ bool RealTimeForwardingControlService::checkApplicationOfAppProcessConfig(Messag } bool RealTimeForwardingControlService::allServiceTypesAllowed(Message& request, uint8_t applicationID) { - if (applicationProcessConfiguration.definitions[applicationID].empty() and - not applicationProcessConfiguration.notEmpty[applicationID].empty()) { + if (countServicesOfApplication(applicationID) >= ECSSMaxServiceTypeDefinitions) { ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::AllServiceTypesAlreadyAllowed); return true; } @@ -32,7 +47,8 @@ bool RealTimeForwardingControlService::allServiceTypesAllowed(Message& request, } bool RealTimeForwardingControlService::maxServiceTypesReached(Message& request, uint8_t applicationID) { - if (applicationProcessConfiguration.definitions[applicationID].size() >= ECSSMaxServiceTypeDefinitions) { + if (countServicesOfApplication(applicationID) >= ECSSMaxServiceTypeDefinitions) { +// std::cout<<"err22\n"; ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached); return true; } @@ -50,8 +66,9 @@ bool RealTimeForwardingControlService::checkService(Message& request, uint8_t ap bool RealTimeForwardingControlService::allReportTypesAllowed(Message& request, uint8_t applicationID, uint8_t serviceType) { - if (applicationProcessConfiguration.definitions[applicationID][serviceType].empty() and - applicationProcessConfiguration.notEmpty[applicationID][serviceType]) { +// std::cout<<"num mess= "<<static_cast<int>(countReportsOfService(applicationID, serviceType))<<"\n"; + if (countReportsOfService(applicationID, serviceType) >= allMessageTypes.messagesOfService[serviceType].size()) { +// std::cout<<"err23\n"; ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::AllReportTypesAlreadyAllowed); return true; } @@ -60,8 +77,7 @@ bool RealTimeForwardingControlService::allReportTypesAllowed(Message& request, u bool RealTimeForwardingControlService::maxReportTypesReached(Message& request, uint8_t applicationID, uint8_t serviceType) { - if (applicationProcessConfiguration.definitions[applicationID][serviceType].size() >= - ECSSMaxReportTypeDefinitions) { + if (countReportsOfService(applicationID, serviceType) >= allMessageTypes.messagesOfService[serviceType].size()) { ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::MaxReportTypesReached); return true; } @@ -79,52 +95,60 @@ bool RealTimeForwardingControlService::checkMessage(Message& request, uint8_t ap bool RealTimeForwardingControlService::reportExistsInAppProcessConfiguration(uint8_t applicationID, uint8_t serviceType, uint8_t messageType) { - return std::find(applicationProcessConfiguration.definitions[applicationID][serviceType].begin(), - applicationProcessConfiguration.definitions[applicationID][serviceType].end(), - messageType) != applicationProcessConfiguration.definitions[applicationID][serviceType].end(); + auto appServicePair = std::make_pair(applicationID, serviceType); + return std::find(applicationProcessConfiguration.definitions[appServicePair].begin(), + applicationProcessConfiguration.definitions[appServicePair].end(), + messageType) != applicationProcessConfiguration.definitions[appServicePair].end(); } void RealTimeForwardingControlService::addReportTypesToAppProcessConfiguration(Message& request) { request.assertTC(ServiceType, MessageType::AddReportTypesToAppProcessConfiguration); uint8_t numOfApplications = request.readUint8(); +// std::cout << static_cast<int>(numOfApplications) << "\n"; for (uint8_t i = 0; i < numOfApplications; i++) { uint8_t applicationID = request.readUint8(); uint8_t numOfServices = request.readUint8(); +// std::cout << "app= " << static_cast<int>(applicationID) << "\n"; if (not checkApplicationOfAppProcessConfig(request, applicationID, numOfServices)) { +// std::cout << "err1\n"; continue; } - if (numOfServices == 0) { - applicationProcessConfiguration.definitions[applicationID].clear(); - continue; - } + // if (numOfServices == 0) { + // applicationProcessConfiguration.definitions[applicationID].clear(); + // continue; + // } for (uint8_t j = 0; j < numOfServices; j++) { // todo: check if service type is valid. uint8_t serviceType = request.readUint8(); uint8_t numOfMessages = request.readUint8(); +// std::cout << "serv= " << static_cast<int>(serviceType) << "\n"; +// std::cout << "size= " << static_cast<int>(countServicesOfApplication(applicationID)) << "\n"; if (not checkService(request, applicationID, serviceType, numOfMessages)) { +// std::cout << "err2\n"; continue; } - if (numOfMessages == 0) { - applicationProcessConfiguration.definitions[applicationID][serviceType].clear(); - continue; - } + // if (numOfMessages == 0) { + // applicationProcessConfiguration.definitions[applicationID][serviceType].clear(); + // continue; + // } for (uint8_t k = 0; k < numOfMessages; k++) { uint8_t messageType = request.readUint8(); +// std::cout << "mess= " << static_cast<int>(messageType) << "\n"; if (not checkMessage(request, applicationID, serviceType, messageType)) { +// std::cout << "err3\n"; continue; } - // todo: check if message type is valid. - applicationProcessConfiguration.definitions[applicationID][serviceType].push_back(messageType); - applicationProcessConfiguration.notEmpty[applicationID][serviceType] = true; + applicationProcessConfiguration.definitions[std::make_pair(applicationID, serviceType)].push_back( + messageType); } } } diff --git a/test/Services/RealTimeForwardingControl.cpp b/test/Services/RealTimeForwardingControl.cpp index ebf08f41..ffb6f702 100644 --- a/test/Services/RealTimeForwardingControl.cpp +++ b/test/Services/RealTimeForwardingControl.cpp @@ -9,8 +9,8 @@ RealTimeForwardingControlService& realTimeForwarding = Services.realTimeForwardi uint8_t applications[] = {1}; uint8_t services[] = {3, 5}; -uint8_t allServices[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; -uint8_t redundantServices[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}; +uint8_t allServices[] = {1, 3, 4, 5, 6, 11, 13, 17, 19, 20}; +uint8_t redundantServices[] = {1, 3, 4, 5, 6, 11, 13, 17, 19, 20, 1, 3}; uint8_t messages1[] = {HousekeepingService::MessageType::HousekeepingPeriodicPropertiesReport, HousekeepingService::MessageType::DisablePeriodicHousekeepingParametersReport}; @@ -73,7 +73,7 @@ void validInvalidReportTypes(Message& request) { for (uint8_t i = 0; i < numOfApplications; i++) { request.appendUint8(applications2[i]); - uint8_t numOfServicesPerApp = (i == 0) ? 17 : 2; + uint8_t numOfServicesPerApp = (i == 0) ? 12 : 2; uint8_t* servicesToPick = (i == 0) ? redundantServices : services; request.appendUint8(numOfServicesPerApp); @@ -199,31 +199,24 @@ TEST_CASE("Add report types to the Application Process Configuration") { CHECK(ServiceTests::count() == 0); auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; - REQUIRE(applicationProcesses.size() == 1); + REQUIRE(applicationProcesses.size() == 2); for (auto appID : applications) { - REQUIRE(applicationProcesses.find(appID) != applicationProcesses.end()); - REQUIRE(applicationProcesses[appID].size() == 2); - for (uint8_t j = 0; j < 2; j++) { uint8_t serviceType = services[j]; - REQUIRE(applicationProcesses[appID].find(serviceType) != applicationProcesses[appID].end()); - REQUIRE(applicationProcesses[appID][serviceType].size() == 2); + auto appServicePair = std::make_pair(appID, serviceType); + REQUIRE(applicationProcesses.find(appServicePair) != applicationProcesses.end()); + REQUIRE(applicationProcesses[appServicePair].size() == 2); uint8_t* messages = (j == 0) ? messages1 : messages2; for (uint8_t k = 0; k < 2; k++) { - REQUIRE(std::find(applicationProcesses[appID][serviceType].begin(), - applicationProcesses[appID][serviceType].end(), - messages[k]) != applicationProcesses[appID][serviceType].end()); + REQUIRE(std::find(applicationProcesses[appServicePair].begin(), + applicationProcesses[appServicePair].end(), + messages[k]) != applicationProcesses[appServicePair].end()); } } } - auto& servicesAllowed = realTimeForwarding.applicationProcessConfiguration.notEmpty; - REQUIRE(servicesAllowed[applicationID].size() == 2); - REQUIRE(servicesAllowed[applicationID][services[0]] == true); - REQUIRE(servicesAllowed[applicationID][services[1]] == true); - resetAppProcessConfiguration(); ServiceTests::reset(); Services.reset(); @@ -258,16 +251,17 @@ TEST_CASE("Add report types to the Application Process Configuration") { realTimeForwarding.controlledApplications.push_back(applicationID); validReportTypes(request); - realTimeForwarding.applicationProcessConfiguration.definitions[applicationID].clear(); - CHECK(realTimeForwarding.applicationProcessConfiguration.definitions[applicationID].empty()); - realTimeForwarding.applicationProcessConfiguration.notEmpty[applicationID][services[0]] = true; + for (uint8_t i = 1; i < ECSSMaxServiceTypeDefinitions + 1; i++) { + realTimeForwarding.applicationProcessConfiguration.definitions[std::make_pair(applicationID, i)]; + } + CHECK(realTimeForwarding.applicationProcessConfiguration.definitions.size() == ECSSMaxServiceTypeDefinitions); MessageParser::execute(request); CHECK(ServiceTests::count() == 1); CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::AllServiceTypesAlreadyAllowed) == 1); - REQUIRE(realTimeForwarding.applicationProcessConfiguration.definitions[applicationID].empty()); + REQUIRE(realTimeForwarding.applicationProcessConfiguration.definitions.size() == ECSSMaxServiceTypeDefinitions); resetAppProcessConfiguration(); ServiceTests::reset(); @@ -280,24 +274,24 @@ TEST_CASE("Add report types to the Application Process Configuration") { Message::TC, 1); uint8_t applicationID = 1; + uint8_t serviceType1 = services[0]; // st03 + uint8_t serviceType2 = services[1]; // st05 + realTimeForwarding.controlledApplications.push_back(applicationID); validReportTypes(request); - auto& applicationProcessConfig = realTimeForwarding.applicationProcessConfiguration; + auto& applicationProcessConfig = realTimeForwarding.applicationProcessConfiguration.definitions; - for (auto service : allServices) { - applicationProcessConfig.definitions[applicationID][service].clear(); - applicationProcessConfig.notEmpty[applicationID][service] = true; + for (uint8_t i = 100; i < ECSSMaxServiceTypeDefinitions + 99; i++) { + applicationProcessConfig[std::make_pair(applicationID, i)]; } - REQUIRE(applicationProcessConfig.definitions[applicationID].size() == 15); - REQUIRE(applicationProcessConfig.notEmpty[applicationID].size() == 15); + CHECK(applicationProcessConfig.size() == ECSSMaxServiceTypeDefinitions - 1); MessageParser::execute(request); - CHECK(ServiceTests::count() == 2); - CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached) == 2); - REQUIRE(applicationProcessConfig.definitions[applicationID].size() == 15); - REQUIRE(applicationProcessConfig.notEmpty[applicationID].size() == 15); + CHECK(ServiceTests::count() == 1); + CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached) == 1); + REQUIRE(applicationProcessConfig.size() == ECSSMaxServiceTypeDefinitions); resetAppProcessConfiguration(); ServiceTests::reset(); @@ -310,20 +304,23 @@ TEST_CASE("Add report types to the Application Process Configuration") { Message::TC, 1); uint8_t applicationID = 1; - uint8_t serviceType = services[0]; + uint8_t serviceType = services[0]; // st03 realTimeForwarding.controlledApplications.push_back(applicationID); validReportTypes(request); - realTimeForwarding.applicationProcessConfiguration.definitions[applicationID][serviceType].clear(); - CHECK(realTimeForwarding.applicationProcessConfiguration.definitions[applicationID][serviceType].empty()); - realTimeForwarding.applicationProcessConfiguration.notEmpty[applicationID][serviceType] = true; + for (auto message : realTimeForwarding.allMessageTypes.st03Messages) { + realTimeForwarding.applicationProcessConfiguration.definitions[std::make_pair(applicationID, serviceType)] + .push_back(message); + } MessageParser::execute(request); CHECK(ServiceTests::count() == 1); CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::AllReportTypesAlreadyAllowed) == 1); - REQUIRE(realTimeForwarding.applicationProcessConfiguration.definitions[applicationID].size() == 2); + REQUIRE( + realTimeForwarding.applicationProcessConfiguration.definitions[std::make_pair(applicationID, serviceType)] + .size() == realTimeForwarding.allMessageTypes.messagesOfService[serviceType].size()); resetAppProcessConfiguration(); ServiceTests::reset(); @@ -336,31 +333,38 @@ TEST_CASE("Add report types to the Application Process Configuration") { Message::TC, 1); uint8_t applicationID = 1; - uint8_t serviceType = services[0]; + uint8_t serviceType1 = services[0]; // st03 + uint8_t serviceType2 = services[1]; // st05 + realTimeForwarding.controlledApplications.push_back(applicationID); validReportTypes(request); auto& applicationProcessConfig = realTimeForwarding.applicationProcessConfiguration; - applicationProcessConfig.notEmpty[applicationID][serviceType] = true; - for (uint8_t i = 0; i < ECSSMaxReportTypeDefinitions; i++) { - applicationProcessConfig.definitions[applicationID][serviceType].push_back(i); - } + auto appServicePair1 = std::make_pair(applicationID, serviceType1); + auto appServicePair2 = std::make_pair(applicationID, serviceType2); + REQUIRE(applicationProcessConfig.definitions[appServicePair1].empty()); + REQUIRE(applicationProcessConfig.definitions[appServicePair2].empty()); - REQUIRE(applicationProcessConfig.definitions[applicationID].size() == 1); - REQUIRE(applicationProcessConfig.notEmpty[applicationID].size() == 1); - REQUIRE(applicationProcessConfig.definitions[applicationID][serviceType].size() == - ECSSMaxReportTypeDefinitions); + auto numOfMessages1 = realTimeForwarding.allMessageTypes.messagesOfService[serviceType1].size(); + auto numOfMessages2 = realTimeForwarding.allMessageTypes.messagesOfService[serviceType2].size(); + + for (uint8_t i = 0; i < numOfMessages1 - 1; i++) { + applicationProcessConfig.definitions[appServicePair1].push_back(i); + } + for (uint8_t i = 16; i < numOfMessages2 + 15; i++) { + applicationProcessConfig.definitions[appServicePair2].push_back(i); + } + REQUIRE(applicationProcessConfig.definitions[appServicePair1].size() == numOfMessages1 - 1); + REQUIRE(applicationProcessConfig.definitions[appServicePair2].size() == numOfMessages2 - 1); MessageParser::execute(request); CHECK(ServiceTests::count() == 2); CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxReportTypesReached) == 2); - REQUIRE(applicationProcessConfig.definitions[applicationID].size() == 2); - REQUIRE(applicationProcessConfig.notEmpty[applicationID].size() == 2); - REQUIRE(applicationProcessConfig.definitions[applicationID][services[1]].size() == 2); - REQUIRE(applicationProcessConfig.definitions[applicationID][serviceType].size() == - ECSSMaxReportTypeDefinitions); + REQUIRE(applicationProcessConfig.definitions.size() == 2); + REQUIRE(applicationProcessConfig.definitions[appServicePair1].size() == numOfMessages1); + REQUIRE(applicationProcessConfig.definitions[appServicePair2].size() == numOfMessages2); resetAppProcessConfiguration(); ServiceTests::reset(); @@ -380,29 +384,19 @@ TEST_CASE("Add report types to the Application Process Configuration") { CHECK(ServiceTests::count() == 0); auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; - REQUIRE(applicationProcesses.size() == 1); + REQUIRE(applicationProcesses.size() == 2); for (auto appID : applications) { - REQUIRE(applicationProcesses.find(appID) != applicationProcesses.end()); - REQUIRE(applicationProcesses[appID].size() == 2); - for (auto& serviceType : services) { - REQUIRE(applicationProcesses[appID].find(serviceType) != applicationProcesses[appID].end()); - REQUIRE(applicationProcesses[appID][serviceType].size() == 1); - - for (uint8_t k = 0; k < 2; k++) { - REQUIRE(std::find(applicationProcesses[appID][serviceType].begin(), - applicationProcesses[appID][serviceType].end(), - messages1[0]) != applicationProcesses[appID][serviceType].end()); - } + auto appServicePair = std::make_pair(appID, serviceType); + REQUIRE(applicationProcesses.find(appServicePair) != applicationProcesses.end()); + REQUIRE(applicationProcesses[appServicePair].size() == 1); + REQUIRE(std::find(applicationProcesses[appServicePair].begin(), + applicationProcesses[appServicePair].end(), + messages1[0]) != applicationProcesses[appServicePair].end()); } } - auto& servicesAllowed = realTimeForwarding.applicationProcessConfiguration.notEmpty; - REQUIRE(servicesAllowed[applicationID].size() == 2); - REQUIRE(servicesAllowed[applicationID][services[0]] == true); - REQUIRE(servicesAllowed[applicationID][services[1]] == true); - resetAppProcessConfiguration(); ServiceTests::reset(); Services.reset(); @@ -412,7 +406,6 @@ TEST_CASE("Add report types to the Application Process Configuration") { Message request(RealTimeForwardingControlService::ServiceType, RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration, Message::TC, 1); - uint8_t applicationID1 = 1; uint8_t applicationID2 = 2; uint8_t applicationID3 = 3; @@ -420,102 +413,23 @@ TEST_CASE("Add report types to the Application Process Configuration") { realTimeForwarding.controlledApplications.push_back(applicationID3); validInvalidReportTypes(request); - realTimeForwarding.applicationProcessConfiguration.definitions[applicationID3].clear(); - CHECK(realTimeForwarding.applicationProcessConfiguration.definitions[applicationID3].empty()); - realTimeForwarding.applicationProcessConfiguration.notEmpty[applicationID3][services[0]] = true; - - MessageParser::execute(request); - - CHECK(ServiceTests::count() == 4); - CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::NotControlledApplication) == 1); - CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached) == 2); - CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::AllServiceTypesAlreadyAllowed) == - 1); - - auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; - auto& servicesAllowed = realTimeForwarding.applicationProcessConfiguration.notEmpty; - - REQUIRE(applicationProcesses.size() == 2); - REQUIRE(applicationProcesses.find(applicationID2) == applicationProcesses.end()); - REQUIRE(applicationProcesses.find(applicationID1) != applicationProcesses.end()); - REQUIRE(applicationProcesses.find(applicationID3) != applicationProcesses.end()); - - REQUIRE(applicationProcesses[applicationID1].size() == 15); - REQUIRE(servicesAllowed[applicationID1].size() == 15); - for (auto serviceType : allServices) { - REQUIRE(servicesAllowed[applicationID1][serviceType]); + for (uint8_t i = 100; i < ECSSMaxServiceTypeDefinitions + 99; i++) { + realTimeForwarding.applicationProcessConfiguration.definitions[std::make_pair(applicationID3, i)]; } - REQUIRE(applicationProcesses[applicationID3].empty()); - - for (auto& serviceType : applicationProcesses[applicationID1]) { - REQUIRE(std::find(std::begin(allServices), std::end(allServices), serviceType.first) != - std::end(allServices)); - REQUIRE(serviceType.second.size() == 2); - auto& messagesToCheck = (serviceType.first == 1) ? messages1 : messages2; - for (auto message : serviceType.second) { - REQUIRE(std::find(std::begin(messagesToCheck), std::end(messagesToCheck), message) != - std::end(messagesToCheck)); - } - } - - REQUIRE(servicesAllowed[applicationID3].size() == 1); - REQUIRE(servicesAllowed[applicationID3][services[0]] == true); - - resetAppProcessConfiguration(); - ServiceTests::reset(); - Services.reset(); - } - - SECTION("Valid addition of all report types of a specified service type") { - Message request(RealTimeForwardingControlService::ServiceType, - RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration, - Message::TC, 1); - uint8_t applicationID1 = 1; - realTimeForwarding.controlledApplications.push_back(applicationID1); - validAllReportsOfService(request); + CHECK(realTimeForwarding.applicationProcessConfiguration.definitions.size() == + ECSSMaxServiceTypeDefinitions - 1); MessageParser::execute(request); - CHECK(ServiceTests::count() == 0); - auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; - REQUIRE(applicationProcesses[applicationID1].size() == 2); - for (auto serviceType : services) { - REQUIRE(applicationProcesses[applicationID1].find(serviceType) != - applicationProcesses[applicationID1].end()); - REQUIRE(applicationProcesses[applicationID1][serviceType].empty()); - } - - resetAppProcessConfiguration(); - ServiceTests::reset(); - Services.reset(); - } - - SECTION("Addition of all report types of a service type, combined with invalid requests") { - Message request(RealTimeForwardingControlService::ServiceType, - RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration, - Message::TC, 1); - uint8_t applicationID1 = 1; - uint8_t applicationID2 = 2; - realTimeForwarding.controlledApplications.push_back(applicationID1); - realTimeForwarding.controlledApplications.push_back(applicationID2); - validInvalidAllReportsOfService(request); - - MessageParser::execute(request); - - CHECK(ServiceTests::count() == 3); + CHECK(ServiceTests::count() == 7); CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::NotControlledApplication) == 1); - CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached) == 2); + CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached) == 3); + CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxReportTypesReached) == 3); - auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; - REQUIRE(applicationProcesses.size() == 2); - REQUIRE(applicationProcesses[applicationID1].size() == 15); - REQUIRE(applicationProcesses[applicationID2].size() == 2); - - for (auto& serviceType : applicationProcesses[applicationID1]) { - REQUIRE(serviceType.second.empty()); - } - for (auto& serviceType : applicationProcesses[applicationID2]) { - REQUIRE(serviceType.second.empty()); + auto& definitions = realTimeForwarding.applicationProcessConfiguration.definitions; + REQUIRE(definitions.size() == 20); + for (auto serviceType : allServices) { + REQUIRE(definitions.find(std::make_pair(applicationID1, serviceType)) != definitions.end()); } resetAppProcessConfiguration(); @@ -523,49 +437,107 @@ TEST_CASE("Add report types to the Application Process Configuration") { Services.reset(); } - SECTION("Valid addition of all report types of an application process") { - Message request(RealTimeForwardingControlService::ServiceType, - RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration, - Message::TC, 1); - uint8_t applicationID1 = 1; - realTimeForwarding.controlledApplications.push_back(applicationID1); - validAllReportsOfApp(request); - - MessageParser::execute(request); - - CHECK(ServiceTests::count() == 0); - auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; - REQUIRE(applicationProcesses[applicationID1].empty()); - - resetAppProcessConfiguration(); - ServiceTests::reset(); - Services.reset(); - } - - SECTION("Addition of all report types of an application process, combined with invalid request") { - Message request(RealTimeForwardingControlService::ServiceType, - RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration, - Message::TC, 1); - uint8_t applicationID1 = 1; - uint8_t applicationID2 = 2; - realTimeForwarding.controlledApplications.push_back(applicationID1); - realTimeForwarding.controlledApplications.push_back(applicationID2); - validInvalidAllReportsOfApp(request); - - MessageParser::execute(request); - - CHECK(ServiceTests::count() == 1); - CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::NotControlledApplication) == 1); - auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; - - REQUIRE(applicationProcesses.find(applicationID1) != applicationProcesses.end()); - REQUIRE(applicationProcesses.find(applicationID2) != applicationProcesses.end()); - REQUIRE(applicationProcesses.find(3) == applicationProcesses.end()); - REQUIRE(applicationProcesses[applicationID1].empty()); - REQUIRE(applicationProcesses[applicationID2].empty()); - - resetAppProcessConfiguration(); - ServiceTests::reset(); - Services.reset(); - } + // SECTION("Valid addition of all report types of a specified service type") { + // Message request(RealTimeForwardingControlService::ServiceType, + // RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration, + // Message::TC, 1); + // uint8_t applicationID1 = 1; + // realTimeForwarding.controlledApplications.push_back(applicationID1); + // validAllReportsOfService(request); + // + // MessageParser::execute(request); + // + // CHECK(ServiceTests::count() == 0); + // auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; + // REQUIRE(applicationProcesses[applicationID1].size() == 2); + // for (auto serviceType : services) { + // REQUIRE(applicationProcesses[applicationID1].find(serviceType) != + // applicationProcesses[applicationID1].end()); + // REQUIRE(applicationProcesses[applicationID1][serviceType].empty()); + // } + // + // resetAppProcessConfiguration(); + // ServiceTests::reset(); + // Services.reset(); + // } + // + // SECTION("Addition of all report types of a service type, combined with invalid requests") { + // Message request(RealTimeForwardingControlService::ServiceType, + // RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration, + // Message::TC, 1); + // uint8_t applicationID1 = 1; + // uint8_t applicationID2 = 2; + // realTimeForwarding.controlledApplications.push_back(applicationID1); + // realTimeForwarding.controlledApplications.push_back(applicationID2); + // validInvalidAllReportsOfService(request); + // + // MessageParser::execute(request); + // + // CHECK(ServiceTests::count() == 3); + // CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::NotControlledApplication) == + // 1); CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached) == + // 2); + // + // auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; + // REQUIRE(applicationProcesses.size() == 2); + // REQUIRE(applicationProcesses[applicationID1].size() == 15); + // REQUIRE(applicationProcesses[applicationID2].size() == 2); + // + // for (auto& serviceType : applicationProcesses[applicationID1]) { + // REQUIRE(serviceType.second.empty()); + // } + // for (auto& serviceType : applicationProcesses[applicationID2]) { + // REQUIRE(serviceType.second.empty()); + // } + // + // resetAppProcessConfiguration(); + // ServiceTests::reset(); + // Services.reset(); + // } + // + // SECTION("Valid addition of all report types of an application process") { + // Message request(RealTimeForwardingControlService::ServiceType, + // RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration, + // Message::TC, 1); + // uint8_t applicationID1 = 1; + // realTimeForwarding.controlledApplications.push_back(applicationID1); + // validAllReportsOfApp(request); + // + // MessageParser::execute(request); + // + // CHECK(ServiceTests::count() == 0); + // auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; + // REQUIRE(applicationProcesses[applicationID1].empty()); + // + // resetAppProcessConfiguration(); + // ServiceTests::reset(); + // Services.reset(); + // } + // + // SECTION("Addition of all report types of an application process, combined with invalid request") { + // Message request(RealTimeForwardingControlService::ServiceType, + // RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration, + // Message::TC, 1); + // uint8_t applicationID1 = 1; + // uint8_t applicationID2 = 2; + // realTimeForwarding.controlledApplications.push_back(applicationID1); + // realTimeForwarding.controlledApplications.push_back(applicationID2); + // validInvalidAllReportsOfApp(request); + // + // MessageParser::execute(request); + // + // CHECK(ServiceTests::count() == 1); + // CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::NotControlledApplication) == + // 1); auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions; + // + // REQUIRE(applicationProcesses.find(applicationID1) != applicationProcesses.end()); + // REQUIRE(applicationProcesses.find(applicationID2) != applicationProcesses.end()); + // REQUIRE(applicationProcesses.find(3) == applicationProcesses.end()); + // REQUIRE(applicationProcesses[applicationID1].empty()); + // REQUIRE(applicationProcesses[applicationID2].empty()); + // + // resetAppProcessConfiguration(); + // ServiceTests::reset(); + // Services.reset(); + // } } -- GitLab