diff --git a/inc/Services/RealTimeForwardingControlService.hpp b/inc/Services/RealTimeForwardingControlService.hpp index ef95db113b718c1ba2880b2b9fdde26422476b11..58e0b30a776b682accce40c6197d1eac44c8018a 100644 --- a/inc/Services/RealTimeForwardingControlService.hpp +++ b/inc/Services/RealTimeForwardingControlService.hpp @@ -66,6 +66,16 @@ public: ForwardControlConfiguration::EventReportBlocking eventReportBlockingConfiguration; private: + /** + * Adds all report types of the specified application process definition, to the application process configuration. + */ + void addAllReportsOfApplication(uint8_t applicationID); + + /** + * Adds all report types of the specified service type, to the application process configuration. + */ + void addAllReportsOfService(uint8_t applicationID, uint8_t serviceType); + /** * Counts the number of service types, stored for the specified application process. */ diff --git a/src/Services/RealTimeForwardingControlService.cpp b/src/Services/RealTimeForwardingControlService.cpp index 3e9c0ebf589c17199c0712130424eb201daa66a6..55c1971e097b232b12ffde6fb91d4937cfdcebdc 100644 --- a/src/Services/RealTimeForwardingControlService.cpp +++ b/src/Services/RealTimeForwardingControlService.cpp @@ -1,6 +1,21 @@ #include <iostream> #include "Services/RealTimeForwardingControlService.hpp" +void RealTimeForwardingControlService::addAllReportsOfApplication(uint8_t applicationID) { + for (auto& service : allMessageTypes.messagesOfService) { + uint8_t serviceType = service.first; + for (auto message : service.second) { + applicationProcessConfiguration.definitions[std::make_pair(applicationID, serviceType)].push_back(message); + } + } +} + +void RealTimeForwardingControlService::addAllReportsOfService(uint8_t applicationID, uint8_t serviceType) { + for (auto& messageType : allMessageTypes.messagesOfService[serviceType]) { + applicationProcessConfiguration.definitions[std::make_pair(applicationID, serviceType)].push_back(messageType); + } +} + uint8_t RealTimeForwardingControlService::countServicesOfApplication(uint8_t applicationID) { uint8_t serviceCounter = 0; for (auto& definition : applicationProcessConfiguration.definitions) { @@ -48,7 +63,7 @@ bool RealTimeForwardingControlService::allServiceTypesAllowed(Message& request, bool RealTimeForwardingControlService::maxServiceTypesReached(Message& request, uint8_t applicationID) { if (countServicesOfApplication(applicationID) >= ECSSMaxServiceTypeDefinitions) { -// std::cout<<"err22\n"; + // std::cout<<"err22\n"; ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached); return true; } @@ -66,9 +81,9 @@ bool RealTimeForwardingControlService::checkService(Message& request, uint8_t ap bool RealTimeForwardingControlService::allReportTypesAllowed(Message& request, uint8_t applicationID, uint8_t serviceType) { -// std::cout<<"num mess= "<<static_cast<int>(countReportsOfService(applicationID, serviceType))<<"\n"; + // std::cout<<"num mess= "<<static_cast<int>(countReportsOfService(applicationID, serviceType))<<"\n"; if (countReportsOfService(applicationID, serviceType) >= allMessageTypes.messagesOfService[serviceType].size()) { -// std::cout<<"err23\n"; + // std::cout<<"err23\n"; ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::AllReportTypesAlreadyAllowed); return true; } @@ -104,46 +119,46 @@ bool RealTimeForwardingControlService::reportExistsInAppProcessConfiguration(uin void RealTimeForwardingControlService::addReportTypesToAppProcessConfiguration(Message& request) { request.assertTC(ServiceType, MessageType::AddReportTypesToAppProcessConfiguration); uint8_t numOfApplications = request.readUint8(); -// std::cout << static_cast<int>(numOfApplications) << "\n"; + // 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"; + // std::cout << "app= " << static_cast<int>(applicationID) << "\n"; if (not checkApplicationOfAppProcessConfig(request, applicationID, numOfServices)) { -// std::cout << "err1\n"; + // std::cout << "err1\n"; continue; } - // if (numOfServices == 0) { - // applicationProcessConfiguration.definitions[applicationID].clear(); - // continue; - // } + if (numOfServices == 0) { + addAllReportsOfApplication(applicationID); + 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"; + // 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"; + // std::cout << "err2\n"; continue; } - // if (numOfMessages == 0) { - // applicationProcessConfiguration.definitions[applicationID][serviceType].clear(); - // continue; - // } + if (numOfMessages == 0) { + addAllReportsOfService(applicationID, serviceType); + continue; + } for (uint8_t k = 0; k < numOfMessages; k++) { uint8_t messageType = request.readUint8(); -// std::cout << "mess= " << static_cast<int>(messageType) << "\n"; + // std::cout << "mess= " << static_cast<int>(messageType) << "\n"; if (not checkMessage(request, applicationID, serviceType, messageType)) { -// std::cout << "err3\n"; + // std::cout << "err3\n"; continue; } // todo: check if message type is valid. diff --git a/test/Services/RealTimeForwardingControl.cpp b/test/Services/RealTimeForwardingControl.cpp index ffb6f702f9459f74cc0cb26c53a2a26140f24946..35e258590566dd3c69e1ab488bdae572305461e1 100644 --- a/test/Services/RealTimeForwardingControl.cpp +++ b/test/Services/RealTimeForwardingControl.cpp @@ -118,7 +118,7 @@ void validInvalidAllReportsOfService(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); @@ -437,107 +437,118 @@ TEST_CASE("Add report types to the Application Process Configuration") { 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(); - // } + 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; + for (auto serviceType : services) { + REQUIRE(applicationProcesses[std::make_pair(applicationID1, serviceType)].size() == + realTimeForwarding.allMessageTypes.messagesOfService[serviceType].size()); + } + + 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& definitions = realTimeForwarding.applicationProcessConfiguration.definitions; + REQUIRE(definitions.size() == 12); + + int cnt1 = 0; + int cnt2 = 0; + for (auto& pair : definitions) { + if (pair.first.first == applicationID1) { + cnt1++; + } else if (pair.first.first == applicationID2) { + cnt2++; + } + } + REQUIRE(cnt1 == 10); + REQUIRE(cnt2 == 2); + + for (auto& serviceType : allServices) { + REQUIRE(definitions[std::make_pair(applicationID1, serviceType)].size() == + realTimeForwarding.allMessageTypes.messagesOfService[serviceType].size()); + } + for (auto& serviceType : services) { + REQUIRE(definitions[std::make_pair(applicationID2, serviceType)].size() == + realTimeForwarding.allMessageTypes.messagesOfService[serviceType].size()); + } + + 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& definitions = realTimeForwarding.applicationProcessConfiguration.definitions; + REQUIRE(definitions.size() == ECSSMaxServiceTypeDefinitions); + + for (auto serviceType : allServices) { + REQUIRE(std::equal(definitions[std::make_pair(applicationID1, serviceType)].begin(), + definitions[std::make_pair(applicationID1, serviceType)].end(), + realTimeForwarding.allMessageTypes.messagesOfService[serviceType].begin())); + } + + 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& definitions = realTimeForwarding.applicationProcessConfiguration.definitions; + + REQUIRE(definitions.size() == 2 * ECSSMaxServiceTypeDefinitions); + + resetAppProcessConfiguration(); + ServiceTests::reset(); + Services.reset(); + } }