diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index f0534496..ff7b8953 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -15,6 +15,7 @@ add_subdirectory(testApi) add_subdirectory(olink_tests/olink_core_only_tests) add_subdirectory(olink_tests/single_object_many_threads) add_subdirectory(mqtt_tests/single_object_many_threads) +add_subdirectory(nats_tests/single_object_many_threads) if(MANY_OBJECT_TESTS) add_subdirectory(olink_tests/many_objects) add_subdirectory(mqtt_tests/many_objects) diff --git a/cpp/olink_tests/helpers/latency_helpers.cpp b/cpp/latency_helpers/latency_helpers.cpp similarity index 97% rename from cpp/olink_tests/helpers/latency_helpers.cpp rename to cpp/latency_helpers/latency_helpers.cpp index 637c990e..d3220ce9 100644 --- a/cpp/olink_tests/helpers/latency_helpers.cpp +++ b/cpp/latency_helpers/latency_helpers.cpp @@ -1,33 +1,33 @@ -#include "latency_helpers.h" -#include -#include -#include -#include -#include - -void calculateAndPrintLatencyParameters (const std::vector& startPoints, - const std::vector& stopPoints) -{ - uint64_t sum = 0; - uint32_t min = std::chrono::duration_cast(stopPoints[0] - startPoints[0]).count(); - uint32_t max = 0; - for (size_t i = 0; i < startPoints.size(); i++) - { - auto latency = std::chrono::duration_cast(stopPoints[i] - startPoints[i]).count(); - sum = sum + latency; - if (min > latency) { min = latency; } - if (max < latency) { max = latency; } - } - auto mean = double(sum) / startPoints.size(); - - std::cout << "Latency[us]: mean " << std::fixed << std::setprecision(2) << mean << " max " <& intervalsInMicroseconds) -{ - auto sum = std::accumulate(intervalsInMicroseconds.cbegin(), intervalsInMicroseconds.cend(), 0); - double mean = double(sum) / intervalsInMicroseconds.size(); - const auto min_max = std::minmax_element(intervalsInMicroseconds.begin(), intervalsInMicroseconds.end()); - std::cout << "Latency[us]: mean " << std::fixed << std::setprecision(2) << mean << " max " << *(min_max.second) << " min " << *(min_max.first) << std::endl; -} - +#include "latency_helpers.h" +#include +#include +#include +#include +#include + +void calculateAndPrintLatencyParameters (const std::vector& startPoints, + const std::vector& stopPoints) +{ + uint64_t sum = 0; + uint32_t min = std::chrono::duration_cast(stopPoints[0] - startPoints[0]).count(); + uint32_t max = 0; + for (size_t i = 0; i < startPoints.size(); i++) + { + auto latency = std::chrono::duration_cast(stopPoints[i] - startPoints[i]).count(); + sum = sum + latency; + if (min > latency) { min = latency; } + if (max < latency) { max = latency; } + } + auto mean = double(sum) / startPoints.size(); + + std::cout << "Latency[us]: mean " << std::fixed << std::setprecision(2) << mean << " max " <& intervalsInMicroseconds) +{ + auto sum = std::accumulate(intervalsInMicroseconds.cbegin(), intervalsInMicroseconds.cend(), 0); + double mean = double(sum) / intervalsInMicroseconds.size(); + const auto min_max = std::minmax_element(intervalsInMicroseconds.begin(), intervalsInMicroseconds.end()); + std::cout << "Latency[us]: mean " << std::fixed << std::setprecision(2) << mean << " max " << *(min_max.second) << " min " << *(min_max.first) << std::endl; +} + diff --git a/cpp/olink_tests/helpers/latency_helpers.h b/cpp/latency_helpers/latency_helpers.h similarity index 97% rename from cpp/olink_tests/helpers/latency_helpers.h rename to cpp/latency_helpers/latency_helpers.h index 7aa65fda..bf39a698 100644 --- a/cpp/olink_tests/helpers/latency_helpers.h +++ b/cpp/latency_helpers/latency_helpers.h @@ -1,23 +1,23 @@ -#pragma once - -#include -#include -#include - -using chrono_hr_timepoint = std::chrono::time_point; - -/** - * Calculates mean, min and max parameters for events duration described in two vectors, one with events start timepoint and one with events stop timepoints. - * Assumes that the position in a vector identifies the event. For an event A position of start in startPoints must be same as its stop in stopPoints - * @param startPoints timepoints for start of events - * @param stopPoints timepoints for stop of events -*/ -void calculateAndPrintLatencyParameters (const std::vector& startPoints, - const std::vector& stopPoints); - - -/** - * Calculates mean, min and max parameters for a vector - * @param intervalsInMicroseconds an interval time in microseconds. -*/ -void calculateAndPrintLatencyParameters(const std::vector& intervalsInMicroseconds); +#pragma once + +#include +#include +#include + +using chrono_hr_timepoint = std::chrono::time_point; + +/** + * Calculates mean, min and max parameters for events duration described in two vectors, one with events start timepoint and one with events stop timepoints. + * Assumes that the position in a vector identifies the event. For an event A position of start in startPoints must be same as its stop in stopPoints + * @param startPoints timepoints for start of events + * @param stopPoints timepoints for stop of events +*/ +void calculateAndPrintLatencyParameters (const std::vector& startPoints, + const std::vector& stopPoints); + + +/** + * Calculates mean, min and max parameters for a vector + * @param intervalsInMicroseconds an interval time in microseconds. +*/ +void calculateAndPrintLatencyParameters(const std::vector& intervalsInMicroseconds); diff --git a/cpp/mqtt_tests/many_objects/CMakeLists.txt b/cpp/mqtt_tests/many_objects/CMakeLists.txt index 1629a42b..b42a35b0 100644 --- a/cpp/mqtt_tests/many_objects/CMakeLists.txt +++ b/cpp/mqtt_tests/many_objects/CMakeLists.txt @@ -13,7 +13,7 @@ set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) add_executable(mqtt_multi_client_setIntProperty "client_setIntProperty.cpp") add_executable(mqtt_multi_client_setFloatProperty "client_setFloatProperty.cpp") add_executable(mqtt_multi_client_setStringProperty "client_setStringProperty.cpp") -add_executable(mqtt_multi_service "server.cpp" "../helpers/prepare_test_services.cpp" ) +add_executable(mqtt_multi_service "server.cpp" "helpers/prepare_test_services.cpp" ) target_link_libraries(mqtt_multi_client_setIntProperty api::api-mqtt) target_link_libraries(mqtt_multi_client_setFloatProperty api::api-mqtt) diff --git a/cpp/mqtt_tests/many_objects/client_setFloatProperty.cpp b/cpp/mqtt_tests/many_objects/client_setFloatProperty.cpp index 463a1ef6..4bb90d8a 100644 --- a/cpp/mqtt_tests/many_objects/client_setFloatProperty.cpp +++ b/cpp/mqtt_tests/many_objects/client_setFloatProperty.cpp @@ -1,7 +1,7 @@ #include "../../scenario_templates/many_objects/executeTestFunction.h" -#include "../helpers/mqtt_network_protocol_handler_for_test.hpp" -#include "../helpers/itestsink.h" -#include "../helpers/prepare_test_data.h" +#include "../mqtt_network_protocol_handler_for_test.hpp" +#include "helpers/itestsink.h" +#include "helpers/prepare_test_data.h" #include struct PropertyFloatTestData diff --git a/cpp/mqtt_tests/many_objects/client_setIntProperty.cpp b/cpp/mqtt_tests/many_objects/client_setIntProperty.cpp index 0f0c9aab..548e3266 100644 --- a/cpp/mqtt_tests/many_objects/client_setIntProperty.cpp +++ b/cpp/mqtt_tests/many_objects/client_setIntProperty.cpp @@ -1,7 +1,7 @@ #include "../../scenario_templates/many_objects/executeTestFunction.h" -#include "../helpers/mqtt_network_protocol_handler_for_test.hpp" -#include "../helpers/itestsink.h" -#include "../helpers/prepare_test_data.h" +#include "../mqtt_network_protocol_handler_for_test.hpp" +#include "helpers/itestsink.h" +#include "helpers/prepare_test_data.h" #include struct PropertyIntTestData diff --git a/cpp/mqtt_tests/many_objects/client_setStringProperty.cpp b/cpp/mqtt_tests/many_objects/client_setStringProperty.cpp index 655173f8..eb92813b 100644 --- a/cpp/mqtt_tests/many_objects/client_setStringProperty.cpp +++ b/cpp/mqtt_tests/many_objects/client_setStringProperty.cpp @@ -1,7 +1,7 @@ #include "../../scenario_templates/many_objects/executeTestFunction.h" -#include "../helpers/mqtt_network_protocol_handler_for_test.hpp" -#include "../helpers/itestsink.h" -#include "../helpers/prepare_test_data.h" +#include "../mqtt_network_protocol_handler_for_test.hpp" +#include "helpers/itestsink.h" +#include "helpers/prepare_test_data.h" #include diff --git a/cpp/mqtt_tests/helpers/itestsink.h b/cpp/mqtt_tests/many_objects/helpers/itestsink.h similarity index 97% rename from cpp/mqtt_tests/helpers/itestsink.h rename to cpp/mqtt_tests/many_objects/helpers/itestsink.h index 99b1a767..2f98f10a 100644 --- a/cpp/mqtt_tests/helpers/itestsink.h +++ b/cpp/mqtt_tests/many_objects/helpers/itestsink.h @@ -1,57 +1,57 @@ -#pragma once - -#include - -class ITestSink -{ -public: - virtual bool isReady() const = 0; - virtual uint32_t receivedMessages() const = 0; -}; - - -template -class TestSink : public ITestSink, public BaseMqttTestApi -{ -public: - TestSink(std::shared_ptr client) - :BaseMqttTestApi(client) - { - idPropInt = BaseMqttTestApi::_getPublisher().subscribeToPropIntChanged([this](auto value) { - msgReceived++; - }); - idPropFloat = BaseMqttTestApi::_getPublisher().subscribeToPropFloatChanged([this](auto value) {msgReceived++; }); - idPropString = BaseMqttTestApi::_getPublisher().subscribeToPropStringChanged([this](auto value) {msgReceived++; }); - idSigInt = BaseMqttTestApi::_getPublisher().subscribeToSigInt([this](auto value) {msgReceived++; }); - idSigFloat = BaseMqttTestApi::_getPublisher().subscribeToSigFloat([this](auto value) {msgReceived++; }); - idSigString = BaseMqttTestApi::_getPublisher().subscribeToSigString([this](auto value) {msgReceived++; }); - } - - ~TestSink() - { - BaseMqttTestApi::_getPublisher().unsubscribeFromPropIntChanged(idPropInt); - BaseMqttTestApi::_getPublisher().unsubscribeFromPropFloatChanged(idPropFloat); - BaseMqttTestApi::_getPublisher().unsubscribeFromPropStringChanged(idPropString); - BaseMqttTestApi::_getPublisher().unsubscribeFromSigInt(idSigInt); - BaseMqttTestApi::_getPublisher().unsubscribeFromSigFloat(idSigFloat); - BaseMqttTestApi::_getPublisher().unsubscribeFromSigString(idSigString); - } - - bool isReady() const override - { - return BaseMqttTestApi::isReady(); - } - - uint32_t receivedMessages() const override - { - return msgReceived; - } -private: - long idPropInt; - long idPropFloat; - long idPropString; - long idSigInt; - long idSigFloat; - long idSigString; - uint32_t msgReceived = 0; -}; +#pragma once + +#include + +class ITestSink +{ +public: + virtual bool isReady() const = 0; + virtual uint32_t receivedMessages() const = 0; +}; + + +template +class TestSink : public ITestSink, public BaseMqttTestApi +{ +public: + TestSink(std::shared_ptr client) + :BaseMqttTestApi(client) + { + idPropInt = BaseMqttTestApi::_getPublisher().subscribeToPropIntChanged([this](auto value) { + msgReceived++; + }); + idPropFloat = BaseMqttTestApi::_getPublisher().subscribeToPropFloatChanged([this](auto value) {msgReceived++; }); + idPropString = BaseMqttTestApi::_getPublisher().subscribeToPropStringChanged([this](auto value) {msgReceived++; }); + idSigInt = BaseMqttTestApi::_getPublisher().subscribeToSigInt([this](auto value) {msgReceived++; }); + idSigFloat = BaseMqttTestApi::_getPublisher().subscribeToSigFloat([this](auto value) {msgReceived++; }); + idSigString = BaseMqttTestApi::_getPublisher().subscribeToSigString([this](auto value) {msgReceived++; }); + } + + ~TestSink() + { + BaseMqttTestApi::_getPublisher().unsubscribeFromPropIntChanged(idPropInt); + BaseMqttTestApi::_getPublisher().unsubscribeFromPropFloatChanged(idPropFloat); + BaseMqttTestApi::_getPublisher().unsubscribeFromPropStringChanged(idPropString); + BaseMqttTestApi::_getPublisher().unsubscribeFromSigInt(idSigInt); + BaseMqttTestApi::_getPublisher().unsubscribeFromSigFloat(idSigFloat); + BaseMqttTestApi::_getPublisher().unsubscribeFromSigString(idSigString); + } + + bool isReady() const override + { + return BaseMqttTestApi::isReady(); + } + + uint32_t receivedMessages() const override + { + return msgReceived; + } +private: + long idPropInt; + long idPropFloat; + long idPropString; + long idSigInt; + long idSigFloat; + long idSigString; + uint32_t msgReceived = 0; +}; diff --git a/cpp/mqtt_tests/helpers/prepare_test_data.h b/cpp/mqtt_tests/many_objects/helpers/prepare_test_data.h similarity index 98% rename from cpp/mqtt_tests/helpers/prepare_test_data.h rename to cpp/mqtt_tests/many_objects/helpers/prepare_test_data.h index d743dea4..947b864f 100644 --- a/cpp/mqtt_tests/helpers/prepare_test_data.h +++ b/cpp/mqtt_tests/many_objects/helpers/prepare_test_data.h @@ -1,244 +1,244 @@ -#include -#include -#include -#include "itestsink.h" - -#include "api/generated/mqtt/testapi0client.h" -#include "api/generated/mqtt/testapi1client.h" -#include "api/generated/mqtt/testapi2client.h" -#include "api/generated/mqtt/testapi3client.h" -#include "api/generated/mqtt/testapi4client.h" -#include "api/generated/mqtt/testapi5client.h" -#include "api/generated/mqtt/testapi6client.h" -#include "api/generated/mqtt/testapi7client.h" -#include "api/generated/mqtt/testapi8client.h" -#include "api/generated/mqtt/testapi9client.h" - -#include "api/generated/mqtt/testapi10client.h" -#include "api/generated/mqtt/testapi11client.h" -#include "api/generated/mqtt/testapi12client.h" -#include "api/generated/mqtt/testapi13client.h" -#include "api/generated/mqtt/testapi14client.h" -#include "api/generated/mqtt/testapi15client.h" -#include "api/generated/mqtt/testapi16client.h" -#include "api/generated/mqtt/testapi17client.h" -#include "api/generated/mqtt/testapi18client.h" -#include "api/generated/mqtt/testapi19client.h" - -#include "api/generated/mqtt/testapi20client.h" -#include "api/generated/mqtt/testapi21client.h" -#include "api/generated/mqtt/testapi22client.h" -#include "api/generated/mqtt/testapi23client.h" -#include "api/generated/mqtt/testapi24client.h" -#include "api/generated/mqtt/testapi25client.h" -#include "api/generated/mqtt/testapi26client.h" -#include "api/generated/mqtt/testapi27client.h" -#include "api/generated/mqtt/testapi28client.h" -#include "api/generated/mqtt/testapi29client.h" - -#include "api/generated/mqtt/testapi30client.h" -#include "api/generated/mqtt/testapi31client.h" -#include "api/generated/mqtt/testapi32client.h" -#include "api/generated/mqtt/testapi33client.h" -#include "api/generated/mqtt/testapi34client.h" -#include "api/generated/mqtt/testapi35client.h" -#include "api/generated/mqtt/testapi36client.h" -#include "api/generated/mqtt/testapi37client.h" -#include "api/generated/mqtt/testapi38client.h" -#include "api/generated/mqtt/testapi39client.h" - -#include "api/generated/mqtt/testapi40client.h" -#include "api/generated/mqtt/testapi41client.h" -#include "api/generated/mqtt/testapi42client.h" -#include "api/generated/mqtt/testapi43client.h" -#include "api/generated/mqtt/testapi44client.h" -#include "api/generated/mqtt/testapi45client.h" -#include "api/generated/mqtt/testapi46client.h" -#include "api/generated/mqtt/testapi47client.h" -#include "api/generated/mqtt/testapi48client.h" -#include "api/generated/mqtt/testapi49client.h" -// -//#include "api/generated/mqtt/testapi50client.h" -//#include "api/generated/mqtt/testapi51client.h" -//#include "api/generated/mqtt/testapi52client.h" -//#include "api/generated/mqtt/testapi53client.h" -//#include "api/generated/mqtt/testapi54client.h" -//#include "api/generated/mqtt/testapi55client.h" -//#include "api/generated/mqtt/testapi56client.h" -//#include "api/generated/mqtt/testapi57client.h" -//#include "api/generated/mqtt/testapi58client.h" -//#include "api/generated/mqtt/testapi59client.h" - -//#include "api/generated/mqtt/testapi60client.h" -//#include "api/generated/mqtt/testapi61client.h" -//#include "api/generated/mqtt/testapi62client.h" -//#include "api/generated/mqtt/testapi63client.h" -//#include "api/generated/mqtt/testapi64client.h" -//#include "api/generated/mqtt/testapi65client.h" -//#include "api/generated/mqtt/testapi66client.h" -//#include "api/generated/mqtt/testapi67client.h" -//#include "api/generated/mqtt/testapi68client.h" -//#include "api/generated/mqtt/testapi69client.h" -// -//#include "api/generated/mqtt/testapi70client.h" -//#include "api/generated/mqtt/testapi71client.h" -//#include "api/generated/mqtt/testapi72client.h" -//#include "api/generated/mqtt/testapi73client.h" -//#include "api/generated/mqtt/testapi74client.h" -//#include "api/generated/mqtt/testapi75client.h" -//#include "api/generated/mqtt/testapi76client.h" -//#include "api/generated/mqtt/testapi77client.h" -//#include "api/generated/mqtt/testapi78client.h" -//#include "api/generated/mqtt/testapi79client.h" -// -//#include "api/generated/mqtt/testapi80client.h" -//#include "api/generated/mqtt/testapi81client.h" -//#include "api/generated/mqtt/testapi82client.h" -//#include "api/generated/mqtt/testapi83client.h" -//#include "api/generated/mqtt/testapi84client.h" -//#include "api/generated/mqtt/testapi85client.h" -//#include "api/generated/mqtt/testapi86client.h" -//#include "api/generated/mqtt/testapi87client.h" -//#include "api/generated/mqtt/testapi88client.h" -//#include "api/generated/mqtt/testapi89client.h" -// -//#include "api/generated/mqtt/testapi90client.h" -//#include "api/generated/mqtt/testapi91client.h" -//#include "api/generated/mqtt/testapi92client.h" -//#include "api/generated/mqtt/testapi93client.h" -//#include "api/generated/mqtt/testapi94client.h" -//#include "api/generated/mqtt/testapi95client.h" -//#include "api/generated/mqtt/testapi96client.h" -//#include "api/generated/mqtt/testapi97client.h" -//#include "api/generated/mqtt/testapi98client.h" -//#include "api/generated/mqtt/testapi99client.h" - - - -template -void addTestData(std::shared_ptr client, std::vector& elements, FunctionSetter& setter) -{ - TestData element; - auto obj = std::make_shared>(client); - element.sink = obj; - element.testFunction = [obj, &setter](const auto& value) {setter.testFunction(obj, value); }; - elements.push_back(element); -} - -template -std::vector getTestData(FunctionSetter& setter, std::shared_ptr client) -{ - std::vector data; - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - addTestData(client, data, setter); - - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - //addTestData(client, data, setter); - - - return data; -} +#include +#include +#include +#include "itestsink.h" + +#include "api/generated/mqtt/testapi0client.h" +#include "api/generated/mqtt/testapi1client.h" +#include "api/generated/mqtt/testapi2client.h" +#include "api/generated/mqtt/testapi3client.h" +#include "api/generated/mqtt/testapi4client.h" +#include "api/generated/mqtt/testapi5client.h" +#include "api/generated/mqtt/testapi6client.h" +#include "api/generated/mqtt/testapi7client.h" +#include "api/generated/mqtt/testapi8client.h" +#include "api/generated/mqtt/testapi9client.h" + +#include "api/generated/mqtt/testapi10client.h" +#include "api/generated/mqtt/testapi11client.h" +#include "api/generated/mqtt/testapi12client.h" +#include "api/generated/mqtt/testapi13client.h" +#include "api/generated/mqtt/testapi14client.h" +#include "api/generated/mqtt/testapi15client.h" +#include "api/generated/mqtt/testapi16client.h" +#include "api/generated/mqtt/testapi17client.h" +#include "api/generated/mqtt/testapi18client.h" +#include "api/generated/mqtt/testapi19client.h" + +#include "api/generated/mqtt/testapi20client.h" +#include "api/generated/mqtt/testapi21client.h" +#include "api/generated/mqtt/testapi22client.h" +#include "api/generated/mqtt/testapi23client.h" +#include "api/generated/mqtt/testapi24client.h" +#include "api/generated/mqtt/testapi25client.h" +#include "api/generated/mqtt/testapi26client.h" +#include "api/generated/mqtt/testapi27client.h" +#include "api/generated/mqtt/testapi28client.h" +#include "api/generated/mqtt/testapi29client.h" + +#include "api/generated/mqtt/testapi30client.h" +#include "api/generated/mqtt/testapi31client.h" +#include "api/generated/mqtt/testapi32client.h" +#include "api/generated/mqtt/testapi33client.h" +#include "api/generated/mqtt/testapi34client.h" +#include "api/generated/mqtt/testapi35client.h" +#include "api/generated/mqtt/testapi36client.h" +#include "api/generated/mqtt/testapi37client.h" +#include "api/generated/mqtt/testapi38client.h" +#include "api/generated/mqtt/testapi39client.h" + +#include "api/generated/mqtt/testapi40client.h" +#include "api/generated/mqtt/testapi41client.h" +#include "api/generated/mqtt/testapi42client.h" +#include "api/generated/mqtt/testapi43client.h" +#include "api/generated/mqtt/testapi44client.h" +#include "api/generated/mqtt/testapi45client.h" +#include "api/generated/mqtt/testapi46client.h" +#include "api/generated/mqtt/testapi47client.h" +#include "api/generated/mqtt/testapi48client.h" +#include "api/generated/mqtt/testapi49client.h" +// +//#include "api/generated/mqtt/testapi50client.h" +//#include "api/generated/mqtt/testapi51client.h" +//#include "api/generated/mqtt/testapi52client.h" +//#include "api/generated/mqtt/testapi53client.h" +//#include "api/generated/mqtt/testapi54client.h" +//#include "api/generated/mqtt/testapi55client.h" +//#include "api/generated/mqtt/testapi56client.h" +//#include "api/generated/mqtt/testapi57client.h" +//#include "api/generated/mqtt/testapi58client.h" +//#include "api/generated/mqtt/testapi59client.h" + +//#include "api/generated/mqtt/testapi60client.h" +//#include "api/generated/mqtt/testapi61client.h" +//#include "api/generated/mqtt/testapi62client.h" +//#include "api/generated/mqtt/testapi63client.h" +//#include "api/generated/mqtt/testapi64client.h" +//#include "api/generated/mqtt/testapi65client.h" +//#include "api/generated/mqtt/testapi66client.h" +//#include "api/generated/mqtt/testapi67client.h" +//#include "api/generated/mqtt/testapi68client.h" +//#include "api/generated/mqtt/testapi69client.h" +// +//#include "api/generated/mqtt/testapi70client.h" +//#include "api/generated/mqtt/testapi71client.h" +//#include "api/generated/mqtt/testapi72client.h" +//#include "api/generated/mqtt/testapi73client.h" +//#include "api/generated/mqtt/testapi74client.h" +//#include "api/generated/mqtt/testapi75client.h" +//#include "api/generated/mqtt/testapi76client.h" +//#include "api/generated/mqtt/testapi77client.h" +//#include "api/generated/mqtt/testapi78client.h" +//#include "api/generated/mqtt/testapi79client.h" +// +//#include "api/generated/mqtt/testapi80client.h" +//#include "api/generated/mqtt/testapi81client.h" +//#include "api/generated/mqtt/testapi82client.h" +//#include "api/generated/mqtt/testapi83client.h" +//#include "api/generated/mqtt/testapi84client.h" +//#include "api/generated/mqtt/testapi85client.h" +//#include "api/generated/mqtt/testapi86client.h" +//#include "api/generated/mqtt/testapi87client.h" +//#include "api/generated/mqtt/testapi88client.h" +//#include "api/generated/mqtt/testapi89client.h" +// +//#include "api/generated/mqtt/testapi90client.h" +//#include "api/generated/mqtt/testapi91client.h" +//#include "api/generated/mqtt/testapi92client.h" +//#include "api/generated/mqtt/testapi93client.h" +//#include "api/generated/mqtt/testapi94client.h" +//#include "api/generated/mqtt/testapi95client.h" +//#include "api/generated/mqtt/testapi96client.h" +//#include "api/generated/mqtt/testapi97client.h" +//#include "api/generated/mqtt/testapi98client.h" +//#include "api/generated/mqtt/testapi99client.h" + + + +template +void addTestData(std::shared_ptr client, std::vector& elements, FunctionSetter& setter) +{ + TestData element; + auto obj = std::make_shared>(client); + element.sink = obj; + element.testFunction = [obj, &setter](const auto& value) {setter.testFunction(obj, value); }; + elements.push_back(element); +} + +template +std::vector getTestData(FunctionSetter& setter, std::shared_ptr client) +{ + std::vector data; + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + addTestData(client, data, setter); + + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + //addTestData(client, data, setter); + + + return data; +} diff --git a/cpp/mqtt_tests/helpers/prepare_test_services.cpp b/cpp/mqtt_tests/many_objects/helpers/prepare_test_services.cpp similarity index 98% rename from cpp/mqtt_tests/helpers/prepare_test_services.cpp rename to cpp/mqtt_tests/many_objects/helpers/prepare_test_services.cpp index be9bedac..2fdc6cf8 100644 --- a/cpp/mqtt_tests/helpers/prepare_test_services.cpp +++ b/cpp/mqtt_tests/many_objects/helpers/prepare_test_services.cpp @@ -1,343 +1,343 @@ -#include "prepare_test_services.h" - -#include "api/generated/mqtt/testapi0service.h" -#include "api/generated/mqtt/testapi1service.h" -#include "api/generated/mqtt/testapi2service.h" -#include "api/generated/mqtt/testapi3service.h" -#include "api/generated/mqtt/testapi4service.h" -#include "api/generated/mqtt/testapi5service.h" -#include "api/generated/mqtt/testapi6service.h" -#include "api/generated/mqtt/testapi7service.h" -#include "api/generated/mqtt/testapi8service.h" -#include "api/generated/mqtt/testapi9service.h" - -#include "api/generated/mqtt/testapi10service.h" -#include "api/generated/mqtt/testapi11service.h" -#include "api/generated/mqtt/testapi12service.h" -#include "api/generated/mqtt/testapi13service.h" -#include "api/generated/mqtt/testapi14service.h" -#include "api/generated/mqtt/testapi15service.h" -#include "api/generated/mqtt/testapi16service.h" -#include "api/generated/mqtt/testapi17service.h" -#include "api/generated/mqtt/testapi18service.h" -#include "api/generated/mqtt/testapi19service.h" - -#include "api/generated/mqtt/testapi20service.h" -#include "api/generated/mqtt/testapi21service.h" -#include "api/generated/mqtt/testapi22service.h" -#include "api/generated/mqtt/testapi23service.h" -#include "api/generated/mqtt/testapi24service.h" -#include "api/generated/mqtt/testapi25service.h" -#include "api/generated/mqtt/testapi26service.h" -#include "api/generated/mqtt/testapi27service.h" -#include "api/generated/mqtt/testapi28service.h" -#include "api/generated/mqtt/testapi29service.h" - -#include "api/generated/mqtt/testapi30service.h" -#include "api/generated/mqtt/testapi31service.h" -#include "api/generated/mqtt/testapi32service.h" -#include "api/generated/mqtt/testapi33service.h" -#include "api/generated/mqtt/testapi34service.h" -#include "api/generated/mqtt/testapi35service.h" -#include "api/generated/mqtt/testapi36service.h" -#include "api/generated/mqtt/testapi37service.h" -#include "api/generated/mqtt/testapi38service.h" -#include "api/generated/mqtt/testapi39service.h" - -#include "api/generated/mqtt/testapi40service.h" -#include "api/generated/mqtt/testapi41service.h" -#include "api/generated/mqtt/testapi42service.h" -#include "api/generated/mqtt/testapi43service.h" -#include "api/generated/mqtt/testapi44service.h" -#include "api/generated/mqtt/testapi45service.h" -#include "api/generated/mqtt/testapi46service.h" -#include "api/generated/mqtt/testapi47service.h" -#include "api/generated/mqtt/testapi48service.h" -#include "api/generated/mqtt/testapi49service.h" - -#include "api/generated/mqtt/testapi50service.h" -#include "api/generated/mqtt/testapi51service.h" -#include "api/generated/mqtt/testapi52service.h" -#include "api/generated/mqtt/testapi53service.h" -#include "api/generated/mqtt/testapi54service.h" -#include "api/generated/mqtt/testapi55service.h" -#include "api/generated/mqtt/testapi56service.h" -#include "api/generated/mqtt/testapi57service.h" -#include "api/generated/mqtt/testapi58service.h" -#include "api/generated/mqtt/testapi59service.h" - -#include "api/generated/mqtt/testapi60service.h" -#include "api/generated/mqtt/testapi61service.h" -#include "api/generated/mqtt/testapi62service.h" -#include "api/generated/mqtt/testapi63service.h" -#include "api/generated/mqtt/testapi64service.h" -#include "api/generated/mqtt/testapi65service.h" -#include "api/generated/mqtt/testapi66service.h" -#include "api/generated/mqtt/testapi67service.h" -#include "api/generated/mqtt/testapi68service.h" -#include "api/generated/mqtt/testapi69service.h" - -#include "api/generated/mqtt/testapi70service.h" -#include "api/generated/mqtt/testapi71service.h" -#include "api/generated/mqtt/testapi72service.h" -#include "api/generated/mqtt/testapi73service.h" -#include "api/generated/mqtt/testapi74service.h" -#include "api/generated/mqtt/testapi75service.h" -#include "api/generated/mqtt/testapi76service.h" -#include "api/generated/mqtt/testapi77service.h" -#include "api/generated/mqtt/testapi78service.h" -#include "api/generated/mqtt/testapi79service.h" - -#include "api/generated/mqtt/testapi80service.h" -#include "api/generated/mqtt/testapi81service.h" -#include "api/generated/mqtt/testapi82service.h" -#include "api/generated/mqtt/testapi83service.h" -#include "api/generated/mqtt/testapi84service.h" -#include "api/generated/mqtt/testapi85service.h" -#include "api/generated/mqtt/testapi86service.h" -#include "api/generated/mqtt/testapi87service.h" -#include "api/generated/mqtt/testapi88service.h" -#include "api/generated/mqtt/testapi89service.h" - -#include "api/generated/mqtt/testapi90service.h" -#include "api/generated/mqtt/testapi91service.h" -#include "api/generated/mqtt/testapi92service.h" -#include "api/generated/mqtt/testapi93service.h" -#include "api/generated/mqtt/testapi94service.h" -#include "api/generated/mqtt/testapi95service.h" -#include "api/generated/mqtt/testapi96service.h" -#include "api/generated/mqtt/testapi97service.h" -#include "api/generated/mqtt/testapi98service.h" -#include "api/generated/mqtt/testapi99service.h" - -#include "api/implementation/testapi0.h" -#include "api/implementation/testapi1.h" -#include "api/implementation/testapi2.h" -#include "api/implementation/testapi3.h" -#include "api/implementation/testapi4.h" -#include "api/implementation/testapi5.h" -#include "api/implementation/testapi6.h" -#include "api/implementation/testapi7.h" -#include "api/implementation/testapi8.h" -#include "api/implementation/testapi9.h" - -#include "api/implementation/testapi10.h" -#include "api/implementation/testapi11.h" -#include "api/implementation/testapi12.h" -#include "api/implementation/testapi13.h" -#include "api/implementation/testapi14.h" -#include "api/implementation/testapi15.h" -#include "api/implementation/testapi16.h" -#include "api/implementation/testapi17.h" -#include "api/implementation/testapi18.h" -#include "api/implementation/testapi19.h" - -#include "api/implementation/testapi20.h" -#include "api/implementation/testapi21.h" -#include "api/implementation/testapi22.h" -#include "api/implementation/testapi23.h" -#include "api/implementation/testapi24.h" -#include "api/implementation/testapi25.h" -#include "api/implementation/testapi26.h" -#include "api/implementation/testapi27.h" -#include "api/implementation/testapi28.h" -#include "api/implementation/testapi29.h" - -#include "api/implementation/testapi30.h" -#include "api/implementation/testapi31.h" -#include "api/implementation/testapi32.h" -#include "api/implementation/testapi33.h" -#include "api/implementation/testapi34.h" -#include "api/implementation/testapi35.h" -#include "api/implementation/testapi36.h" -#include "api/implementation/testapi37.h" -#include "api/implementation/testapi38.h" -#include "api/implementation/testapi39.h" - -#include "api/implementation/testapi40.h" -#include "api/implementation/testapi41.h" -#include "api/implementation/testapi42.h" -#include "api/implementation/testapi43.h" -#include "api/implementation/testapi44.h" -#include "api/implementation/testapi45.h" -#include "api/implementation/testapi46.h" -#include "api/implementation/testapi47.h" -#include "api/implementation/testapi48.h" -#include "api/implementation/testapi49.h" - -#include "api/implementation/testapi50.h" -#include "api/implementation/testapi51.h" -#include "api/implementation/testapi52.h" -#include "api/implementation/testapi53.h" -#include "api/implementation/testapi54.h" -#include "api/implementation/testapi55.h" -#include "api/implementation/testapi56.h" -#include "api/implementation/testapi57.h" -#include "api/implementation/testapi58.h" -#include "api/implementation/testapi59.h" - -#include "api/implementation/testapi60.h" -#include "api/implementation/testapi61.h" -#include "api/implementation/testapi62.h" -#include "api/implementation/testapi63.h" -#include "api/implementation/testapi64.h" -#include "api/implementation/testapi65.h" -#include "api/implementation/testapi66.h" -#include "api/implementation/testapi67.h" -#include "api/implementation/testapi68.h" -#include "api/implementation/testapi69.h" - -#include "api/implementation/testapi70.h" -#include "api/implementation/testapi71.h" -#include "api/implementation/testapi72.h" -#include "api/implementation/testapi73.h" -#include "api/implementation/testapi74.h" -#include "api/implementation/testapi75.h" -#include "api/implementation/testapi76.h" -#include "api/implementation/testapi77.h" -#include "api/implementation/testapi78.h" -#include "api/implementation/testapi79.h" - -#include "api/implementation/testapi80.h" -#include "api/implementation/testapi81.h" -#include "api/implementation/testapi82.h" -#include "api/implementation/testapi83.h" -#include "api/implementation/testapi84.h" -#include "api/implementation/testapi85.h" -#include "api/implementation/testapi86.h" -#include "api/implementation/testapi87.h" -#include "api/implementation/testapi88.h" -#include "api/implementation/testapi89.h" - -#include "api/implementation/testapi90.h" -#include "api/implementation/testapi91.h" -#include "api/implementation/testapi92.h" -#include "api/implementation/testapi93.h" -#include "api/implementation/testapi94.h" -#include "api/implementation/testapi95.h" -#include "api/implementation/testapi96.h" -#include "api/implementation/testapi97.h" -#include "api/implementation/testapi98.h" -#include "api/implementation/testapi99.h" - - -template< class MqttServiceAdapter, class InterfaceService> -void addService(std::shared_ptr serviceAdapter) -{ - std::shared_ptr service = std::make_shared(); - static auto mqttServiceAdapter = std::make_shared(service, serviceAdapter); -} - - -void prepareStaticServices(std::shared_ptr serviceAdapter) -{ - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); - addService (serviceAdapter); -} +#include "prepare_test_services.h" + +#include "api/generated/mqtt/testapi0service.h" +#include "api/generated/mqtt/testapi1service.h" +#include "api/generated/mqtt/testapi2service.h" +#include "api/generated/mqtt/testapi3service.h" +#include "api/generated/mqtt/testapi4service.h" +#include "api/generated/mqtt/testapi5service.h" +#include "api/generated/mqtt/testapi6service.h" +#include "api/generated/mqtt/testapi7service.h" +#include "api/generated/mqtt/testapi8service.h" +#include "api/generated/mqtt/testapi9service.h" + +#include "api/generated/mqtt/testapi10service.h" +#include "api/generated/mqtt/testapi11service.h" +#include "api/generated/mqtt/testapi12service.h" +#include "api/generated/mqtt/testapi13service.h" +#include "api/generated/mqtt/testapi14service.h" +#include "api/generated/mqtt/testapi15service.h" +#include "api/generated/mqtt/testapi16service.h" +#include "api/generated/mqtt/testapi17service.h" +#include "api/generated/mqtt/testapi18service.h" +#include "api/generated/mqtt/testapi19service.h" + +#include "api/generated/mqtt/testapi20service.h" +#include "api/generated/mqtt/testapi21service.h" +#include "api/generated/mqtt/testapi22service.h" +#include "api/generated/mqtt/testapi23service.h" +#include "api/generated/mqtt/testapi24service.h" +#include "api/generated/mqtt/testapi25service.h" +#include "api/generated/mqtt/testapi26service.h" +#include "api/generated/mqtt/testapi27service.h" +#include "api/generated/mqtt/testapi28service.h" +#include "api/generated/mqtt/testapi29service.h" + +#include "api/generated/mqtt/testapi30service.h" +#include "api/generated/mqtt/testapi31service.h" +#include "api/generated/mqtt/testapi32service.h" +#include "api/generated/mqtt/testapi33service.h" +#include "api/generated/mqtt/testapi34service.h" +#include "api/generated/mqtt/testapi35service.h" +#include "api/generated/mqtt/testapi36service.h" +#include "api/generated/mqtt/testapi37service.h" +#include "api/generated/mqtt/testapi38service.h" +#include "api/generated/mqtt/testapi39service.h" + +#include "api/generated/mqtt/testapi40service.h" +#include "api/generated/mqtt/testapi41service.h" +#include "api/generated/mqtt/testapi42service.h" +#include "api/generated/mqtt/testapi43service.h" +#include "api/generated/mqtt/testapi44service.h" +#include "api/generated/mqtt/testapi45service.h" +#include "api/generated/mqtt/testapi46service.h" +#include "api/generated/mqtt/testapi47service.h" +#include "api/generated/mqtt/testapi48service.h" +#include "api/generated/mqtt/testapi49service.h" + +#include "api/generated/mqtt/testapi50service.h" +#include "api/generated/mqtt/testapi51service.h" +#include "api/generated/mqtt/testapi52service.h" +#include "api/generated/mqtt/testapi53service.h" +#include "api/generated/mqtt/testapi54service.h" +#include "api/generated/mqtt/testapi55service.h" +#include "api/generated/mqtt/testapi56service.h" +#include "api/generated/mqtt/testapi57service.h" +#include "api/generated/mqtt/testapi58service.h" +#include "api/generated/mqtt/testapi59service.h" + +#include "api/generated/mqtt/testapi60service.h" +#include "api/generated/mqtt/testapi61service.h" +#include "api/generated/mqtt/testapi62service.h" +#include "api/generated/mqtt/testapi63service.h" +#include "api/generated/mqtt/testapi64service.h" +#include "api/generated/mqtt/testapi65service.h" +#include "api/generated/mqtt/testapi66service.h" +#include "api/generated/mqtt/testapi67service.h" +#include "api/generated/mqtt/testapi68service.h" +#include "api/generated/mqtt/testapi69service.h" + +#include "api/generated/mqtt/testapi70service.h" +#include "api/generated/mqtt/testapi71service.h" +#include "api/generated/mqtt/testapi72service.h" +#include "api/generated/mqtt/testapi73service.h" +#include "api/generated/mqtt/testapi74service.h" +#include "api/generated/mqtt/testapi75service.h" +#include "api/generated/mqtt/testapi76service.h" +#include "api/generated/mqtt/testapi77service.h" +#include "api/generated/mqtt/testapi78service.h" +#include "api/generated/mqtt/testapi79service.h" + +#include "api/generated/mqtt/testapi80service.h" +#include "api/generated/mqtt/testapi81service.h" +#include "api/generated/mqtt/testapi82service.h" +#include "api/generated/mqtt/testapi83service.h" +#include "api/generated/mqtt/testapi84service.h" +#include "api/generated/mqtt/testapi85service.h" +#include "api/generated/mqtt/testapi86service.h" +#include "api/generated/mqtt/testapi87service.h" +#include "api/generated/mqtt/testapi88service.h" +#include "api/generated/mqtt/testapi89service.h" + +#include "api/generated/mqtt/testapi90service.h" +#include "api/generated/mqtt/testapi91service.h" +#include "api/generated/mqtt/testapi92service.h" +#include "api/generated/mqtt/testapi93service.h" +#include "api/generated/mqtt/testapi94service.h" +#include "api/generated/mqtt/testapi95service.h" +#include "api/generated/mqtt/testapi96service.h" +#include "api/generated/mqtt/testapi97service.h" +#include "api/generated/mqtt/testapi98service.h" +#include "api/generated/mqtt/testapi99service.h" + +#include "api/implementation/testapi0.h" +#include "api/implementation/testapi1.h" +#include "api/implementation/testapi2.h" +#include "api/implementation/testapi3.h" +#include "api/implementation/testapi4.h" +#include "api/implementation/testapi5.h" +#include "api/implementation/testapi6.h" +#include "api/implementation/testapi7.h" +#include "api/implementation/testapi8.h" +#include "api/implementation/testapi9.h" + +#include "api/implementation/testapi10.h" +#include "api/implementation/testapi11.h" +#include "api/implementation/testapi12.h" +#include "api/implementation/testapi13.h" +#include "api/implementation/testapi14.h" +#include "api/implementation/testapi15.h" +#include "api/implementation/testapi16.h" +#include "api/implementation/testapi17.h" +#include "api/implementation/testapi18.h" +#include "api/implementation/testapi19.h" + +#include "api/implementation/testapi20.h" +#include "api/implementation/testapi21.h" +#include "api/implementation/testapi22.h" +#include "api/implementation/testapi23.h" +#include "api/implementation/testapi24.h" +#include "api/implementation/testapi25.h" +#include "api/implementation/testapi26.h" +#include "api/implementation/testapi27.h" +#include "api/implementation/testapi28.h" +#include "api/implementation/testapi29.h" + +#include "api/implementation/testapi30.h" +#include "api/implementation/testapi31.h" +#include "api/implementation/testapi32.h" +#include "api/implementation/testapi33.h" +#include "api/implementation/testapi34.h" +#include "api/implementation/testapi35.h" +#include "api/implementation/testapi36.h" +#include "api/implementation/testapi37.h" +#include "api/implementation/testapi38.h" +#include "api/implementation/testapi39.h" + +#include "api/implementation/testapi40.h" +#include "api/implementation/testapi41.h" +#include "api/implementation/testapi42.h" +#include "api/implementation/testapi43.h" +#include "api/implementation/testapi44.h" +#include "api/implementation/testapi45.h" +#include "api/implementation/testapi46.h" +#include "api/implementation/testapi47.h" +#include "api/implementation/testapi48.h" +#include "api/implementation/testapi49.h" + +#include "api/implementation/testapi50.h" +#include "api/implementation/testapi51.h" +#include "api/implementation/testapi52.h" +#include "api/implementation/testapi53.h" +#include "api/implementation/testapi54.h" +#include "api/implementation/testapi55.h" +#include "api/implementation/testapi56.h" +#include "api/implementation/testapi57.h" +#include "api/implementation/testapi58.h" +#include "api/implementation/testapi59.h" + +#include "api/implementation/testapi60.h" +#include "api/implementation/testapi61.h" +#include "api/implementation/testapi62.h" +#include "api/implementation/testapi63.h" +#include "api/implementation/testapi64.h" +#include "api/implementation/testapi65.h" +#include "api/implementation/testapi66.h" +#include "api/implementation/testapi67.h" +#include "api/implementation/testapi68.h" +#include "api/implementation/testapi69.h" + +#include "api/implementation/testapi70.h" +#include "api/implementation/testapi71.h" +#include "api/implementation/testapi72.h" +#include "api/implementation/testapi73.h" +#include "api/implementation/testapi74.h" +#include "api/implementation/testapi75.h" +#include "api/implementation/testapi76.h" +#include "api/implementation/testapi77.h" +#include "api/implementation/testapi78.h" +#include "api/implementation/testapi79.h" + +#include "api/implementation/testapi80.h" +#include "api/implementation/testapi81.h" +#include "api/implementation/testapi82.h" +#include "api/implementation/testapi83.h" +#include "api/implementation/testapi84.h" +#include "api/implementation/testapi85.h" +#include "api/implementation/testapi86.h" +#include "api/implementation/testapi87.h" +#include "api/implementation/testapi88.h" +#include "api/implementation/testapi89.h" + +#include "api/implementation/testapi90.h" +#include "api/implementation/testapi91.h" +#include "api/implementation/testapi92.h" +#include "api/implementation/testapi93.h" +#include "api/implementation/testapi94.h" +#include "api/implementation/testapi95.h" +#include "api/implementation/testapi96.h" +#include "api/implementation/testapi97.h" +#include "api/implementation/testapi98.h" +#include "api/implementation/testapi99.h" + + +template< class MqttServiceAdapter, class InterfaceService> +void addService(std::shared_ptr serviceAdapter) +{ + std::shared_ptr service = std::make_shared(); + static auto mqttServiceAdapter = std::make_shared(service, serviceAdapter); +} + + +void prepareStaticServices(std::shared_ptr serviceAdapter) +{ + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); + addService (serviceAdapter); +} diff --git a/cpp/mqtt_tests/helpers/prepare_test_services.h b/cpp/mqtt_tests/many_objects/helpers/prepare_test_services.h similarity index 96% rename from cpp/mqtt_tests/helpers/prepare_test_services.h rename to cpp/mqtt_tests/many_objects/helpers/prepare_test_services.h index e5956316..78f76947 100644 --- a/cpp/mqtt_tests/helpers/prepare_test_services.h +++ b/cpp/mqtt_tests/many_objects/helpers/prepare_test_services.h @@ -1,5 +1,5 @@ -#pragma once - -#include "apigear/mqtt/mqttservice.h" - -void prepareStaticServices(std::shared_ptr serviceAdapter); +#pragma once + +#include "apigear/mqtt/mqttservice.h" + +void prepareStaticServices(std::shared_ptr serviceAdapter); diff --git a/cpp/mqtt_tests/many_objects/server.cpp b/cpp/mqtt_tests/many_objects/server.cpp index c7f38b9a..092c36b4 100644 --- a/cpp/mqtt_tests/many_objects/server.cpp +++ b/cpp/mqtt_tests/many_objects/server.cpp @@ -1,6 +1,6 @@ #include "apigear/mqtt/mqttservice.h" -#include "../helpers/test_message_topics.h" -#include "../helpers/prepare_test_services.h" +#include "../test_message_topics.h" +#include "helpers/prepare_test_services.h" #include #include #include diff --git a/cpp/mqtt_tests/helpers/mqtt_network_protocol_handler_for_test.hpp b/cpp/mqtt_tests/mqtt_network_protocol_handler_for_test.hpp similarity index 90% rename from cpp/mqtt_tests/helpers/mqtt_network_protocol_handler_for_test.hpp rename to cpp/mqtt_tests/mqtt_network_protocol_handler_for_test.hpp index a3297eb0..852d1dc1 100644 --- a/cpp/mqtt_tests/helpers/mqtt_network_protocol_handler_for_test.hpp +++ b/cpp/mqtt_tests/mqtt_network_protocol_handler_for_test.hpp @@ -1,107 +1,107 @@ -#pragma once - -#include "apigear/mqtt/mqttclient.h" -#include "test_message_topics.h" -#include -#include -#include -#include -#include - - -class MqttHandlerForTest -{ -public: - MqttHandlerForTest(std::string brokerUrl) - :m_brokerUrl(brokerUrl) - { - m_client = std::make_shared("VeryUniqueClientId"); - } - - void prepareConnection() - { - m_client->connectToHost(m_brokerUrl); - std::this_thread::sleep_for(std::chrono::milliseconds(400)); - } - - template - void connectObjects(std::vector& testData) - { - for (auto& element : testData) - { - int number = 0; - auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); - m_client->setRemoteProperty(TestMessages::clientStartsTestTopic, { payload }); - } - } - - template - void connectObjects(TestData& testData) - { - static int number = 0; - auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); - m_client->setRemoteProperty(TestMessages::clientStartsTestTopic,{ payload }); - } - - template - void disconnectObjects(std::vector& testData) - { - for (auto& element : testData) - { - int number = 0; - auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); - m_client->setRemoteProperty(TestMessages::clientStopsTestTopic, { payload }); - } - } - template - void disconnectObjects(TestData& testData) - { - static int number = 0; - auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); - m_client->setRemoteProperty(TestMessages::clientStopsTestTopic, { payload }); - } - - template - void waitForReturnMessages(std::vector& testData, uint32_t messages_number) - { - auto allMessagesReceived = false; - while (!allMessagesReceived) - { - auto serviceWithAllMessages = 0u; - for (const auto& element : testData) - { - if (element.sink->receivedMessages() == messages_number) - { - serviceWithAllMessages++; - } - } - allMessagesReceived = serviceWithAllMessages == testData.size(); - } - } - - template - void waitForReturnMessages(const TestData& testData, uint32_t messages_number) - { - auto allMessagesReceived = false; - while (!allMessagesReceived) - { - allMessagesReceived = testData.sink->receivedMessages() == messages_number; - } - } - - template - void waitUntilObjectConnected(const TestData& object) - { - while (!object.sink->isReady()) - { - // wait until ready to use. - } - } - std::shared_ptr getClient() - { - return m_client; - } -private: - std::string m_brokerUrl; - std::shared_ptr m_client; -}; +#pragma once + +#include "apigear/mqtt/mqttclient.h" +#include "test_message_topics.h" +#include +#include +#include +#include +#include + + +class MqttHandlerForTest +{ +public: + MqttHandlerForTest(std::string brokerUrl) + :m_brokerUrl(brokerUrl) + { + m_client = std::make_shared("VeryUniqueClientId"); + } + + void prepareConnection() + { + m_client->connectToHost(m_brokerUrl); + std::this_thread::sleep_for(std::chrono::milliseconds(400)); + } + + template + void connectObjects(std::vector& testData) + { + for (auto& element : testData) + { + int number = 0; + auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); + m_client->setRemoteProperty(TestMessages::clientStartsTestTopic, { payload }); + } + } + + template + void connectObjects(TestData& testData) + { + static int number = 0; + auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); + m_client->setRemoteProperty(TestMessages::clientStartsTestTopic,{ payload }); + } + + template + void disconnectObjects(std::vector& testData) + { + for (auto& element : testData) + { + int number = 0; + auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); + m_client->setRemoteProperty(TestMessages::clientStopsTestTopic, { payload }); + } + } + template + void disconnectObjects(TestData& testData) + { + static int number = 0; + auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); + m_client->setRemoteProperty(TestMessages::clientStopsTestTopic, { payload }); + } + + template + void waitForReturnMessages(std::vector& testData, uint32_t messages_number) + { + auto allMessagesReceived = false; + while (!allMessagesReceived) + { + auto serviceWithAllMessages = 0u; + for (const auto& element : testData) + { + if (element.receivedMessages() == messages_number) + { + serviceWithAllMessages++; + } + } + allMessagesReceived = serviceWithAllMessages == testData.size(); + } + } + + template + void waitForReturnMessages(const TestData& testData, uint32_t messages_number) + { + auto allMessagesReceived = false; + while (!allMessagesReceived) + { + allMessagesReceived = testData.receivedMessages() == messages_number; + } + } + + template + void waitUntilObjectConnected(const TestData& object) + { + while (!object.isReady()) + { + // wait until ready to use. + } + } + std::shared_ptr getClient() + { + return m_client; + } +private: + std::string m_brokerUrl; + std::shared_ptr m_client; +}; diff --git a/cpp/mqtt_tests/single_object_many_threads/CMakeLists.txt b/cpp/mqtt_tests/single_object_many_threads/CMakeLists.txt index 9c34f9e9..eeb046b4 100644 --- a/cpp/mqtt_tests/single_object_many_threads/CMakeLists.txt +++ b/cpp/mqtt_tests/single_object_many_threads/CMakeLists.txt @@ -15,10 +15,17 @@ find_package(api COMPONENTS api-implementation api-mqtt) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -add_executable(mqtt_single_client_setIntProperty "client_setIntProperty.cpp" ) +add_executable(mqtt_single_client_setIntProperty "client_setIntProperty.cpp" "../../latency_helpers/latency_helpers.cpp") add_executable(mqtt_single_client_setStringProperty "client_setStringProperty.cpp" ) add_executable(mqtt_single_server "server.cpp" ) +add_executable(mqtt_single_client_syncSetIntProperty "client_syncSetIntProperty.cpp" "../../latency_helpers/latency_helpers.cpp") +add_executable(mqtt_single_client_syncMethodInt "client_syncIntMethodCall.cpp" "../../latency_helpers/latency_helpers.cpp") +add_executable(mqtt_single_client_asyncMethodInt "client_asyncIntMethodCall.cpp" "../../latency_helpers/latency_helpers.cpp") target_link_libraries(mqtt_single_server api::api-mqtt api::api-implementation) target_link_libraries(mqtt_single_client_setIntProperty api::api-mqtt) target_link_libraries(mqtt_single_client_setStringProperty api::api-mqtt) +target_link_libraries(mqtt_single_client_syncSetIntProperty api::api-mqtt) +target_link_libraries(mqtt_single_client_syncMethodInt api::api-mqtt) +target_link_libraries(mqtt_single_client_asyncMethodInt api::api-mqtt) + diff --git a/cpp/mqtt_tests/single_object_many_threads/client_asyncIntMethodCall.cpp b/cpp/mqtt_tests/single_object_many_threads/client_asyncIntMethodCall.cpp new file mode 100644 index 00000000..95c37c7d --- /dev/null +++ b/cpp/mqtt_tests/single_object_many_threads/client_asyncIntMethodCall.cpp @@ -0,0 +1,103 @@ +#include "api/generated/mqtt/testapi0client.h" + +#include "../mqtt_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" +#include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" + +#include +#include +#include +#include +#include +#include + + +class PropertyIntTestData +{ +public: + PropertyIntTestData(std::shared_ptr client, + std::vector& latenciesStart, + std::vector& latenciesStop) + :m_latenciesStart(latenciesStart), + m_latenciesStop(latenciesStop) + { + m_futures = std::vector>(latenciesStart.size(), std::shared_future ()); + sink = std::make_shared(client); + } + + void testFunction(uint32_t value) + { + m_latenciesStart[value] = std::chrono::high_resolution_clock::now(); + auto task = sink->funcIntAsync(value, + [this](int32_t value) { + m_latenciesStop[value] = std::chrono::high_resolution_clock::now(); + msgsReceived++; + }); + m_futures[value]=task.share(); + } + + bool allResponsesReceived (uint32_t sentRequestsNumber) const + { + return msgsReceived == sentRequestsNumber; + } + + bool isReady() const + { + return sink->_is_ready(); + } + void wait() { + for (auto task : m_futures) + { + task.get(); + } + isDone = true; + } + + uint32_t receivedMessages() const + { + return msgsReceived; + } + std::vector& m_latenciesStart; + std::vector& m_latenciesStop; + std::vector> m_futures; + std::atomic msgsReceived{ 0 }; + std::atomic isDone{ false }; + std::shared_ptr sink; +}; + +/* +By default test request property int change 1000 times from each of 100 threads. +Test waits for the responses after sending all the messages, not for each one. +You can play around with running this program with different messages number and different threads number. +*/ +int main(int argc, char* argv[]) +{ + std::vector timePerMessage; + auto sendThreadNumber = 1u; + auto messages_number = 10u; + if (argc > 1) + { + char* p; + messages_number = strtol(argv[1], &p, 10); + } + if (argc > 2) + { + char* p; + sendThreadNumber = strtol(argv[2], &p, 10); + } + + std::string brokerUrl = "tcp://localhost:1883"; + MqttHandlerForTest networkProtocolHandler(brokerUrl); + + auto total_messages_number = messages_number * sendThreadNumber; + std::vector m_latenciesStart(total_messages_number, chrono_hr_timepoint()); + std::vector m_latenciesStop(total_messages_number, chrono_hr_timepoint()); + PropertyIntTestData testObject(networkProtocolHandler.getClient(), m_latenciesStart, m_latenciesStop); + + executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); + testObject.wait(); + networkProtocolHandler.getClient()->disconnect(); + calculateAndPrintLatencyParameters(m_latenciesStart, m_latenciesStop); + + return 0; +} \ No newline at end of file diff --git a/cpp/mqtt_tests/single_object_many_threads/client_setIntProperty.cpp b/cpp/mqtt_tests/single_object_many_threads/client_setIntProperty.cpp index 3a38e4df..f58fd0d8 100644 --- a/cpp/mqtt_tests/single_object_many_threads/client_setIntProperty.cpp +++ b/cpp/mqtt_tests/single_object_many_threads/client_setIntProperty.cpp @@ -1,33 +1,55 @@ -#include "../helpers/itestsink.h" #include "api/generated/mqtt/testapi0client.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" -#include "../helpers/mqtt_network_protocol_handler_for_test.hpp" +#include "../mqtt_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" #include - +#include class PropertyIntTestData { public: - PropertyIntTestData(std::shared_ptr client) - { - auto obj = std::make_shared>(client); - m_testFunction = [obj](uint32_t value) +PropertyIntTestData(std::shared_ptr client, + std::vector& latenciesStart, + std::vector& latenciesStop) + :m_latenciesStart(latenciesStart), + m_latenciesStop(latenciesStop) +{ + sink = std::make_shared(client); + sink->_getPublisher().subscribeToPropIntChanged([this](int propInt) { - // Add one, to avoid setting property to 0 as first call, 0 is default property and it won't be set for same value. - obj->setPropInt(value + 1); - }; - sink = obj; - } + auto index = propInt - 1; + m_latenciesStop[index] = std::chrono::high_resolution_clock::now(); + count++; + }); +} void testFunction(uint32_t value) { - m_testFunction(value); + m_latenciesStart[value] = std::chrono::high_resolution_clock::now(); + sink->setPropInt(value + 1); } -public: - std::function m_testFunction; - std::shared_ptr sink; + bool allResponsesReceived(uint32_t sentRequestsNumber) const + { + return count == sentRequestsNumber; + } + + bool isReady() const + { + return sink->_is_ready(); + } + + uint32_t receivedMessages() const + { + return count; + } + +private: + std::atomic count{ 0 }; + std::shared_ptr sink; + std::vector& m_latenciesStart; + std::vector& m_latenciesStop; }; /* @@ -53,8 +75,14 @@ int main(int argc, char* argv[]) std::string brokerUrl = "tcp://localhost:1883"; MqttHandlerForTest networkProtocolHandler(brokerUrl); - PropertyIntTestData testObject(networkProtocolHandler.getClient()); + auto total_messages_number = messages_number * sendThreadNumber; + std::vector m_latenciesStart(total_messages_number, chrono_hr_timepoint()); + std::vector m_latenciesStop(total_messages_number, chrono_hr_timepoint()); + + PropertyIntTestData testObject(networkProtocolHandler.getClient(), m_latenciesStart, m_latenciesStop); executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); + networkProtocolHandler.getClient()->disconnect(); + calculateAndPrintLatencyParameters(m_latenciesStart, m_latenciesStop); } diff --git a/cpp/mqtt_tests/single_object_many_threads/client_setStringProperty.cpp b/cpp/mqtt_tests/single_object_many_threads/client_setStringProperty.cpp index f19e441e..3be3f20d 100644 --- a/cpp/mqtt_tests/single_object_many_threads/client_setStringProperty.cpp +++ b/cpp/mqtt_tests/single_object_many_threads/client_setStringProperty.cpp @@ -1,63 +1,54 @@ #include "api/generated/mqtt/testapi0client.h" -#include "../helpers/itestsink.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" -#include "../helpers/mqtt_network_protocol_handler_for_test.hpp" +#include "../mqtt_network_protocol_handler_for_test.hpp" #include -class PropertyIntTestData -{ -public: - PropertyIntTestData(std::shared_ptr client) - { - auto obj = std::make_shared>(client); - m_testFunction = [obj](uint32_t value) - { - // Add one, to avoid setting property to 0 as first call, 0 is default property and it won't be set for same value. - obj->setPropInt(value + 1); - }; - sink = obj; - } - - void testFunction(uint32_t value) - { - m_testFunction(value); - } - -public: - std::function m_testFunction; - std::shared_ptr sink; -}; struct PropertyStringTestData { public: PropertyStringTestData(std::shared_ptr client, uint32_t messages_number, uint32_t sendThreadNumber) { + sink = std::make_shared(client); + sink->_getPublisher().subscribeToPropStringChanged([this](auto value) + { + (void)value; + count++; + }); for (int msgNo = 0u; msgNo < sendThreadNumber*(messages_number +1); msgNo++) { auto message = "Some longer property to be set, prepared before test for each message number to reduce allocating time in tests"+ std::to_string(msgNo); messagesToSend.push_back(message); } + } - auto obj = std::make_shared>(client); - m_testFunction = [obj, this](uint32_t value) - { - obj->setPropString(messagesToSend[value]); - }; - sink = obj; + void testFunction(uint32_t value) + { + sink->setPropString(messagesToSend[value]); + } + + bool allResponsesReceived(uint32_t sentRequestsNumber) const + { + return count == sentRequestsNumber; + } + bool isReady() const + { + return sink->_is_ready(); } - void testFunction(uint32_t value) + uint32_t receivedMessages() const { - m_testFunction(value); + return count; } - std::shared_ptr sink; + private: - std::function m_testFunction; + std::atomic count{ 0 }; + std::shared_ptr sink; // Prepare different messages to send before test starts not to slow down it with allocation of this many messages: std::vector messagesToSend; + }; diff --git a/cpp/mqtt_tests/single_object_many_threads/client_syncIntMethodCall.cpp b/cpp/mqtt_tests/single_object_many_threads/client_syncIntMethodCall.cpp new file mode 100644 index 00000000..26c9c47c --- /dev/null +++ b/cpp/mqtt_tests/single_object_many_threads/client_syncIntMethodCall.cpp @@ -0,0 +1,87 @@ +#include "api/generated/mqtt/testapi0client.h" + +#include "../mqtt_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" +#include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" + +#include +#include +#include +#include +#include + +class PropertyIntTestData +{ +public: + PropertyIntTestData(std::shared_ptr client, + std::vector& latenciesStart, + std::vector& latenciesStop) + :m_latenciesStart(latenciesStart), + m_latenciesStop(latenciesStop) + { + sink = std::make_shared(client); + } + + void testFunction(uint32_t value) + { + m_latenciesStart[value] = std::chrono::high_resolution_clock::now(); + auto result = sink->funcInt(value); + msgsReceived++; + m_latenciesStop[result] = std::chrono::high_resolution_clock::now(); + } + bool allResponsesReceived (uint32_t sentRequestsNumber) const + { + return true; + } + bool isReady() const + { + return sink->_is_ready(); + } + + uint32_t receivedMessages() const + { + return msgsReceived; + } + + std::vector& m_latenciesStart; + std::vector& m_latenciesStop; + std::vector> m_futures; + std::atomic msgsReceived{ 0 }; + std::shared_ptr sink; +}; + +/* +By default test request property int change 100 times from each of 1 threads. +Test waits for the responses after sending all the messages, not for each one. +You can play around with running this program with different messages number and different threads number. +*/ +int main(int argc, char* argv[]) +{ + std::vector timePerMessage; + auto sendThreadNumber = 1u; + auto messages_number = 100u; + if (argc > 1) + { + char* p; + messages_number = strtol(argv[1], &p, 10); + } + if (argc > 2) + { + char* p; + sendThreadNumber = strtol(argv[2], &p, 10); + } + std::string brokerUrl = "tcp://localhost:1883"; + MqttHandlerForTest networkProtocolHandler(brokerUrl); + + auto total_messages_number = messages_number * sendThreadNumber; + std::vector m_latenciesStart(total_messages_number, chrono_hr_timepoint()); + std::vector m_latenciesStop(total_messages_number, chrono_hr_timepoint()); + PropertyIntTestData testObject(networkProtocolHandler.getClient(), m_latenciesStart, m_latenciesStop); + + executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); + networkProtocolHandler.getClient()->disconnect(); + calculateAndPrintLatencyParameters(m_latenciesStart, m_latenciesStop); + + //CRASH WHEN NOT DISCONNECTED AND + return 0; +} \ No newline at end of file diff --git a/cpp/mqtt_tests/single_object_many_threads/client_syncSetIntProperty.cpp b/cpp/mqtt_tests/single_object_many_threads/client_syncSetIntProperty.cpp new file mode 100644 index 00000000..c3c9eb00 --- /dev/null +++ b/cpp/mqtt_tests/single_object_many_threads/client_syncSetIntProperty.cpp @@ -0,0 +1,98 @@ + +#include "api/generated/mqtt/testapi0client.h" + +#include "../mqtt_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" +#include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" + +#include +#include +#include +#include +#include + + +class PropertyIntTestData +{ +public: + PropertyIntTestData(std::shared_ptr client, + std::vector& latenciesStart, + std::vector& latenciesStop) + :m_latenciesStart(latenciesStart), + m_latenciesStop(latenciesStop) + { + sink = std::make_shared(client); + sink->_getPublisher().subscribeToPropIntChanged([this](int propInt) + { + if (propInt == 0) + { + std::cout << "FIRST MSG"; + return; + } + auto index = propInt-1; + m_latenciesStop[index]=std::chrono::high_resolution_clock::now(); + count++; + }); + } + void testFunction(uint32_t value) + { + m_latenciesStart[value] = std::chrono::high_resolution_clock::now(); + sink->setPropInt(value +1); + while (count < value){} + } + bool allResponsesReceived (uint32_t sentRequestsNumber) const + { + return count == sentRequestsNumber; + } + + bool isReady() const + { + return sink->_is_ready(); + } + + uint32_t receivedMessages() const + { + return count; + } +private: + std::vector& m_latenciesStart; + std::vector& m_latenciesStop; + + std::atomic count { 0 }; + std::shared_ptr sink; +}; + +/* +By default test request property int change 1000 times from each of 100 threads. +Test waits for the responses after sending all the messages, not for each one. +You can play around with running this program with different messages number and different threads number. +*/ +int main(int argc, char* argv[]) +{ + std::vector timePerMessage; + auto sendThreadNumber = 1u; + auto messages_number = 10u; + if (argc > 1) + { + char* p; + messages_number = strtol(argv[1], &p, 10); + } + if (argc > 2) + { + char* p; + sendThreadNumber = strtol(argv[2], &p, 10); + } + + std::string brokerUrl = "tcp://localhost:1883"; + MqttHandlerForTest networkProtocolHandler(brokerUrl); + auto total_messages_number = messages_number * sendThreadNumber; + std::vector m_latenciesStart(total_messages_number, chrono_hr_timepoint()); + std::vector m_latenciesStop(total_messages_number, chrono_hr_timepoint()); + + PropertyIntTestData testObject(networkProtocolHandler.getClient(), m_latenciesStart, m_latenciesStop); + executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); + networkProtocolHandler.getClient()->disconnect(); + calculateAndPrintLatencyParameters(m_latenciesStart, m_latenciesStop); + + return 0; +} \ No newline at end of file diff --git a/cpp/mqtt_tests/single_object_many_threads/server.cpp b/cpp/mqtt_tests/single_object_many_threads/server.cpp index a9cd9b9a..17c6d24c 100644 --- a/cpp/mqtt_tests/single_object_many_threads/server.cpp +++ b/cpp/mqtt_tests/single_object_many_threads/server.cpp @@ -1,7 +1,7 @@ #include "api/generated/mqtt/testapi0service.h" #include "api/implementation/testapi0.h" #include "apigear/mqtt/mqttservice.h" -#include "../helpers/test_message_topics.h" +#include "../test_message_topics.h" #include #include #include @@ -27,8 +27,12 @@ class TestWatcher :m_service(service) { - m_service.subscribeTopic(TestMessages::clientStartsTestTopic, [this](const auto&, const auto&, const auto&){ countStartMessages++; std::cout<< "started";}); - m_service.subscribeTopic(TestMessages::clientStopsTestTopic, [this](const auto&, const auto&, const auto&){countStopMessages++; std::cout << "stopped";}); + m_service.subscribeTopic(TestMessages::clientStartsTestTopic, + [this](const auto&, const auto&, const auto&){ countStartMessages++; std::cout<< "started";}, + [](auto topic, auto val) {}); + m_service.subscribeTopic(TestMessages::clientStopsTestTopic, + [this](const auto&, const auto&, const auto&){countStopMessages++; std::cout << "stopped";}, + [](auto topic, auto val) {}); } ~TestWatcher() diff --git a/cpp/mqtt_tests/helpers/test_message_topics.h b/cpp/mqtt_tests/test_message_topics.h similarity index 96% rename from cpp/mqtt_tests/helpers/test_message_topics.h rename to cpp/mqtt_tests/test_message_topics.h index 2345e38e..ad39d79a 100644 --- a/cpp/mqtt_tests/helpers/test_message_topics.h +++ b/cpp/mqtt_tests/test_message_topics.h @@ -1,9 +1,9 @@ -#pragma once -#include - -// Messages to be send from client(s) to service adapter to inform that it started test or stopped test -namespace TestMessages -{ -const std::string clientStartsTestTopic = "StartTestTopic"; -const std::string clientStopsTestTopic = "StopTestTopic"; -} +#pragma once +#include + +// Messages to be send from client(s) to service adapter to inform that it started test or stopped test +namespace TestMessages +{ +const std::string clientStartsTestTopic = "StartTestTopic"; +const std::string clientStopsTestTopic = "StopTestTopic"; +} diff --git a/cpp/nats_tests/nats_network_protocol_handler_for_test.hpp b/cpp/nats_tests/nats_network_protocol_handler_for_test.hpp new file mode 100644 index 00000000..e88c56a3 --- /dev/null +++ b/cpp/nats_tests/nats_network_protocol_handler_for_test.hpp @@ -0,0 +1,109 @@ +#pragma once + +#include "apigear/nats/natsclient.h" +#include "test_message_topics.h" +#include +#include +#include +#include +#include +#include + + +class NatsHandlerForTest +{ +public: + NatsHandlerForTest(std::string brokerUrl) + :m_brokerUrl(brokerUrl) + { + m_client = std::make_shared(); + } + + void prepareConnection() + { + m_client->connect(m_brokerUrl); + std::this_thread::sleep_for(std::chrono::milliseconds(400)); + } + + template + void connectObjects(std::vector& testData) + { + for (auto& element : testData) + { + int number = 0; + auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); + m_client->publish(NatsTestMessages::clientStartsTestTopic, { payload }); + } + } + + template + void connectObjects(TestData& testData) + { + static int number = 0; + auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); + m_client->publish(NatsTestMessages::clientStartsTestTopic,{ payload }); + } + + template + void disconnectObjects(std::vector& testData) + { + for (auto& element : testData) + { + int number = 0; + auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); + m_client->publish(NatsTestMessages::clientStopsTestTopic, { payload }); + } + } + template + void disconnectObjects(TestData& testData) + { + static int number = 0; + auto payload = (nlohmann::json({ "object no " + std::to_string(number++) }).dump()); + m_client->publish(NatsTestMessages::clientStopsTestTopic, { payload }); + } + + template + void waitForReturnMessages(std::vector& testData, uint32_t messages_number) + { + auto allMessagesReceived = false; + while (!allMessagesReceived) + { + auto serviceWithAllMessages = 0u; + for (const auto& element : testData) + { + if (element.receivedMessages() == messages_number) + { + serviceWithAllMessages++; + } + } + allMessagesReceived = serviceWithAllMessages == testData.size(); + } + } + + template + void waitForReturnMessages(const TestData& testData, uint32_t messages_number) + { + auto allMessagesReceived = false; + while (!allMessagesReceived) + { + allMessagesReceived = testData.receivedMessages() == messages_number; + } + std::cout << "finishing " << testData.receivedMessages() << std::endl; + } + + template + void waitUntilObjectConnected(const TestData& object) + { + while (!object.isReady()) + { + // wait until ready to use. + } + } + std::shared_ptr getClient() + { + return m_client; + } +private: + std::string m_brokerUrl; + std::shared_ptr m_client; +}; diff --git a/cpp/nats_tests/single_object_many_threads/CMakeLists.txt b/cpp/nats_tests/single_object_many_threads/CMakeLists.txt new file mode 100644 index 00000000..66e095e4 --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 3.20) +project(nats_single_objects_tests) + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(JSON_BuildTests OFF) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(api COMPONENTS api-implementation api-nats) + +set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + + +add_executable(nats_single_client_setIntProperty "client_setIntProperty.cpp" "../../latency_helpers/latency_helpers.cpp") +add_executable(nats_single_server "server.cpp" ) +add_executable(nats_single_client_syncSetIntProperty "client_syncSetIntProperty.cpp" "../../latency_helpers/latency_helpers.cpp") +add_executable(nats_single_client_syncMethodInt "client_syncIntMethodCall.cpp" "../../latency_helpers/latency_helpers.cpp") +add_executable(nats_single_client_asyncMethodInt "client_asyncIntMethodCall.cpp" "../../latency_helpers/latency_helpers.cpp") + +target_link_libraries(nats_single_server api::api-nats api::api-implementation) +target_link_libraries(nats_single_client_setIntProperty api::api-nats) +target_link_libraries(nats_single_client_syncSetIntProperty api::api-nats) +target_link_libraries(nats_single_client_syncMethodInt api::api-nats) +target_link_libraries(nats_single_client_asyncMethodInt api::api-nats) diff --git a/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp b/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp new file mode 100644 index 00000000..f0977dc0 --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp @@ -0,0 +1,95 @@ +#include "api/generated/nats/testapi0client.h" + +#include "../nats_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" +#include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" + +#include +#include +#include +#include +#include +#include + + +class PropertyIntTestData +{ +public: + PropertyIntTestData(std::shared_ptr client, + std::vector& latenciesStart, + std::vector& latenciesStop) + :m_latenciesStart(latenciesStart), + m_latenciesStop(latenciesStop) + { + m_futures = std::vector>(latenciesStart.size(), std::shared_future ()); + sink = Cpp::Api::Nats::TestApi0Client::create(client); + } + + void testFunction(uint32_t value) + { + + m_latenciesStart[value] = std::chrono::high_resolution_clock::now(); + auto task = sink->funcIntAsync(value, + [this](int32_t value) { + m_latenciesStop[value] = std::chrono::high_resolution_clock::now(); + msgsReceived++; + }); + + m_futures[value]=task.share(); + } + + bool allResponsesReceived (uint32_t sentRequestsNumber) const + { + return msgsReceived == sentRequestsNumber; + } + + bool isReady() const + { + return sink->_is_ready(); + } + + uint32_t receivedMessages() const + { + return msgsReceived; + } + std::vector& m_latenciesStart; + std::vector& m_latenciesStop; + std::vector> m_futures; + std::atomic msgsReceived{ 0 }; + std::shared_ptr sink; +}; + +/* +By default test request property int change 1000 times from each of 100 threads. +Test waits for the responses after sending all the messages, not for each one. +You can play around with running this program with different messages number and different threads number. +*/ +int main(int argc, char* argv[]) +{ + std::vector timePerMessage; + auto sendThreadNumber = 1u; + auto messages_number = 1000u; + if (argc > 1) + { + char* p; + messages_number = strtol(argv[1], &p, 10); + } + if (argc > 2) + { + char* p; + sendThreadNumber = strtol(argv[2], &p, 10); + } + + std::string brokerUrl = "nats://localhost:4222"; + NatsHandlerForTest networkProtocolHandler(brokerUrl); + + auto total_messages_number = messages_number * sendThreadNumber; + std::vector m_latenciesStart(total_messages_number, chrono_hr_timepoint()); + std::vector m_latenciesStop(total_messages_number, chrono_hr_timepoint()); + PropertyIntTestData testObject(networkProtocolHandler.getClient(), m_latenciesStart, m_latenciesStop); + + executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); + calculateAndPrintLatencyParameters(m_latenciesStart, m_latenciesStop); + + return 0; +} \ No newline at end of file diff --git a/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp b/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp new file mode 100644 index 00000000..a651ed7b --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp @@ -0,0 +1,84 @@ +#include "api/generated/nats/testapi0client.h" +#include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" +#include "../nats_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" +#include + + +class PropertyIntTestData +{ +public: + PropertyIntTestData(std::shared_ptr client, + std::vector& latenciesStart, + std::vector& latenciesStop) + :m_latenciesStart(latenciesStart), + m_latenciesStop(latenciesStop) + { + sink = Cpp::Api::Nats::TestApi0Client::create(client); + sink->_getPublisher().subscribeToPropIntChanged([this](int propInt) + { + auto index = propInt - 1; + m_latenciesStop[index] = std::chrono::high_resolution_clock::now(); + count++; + }); + } + void testFunction(uint32_t value) + { + m_latenciesStart[value] = std::chrono::high_resolution_clock::now(); + sink->setPropInt(value + 1); + } + bool allResponsesReceived(uint32_t sentRequestsNumber) const + { + return count == sentRequestsNumber; + } + + bool isReady() const + { + return sink->_is_ready(); + } + + uint32_t receivedMessages() const + { + return count; + } +private: + std::vector& m_latenciesStart; + std::vector& m_latenciesStop; + + std::atomic count{ 0 }; + std::shared_ptr sink; +}; +/* +By default test request property int change 1000 times from each of 100 threads. +Test waits for the responses after sending all the messages, not for each one. +You can play around with running this program with different messages number and different threads number. +*/ +int main(int argc, char* argv[]) +{ + auto sendThreadNumber = 1; + auto messages_number = 10u; + if (argc > 1) + { + char* p; + messages_number = strtol(argv[1], &p, 10); + } + if (argc > 2) + { + char* p; + sendThreadNumber = strtol(argv[2], &p, 10); + } + + std::string brokerUrl = "nats://localhost:4222"; + NatsHandlerForTest networkProtocolHandler(brokerUrl); + auto total_messages_number = messages_number * sendThreadNumber; + std::vector m_latenciesStart(total_messages_number, chrono_hr_timepoint()); + std::vector m_latenciesStop(total_messages_number, chrono_hr_timepoint()); + + PropertyIntTestData testObject(networkProtocolHandler.getClient(), m_latenciesStart, m_latenciesStop); + executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); + + calculateAndPrintLatencyParameters(m_latenciesStart, m_latenciesStop); + + networkProtocolHandler.getClient()->disconnect(); +} + diff --git a/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp b/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp new file mode 100644 index 00000000..a5a0d989 --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp @@ -0,0 +1,85 @@ +#include "api/generated/nats/testapi0client.h" + +#include "../nats_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" +#include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" + +#include +#include +#include +#include +#include + +class PropertyIntTestData +{ +public: + PropertyIntTestData(std::shared_ptr client, + std::vector& latenciesStart, + std::vector& latenciesStop) + :m_latenciesStart(latenciesStart), + m_latenciesStop(latenciesStop) + { + sink = Cpp::Api::Nats::TestApi0Client::create(client); + } + + void testFunction(uint32_t value) + { + m_latenciesStart[value] = std::chrono::high_resolution_clock::now(); + auto result = sink->funcInt(value); + msgsReceived++; + m_latenciesStop[result] = std::chrono::high_resolution_clock::now(); + } + bool allResponsesReceived (uint32_t sentRequestsNumber) const + { + return true; + } + bool isReady() const + { + return sink->_is_ready(); + } + + uint32_t receivedMessages() const + { + return msgsReceived; + } + + std::vector& m_latenciesStart; + std::vector& m_latenciesStop; + std::vector> m_futures; + std::atomic msgsReceived{ 0 }; + std::shared_ptr sink; +}; + +/* +By default test request property int change 1000 times from each of 100 threads. +Test waits for the responses after sending all the messages, not for each one. +You can play around with running this program with different messages number and different threads number. +*/ +int main(int argc, char* argv[]) +{ + std::vector timePerMessage; + auto sendThreadNumber = 100u; + auto messages_number = 1000u; + if (argc > 1) + { + char* p; + messages_number = strtol(argv[1], &p, 10); + } + if (argc > 2) + { + char* p; + sendThreadNumber = strtol(argv[2], &p, 10); + } + std::string brokerUrl = "nats://localhost:4222"; + NatsHandlerForTest networkProtocolHandler(brokerUrl); + + auto total_messages_number = messages_number * sendThreadNumber; + std::vector m_latenciesStart(total_messages_number, chrono_hr_timepoint()); + std::vector m_latenciesStop(total_messages_number, chrono_hr_timepoint()); + PropertyIntTestData testObject(networkProtocolHandler.getClient(), m_latenciesStart, m_latenciesStop); + + executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); + + calculateAndPrintLatencyParameters(m_latenciesStart, m_latenciesStop); + return 0; +} \ No newline at end of file diff --git a/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp b/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp new file mode 100644 index 00000000..62d624ab --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp @@ -0,0 +1,93 @@ + +#include "api/generated/nats/testapi0client.h" + +#include "../nats_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" +#include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" + +#include +#include +#include +#include +#include + + +class PropertyIntTestData +{ +public: + PropertyIntTestData(std::shared_ptr client, + std::vector& latenciesStart, + std::vector& latenciesStop) + :m_latenciesStart(latenciesStart), + m_latenciesStop(latenciesStop) + { + sink = Cpp::Api::Nats::TestApi0Client::create(client); + sink->_getPublisher().subscribeToPropIntChanged([this](int propInt) + { + auto index = propInt-1; + m_latenciesStop[index]=std::chrono::high_resolution_clock::now(); + count++; + }); + } + void testFunction(uint32_t value) + { + m_latenciesStart[value] = std::chrono::high_resolution_clock::now(); + sink->setPropInt(value +1); + while (count < value){} + } + bool allResponsesReceived (uint32_t sentRequestsNumber) const + { + return count == sentRequestsNumber; + } + + bool isReady() const + { + return sink->_is_ready(); + } + + uint32_t receivedMessages() const + { + return count; + } +private: + std::vector& m_latenciesStart; + std::vector& m_latenciesStop; + + std::atomic count { 0 }; + std::shared_ptr sink; +}; + +/* +By default test request property int change 1000 times from each of 100 threads. +Test waits for the responses after sending all the messages, not for each one. +You can play around with running this program with different messages number and different threads number. +*/ +int main(int argc, char* argv[]) +{ + std::vector timePerMessage; + auto sendThreadNumber = 1u; + auto messages_number = 10u; + if (argc > 1) + { + char* p; + messages_number = strtol(argv[1], &p, 10); + } + if (argc > 2) + { + char* p; + sendThreadNumber = strtol(argv[2], &p, 10); + } + + std::string brokerUrl = "nats://localhost:4222"; + NatsHandlerForTest networkProtocolHandler(brokerUrl); + auto total_messages_number = messages_number * sendThreadNumber; + std::vector m_latenciesStart(total_messages_number, chrono_hr_timepoint()); + std::vector m_latenciesStop(total_messages_number, chrono_hr_timepoint()); + + PropertyIntTestData testObject(networkProtocolHandler.getClient(), m_latenciesStart, m_latenciesStop); + executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); + + calculateAndPrintLatencyParameters(m_latenciesStart, m_latenciesStop); + + return 0; +} \ No newline at end of file diff --git a/cpp/nats_tests/single_object_many_threads/server.cpp b/cpp/nats_tests/single_object_many_threads/server.cpp new file mode 100644 index 00000000..c08b0955 --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/server.cpp @@ -0,0 +1,81 @@ +#include "api/generated/nats/testapi0service.h" +#include "api/implementation/testapi0.h" +#include "apigear/nats/natsservice.h" +#include "../test_message_topics.h" +#include +#include +#include +#include +#include + +/* +* Helper object that subscribes for test messages from remote clients. +* Client side test is supposed to send those on test start and finish. +*/ +class TestWatcher +{ +public: + bool isStarted() + { + return countStartMessages > 0; + } + bool isFinished(){ + return isStarted() && false;// countStartMessages == countStopMessages; + } + + TestWatcher(ApiGear::Nats::Service& service) + :m_service(service) + { + + // m_service.subscribe(NatsTestMessages::clientStartsTestTopic, [this](const auto&) { countStartMessages++; std::cout << "started"; }, [this](auto id, const auto& topic, bool succeed) { + // startTopicId = id; }); + // m_service.subscribe(NatsTestMessages::clientStopsTestTopic, [this](const auto&) {countStopMessages++; std::cout << "stopped"; }, [this](auto id, const auto& topic, bool succeed) { + // stopTopicId = id; }); + } + + ~TestWatcher() + { + // m_service.unsubscribe(startTopicId); + // m_service.unsubscribe(stopTopicId); + } + +private: + int countStartMessages = 0; + int countStopMessages = 0; + uint32_t startTopicId = 0; + uint32_t stopTopicId = 0; + ApiGear::Nats::Service& m_service; +}; + +int main(int argc, char* argv[]) +{ + auto service = std::make_shared(); + auto source = std::make_shared(); + auto sourceService = Cpp::Api::Nats::TestApi0Service::create(source, service); + TestWatcher testWatcher(*(service.get())); + + std::string brokerUrl = "nats://localhost:4222"; + service->connect(brokerUrl); + + + bool testStarted = false; + // Will be overwritten with receiving link message + auto begin = std::chrono::high_resolution_clock::now(); + + do { + + if (!testStarted && testWatcher.isStarted()) + { + testStarted = true; + begin = std::chrono::high_resolution_clock::now(); + } + + } while (!testWatcher.isFinished()); + auto end = std::chrono::high_resolution_clock::now(); + service->disconnect(); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + + auto test_duration = std::chrono::duration_cast(end - begin); + std::cout << "server finished work, time measured [ms]" << test_duration.count() << std::endl; + +} diff --git a/cpp/nats_tests/test_message_topics.h b/cpp/nats_tests/test_message_topics.h new file mode 100644 index 00000000..9bff4275 --- /dev/null +++ b/cpp/nats_tests/test_message_topics.h @@ -0,0 +1,9 @@ +#pragma once +#include + +// Messages to be send from client(s) to service adapter to inform that it started test or stopped test +namespace NatsTestMessages +{ +const std::string clientStartsTestTopic = "StartTestTopic"; +const std::string clientStopsTestTopic = "StopTestTopic"; +} diff --git a/cpp/olink_tests/olink_core_only_tests/CMakeLists.txt b/cpp/olink_tests/olink_core_only_tests/CMakeLists.txt index 258a4678..cf1788c2 100644 --- a/cpp/olink_tests/olink_core_only_tests/CMakeLists.txt +++ b/cpp/olink_tests/olink_core_only_tests/CMakeLists.txt @@ -9,8 +9,8 @@ find_package(api COMPONENTS api-olink api-implementation) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) -add_executable(olink_core_no_network_single_object_setIntProperty "olink_core_no_network_single_object_setIntProperty.cpp" "../helpers/latency_helpers.cpp") -add_executable(olink_core_no_network_single_object_syncIntMethodCall "olink_core_no_network_single_object_syncIntMethodCall.cpp" "../helpers/latency_helpers.cpp") +add_executable(olink_core_no_network_single_object_setIntProperty "olink_core_no_network_single_object_setIntProperty.cpp" "../../latency_helpers/latency_helpers.cpp" ) +add_executable(olink_core_no_network_single_object_syncIntMethodCall "olink_core_no_network_single_object_syncIntMethodCall.cpp" "../../latency_helpers/latency_helpers.cpp") target_link_libraries(olink_core_no_network_single_object_setIntProperty api::api-olink api::api-implementation) diff --git a/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_asyncIntMethod.cpp b/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_asyncIntMethod.cpp index baf99005..589616ef 100644 --- a/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_asyncIntMethod.cpp +++ b/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_asyncIntMethod.cpp @@ -9,9 +9,9 @@ #include "api/implementation//testapi0.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" +#include "../../latency_helpers/latency_helpers.h" #include "../helpers/inspected_sink.h" -#include "../helpers/latency_helpers.h" -#include "../helpers/olink_handler_no_network.hpp" +#include "../olink_handler_no_network.hpp" #include #include diff --git a/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_setIntProperty.cpp b/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_setIntProperty.cpp index e53929fc..5696d678 100644 --- a/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_setIntProperty.cpp +++ b/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_setIntProperty.cpp @@ -8,10 +8,10 @@ #include "api/generated/olink/testapi0service.h" #include "api/implementation//testapi0.h" -#include "../helpers/inspected_sink.h" -#include "../helpers/latency_helpers.h" -#include "../helpers/olink_handler_no_network.hpp" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" +#include "../../latency_helpers/latency_helpers.h" +#include "../olink_handler_no_network.hpp" +#include "../helpers/inspected_sink.h" #include #include diff --git a/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_syncIntMethodCall.cpp b/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_syncIntMethodCall.cpp index c596ae3b..b29da376 100644 --- a/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_syncIntMethodCall.cpp +++ b/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_syncIntMethodCall.cpp @@ -10,8 +10,8 @@ #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include "../helpers/inspected_sink.h" -#include "../helpers/latency_helpers.h" -#include "../helpers/olink_handler_no_network.hpp" +#include "../../latency_helpers/latency_helpers.h" +#include "../olink_handler_no_network.hpp" #include #include diff --git a/cpp/olink_tests/helpers/olink_handler_no_network.hpp b/cpp/olink_tests/olink_handler_no_network.hpp similarity index 96% rename from cpp/olink_tests/helpers/olink_handler_no_network.hpp rename to cpp/olink_tests/olink_handler_no_network.hpp index 9a418494..9971c89f 100644 --- a/cpp/olink_tests/helpers/olink_handler_no_network.hpp +++ b/cpp/olink_tests/olink_handler_no_network.hpp @@ -1,48 +1,48 @@ -#pragma once - -#include "olink/clientnode.h" -#include "olink/clientregistry.h" -#include -#include -#include - -class OLinkHandlerNoConnection -{ -public: - OLinkHandlerNoConnection(std::shared_ptr client_node) - :m_client_node(client_node) - - { - m_client_node->setLogLevel(ApiGear::ObjectLink::LogLevel::Warning); - ApiGear::ObjectLink::WriteLogFunc log = [](auto lvl, auto& msg) { if (lvl <= ApiGear::ObjectLink::LogLevel::Warning) std::cout << msg << std::endl; }; - m_client_node->onLog(log); - } - - void prepareConnection(){} - - template - void connectObjects(TestData& testData) - { - m_client_node->registry().addSink(testData.sink); - m_client_node->linkRemote(testData.sink->olinkObjectName()); - } - - template - void disconnectObjects(TestData& testData) - { - m_client_node->unlinkRemote(testData.sink->olinkObjectName()); - m_client_node->registry().removeSink(testData.sink->olinkObjectName()); - } - - template - void waitForReturnMessages(TestData& testData, uint32_t messages_number) - { - while (!testData.allResponsesReceived(messages_number)){} - } - - template - void waitUntilObjectConnected(const TestData& object){} - -private: - std::shared_ptr m_client_node; -}; +#pragma once + +#include "olink/clientnode.h" +#include "olink/clientregistry.h" +#include +#include +#include + +class OLinkHandlerNoConnection +{ +public: + OLinkHandlerNoConnection(std::shared_ptr client_node) + :m_client_node(client_node) + + { + m_client_node->setLogLevel(ApiGear::ObjectLink::LogLevel::Warning); + ApiGear::ObjectLink::WriteLogFunc log = [](auto lvl, auto& msg) { if (lvl <= ApiGear::ObjectLink::LogLevel::Warning) std::cout << msg << std::endl; }; + m_client_node->onLog(log); + } + + void prepareConnection(){} + + template + void connectObjects(TestData& testData) + { + m_client_node->registry().addSink(testData.sink); + m_client_node->linkRemote(testData.sink->olinkObjectName()); + } + + template + void disconnectObjects(TestData& testData) + { + m_client_node->unlinkRemote(testData.sink->olinkObjectName()); + m_client_node->registry().removeSink(testData.sink->olinkObjectName()); + } + + template + void waitForReturnMessages(TestData& testData, uint32_t messages_number) + { + while (!testData.allResponsesReceived(messages_number)){} + } + + template + void waitUntilObjectConnected(const TestData& object){} + +private: + std::shared_ptr m_client_node; +}; diff --git a/cpp/olink_tests/helpers/olink_network_protocol_handler_for_test.hpp b/cpp/olink_tests/olink_network_protocol_handler_for_test.hpp similarity index 96% rename from cpp/olink_tests/helpers/olink_network_protocol_handler_for_test.hpp rename to cpp/olink_tests/olink_network_protocol_handler_for_test.hpp index 19cf7b22..bf5cb5e5 100644 --- a/cpp/olink_tests/helpers/olink_network_protocol_handler_for_test.hpp +++ b/cpp/olink_tests/olink_network_protocol_handler_for_test.hpp @@ -1,104 +1,104 @@ -#pragma once - -#include "olink/clientnode.h" -#include "olink/clientregistry.h" -#include "apigear/olink/olinkconnection.h" -#include -#include -#include -#include -#include "apigear/olink/olinklogadapter.h" - - - -class OLinkHandlerForTest -{ -public: - OLinkHandlerForTest(std::string hostAddress, uint32_t portNumber) - :m_hostAddress(hostAddress), - m_portNumber(portNumber) - {} - - void prepareConnection() - { - auto full_address = "ws://" + m_hostAddress + ":" + std::to_string(m_portNumber) + "/ws"; - m_client = std::make_unique(registry); - m_client->connectToHost(Poco::URI(full_address)); - m_client->node()->setLogLevel(ApiGear::ObjectLink::LogLevel::Warning); - ApiGear::ObjectLink::WriteLogFunc log = [](auto lvl, auto& msg) { if (lvl <= ApiGear::ObjectLink::LogLevel::Warning) std::cout << msg << std::endl; }; - m_client->node()->onLog(log); - } - - template - void connectObjects(std::vector& testData) - { - for (auto& element : testData) - { - m_client->connectAndLinkObject(element.sink); - } - } - - template - void connectObjects(TestData& testData) - { - m_client->connectAndLinkObject(testData.sink); - } - - template - void disconnectObjects(std::vector& testData) - { - for (auto& element : testData) - { - m_client->disconnectAndUnlink(element.sink->olinkObjectName()); - } - } - - template - void disconnectObjects(TestData& testData) - { - m_client->disconnectAndUnlink(testData.sink->olinkObjectName()); - } - - template - void waitForReturnMessages(const std::vector& testData, uint32_t messages_number) - { - auto allMessagesReceived = false; - while (!allMessagesReceived) - { - auto serviceWithAllMessages = 0u; - for (const auto& element : testData) - { - if (element.allResponsesReceived(messages_number)) - { - serviceWithAllMessages++; - } - } - allMessagesReceived = serviceWithAllMessages == testData.size(); - } - } - - - template - void waitForReturnMessages(const TestData& testData, uint32_t messages_number) - { - auto allMessagesReceived = false; - while (!allMessagesReceived) - { - allMessagesReceived = testData.allResponsesReceived(messages_number); - } - } - - template - void waitUntilObjectConnected(const TestData& object) - { - while (!object.sink->isReady()) - { - // wait until ready to use. - } - } -private: - std::string m_hostAddress; - uint32_t m_portNumber; - ApiGear::ObjectLink::ClientRegistry registry; - std::unique_ptr m_client; +#pragma once + +#include "olink/clientnode.h" +#include "olink/clientregistry.h" +#include "apigear/olink/olinkconnection.h" +#include +#include +#include +#include +#include "apigear/olink/olinklogadapter.h" + + + +class OLinkHandlerForTest +{ +public: + OLinkHandlerForTest(std::string hostAddress, uint32_t portNumber) + :m_hostAddress(hostAddress), + m_portNumber(portNumber) + {} + + void prepareConnection() + { + auto full_address = "ws://" + m_hostAddress + ":" + std::to_string(m_portNumber) + "/ws"; + m_client = std::make_unique(registry); + m_client->connectToHost(Poco::URI(full_address)); + m_client->node()->setLogLevel(ApiGear::ObjectLink::LogLevel::Warning); + ApiGear::ObjectLink::WriteLogFunc log = [](auto lvl, auto& msg) { if (lvl <= ApiGear::ObjectLink::LogLevel::Warning) std::cout << msg << std::endl; }; + m_client->node()->onLog(log); + } + + template + void connectObjects(std::vector& testData) + { + for (auto& element : testData) + { + m_client->connectAndLinkObject(element.sink); + } + } + + template + void connectObjects(TestData& testData) + { + m_client->connectAndLinkObject(testData.sink); + } + + template + void disconnectObjects(std::vector& testData) + { + for (auto& element : testData) + { + m_client->disconnectAndUnlink(element.sink->olinkObjectName()); + } + } + + template + void disconnectObjects(TestData& testData) + { + m_client->disconnectAndUnlink(testData.sink->olinkObjectName()); + } + + template + void waitForReturnMessages(const std::vector& testData, uint32_t messages_number) + { + auto allMessagesReceived = false; + while (!allMessagesReceived) + { + auto serviceWithAllMessages = 0u; + for (const auto& element : testData) + { + if (element.allResponsesReceived(messages_number)) + { + serviceWithAllMessages++; + } + } + allMessagesReceived = serviceWithAllMessages == testData.size(); + } + } + + + template + void waitForReturnMessages(const TestData& testData, uint32_t messages_number) + { + auto allMessagesReceived = false; + while (!allMessagesReceived) + { + allMessagesReceived = testData.allResponsesReceived(messages_number); + } + } + + template + void waitUntilObjectConnected(const TestData& object) + { + while (!object.sink->isReady()) + { + // wait until ready to use. + } + } +private: + std::string m_hostAddress; + uint32_t m_portNumber; + ApiGear::ObjectLink::ClientRegistry registry; + std::unique_ptr m_client; }; \ No newline at end of file diff --git a/cpp/olink_tests/single_object_many_threads/CMakeLists.txt b/cpp/olink_tests/single_object_many_threads/CMakeLists.txt index 5a4d52b1..72da3725 100644 --- a/cpp/olink_tests/single_object_many_threads/CMakeLists.txt +++ b/cpp/olink_tests/single_object_many_threads/CMakeLists.txt @@ -9,11 +9,11 @@ find_package(api COMPONENTS api-olink api-implementation) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -add_executable(olink_single_client_syncSetIntProperty "client_syncSetIntProperty.cpp" "../helpers/latency_helpers.cpp") -add_executable(olink_single_client_setIntProperty "client_setIntProperty.cpp" "../helpers/latency_helpers.cpp") -add_executable(olink_single_client_setStringProperty "client_setStringProperty.cpp" "../helpers/latency_helpers.cpp") -add_executable(olink_single_client_syncMethodInt "client_syncIntMethodCall.cpp" "../helpers/latency_helpers.cpp") -add_executable(olink_single_client_asyncMethodInt "client_asyncIntMethodCall.cpp" "../helpers/latency_helpers.cpp") +add_executable(olink_single_client_syncSetIntProperty "client_syncSetIntProperty.cpp" "../../latency_helpers/latency_helpers.cpp") +add_executable(olink_single_client_setIntProperty "client_setIntProperty.cpp" "../../latency_helpers/latency_helpers.cpp") +add_executable(olink_single_client_setStringProperty "client_setStringProperty.cpp") +add_executable(olink_single_client_syncMethodInt "client_syncIntMethodCall.cpp" "../../latency_helpers/latency_helpers.cpp") +add_executable(olink_single_client_asyncMethodInt "client_asyncIntMethodCall.cpp" "../../latency_helpers/latency_helpers.cpp") add_executable(olink_single_server "server.cpp" ) target_link_libraries(olink_single_client_setIntProperty api::api-olink) diff --git a/cpp/olink_tests/single_object_many_threads/client_asyncIntMethodCall.cpp b/cpp/olink_tests/single_object_many_threads/client_asyncIntMethodCall.cpp index d5f44515..84c6bc97 100644 --- a/cpp/olink_tests/single_object_many_threads/client_asyncIntMethodCall.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_asyncIntMethodCall.cpp @@ -1,8 +1,8 @@ #include "../helpers/inspected_sink.h" #include "api/generated/olink/testapi0client.h" -#include "../helpers/olink_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#include "../olink_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include @@ -21,35 +21,33 @@ class PropertyIntTestData :m_latenciesStart(latenciesStart), m_latenciesStop(latenciesStop) { - m_futures = std::vector>(latenciesStart.size(), std::shared_future ()); + m_futures = std::vector>(latenciesStart.size(), std::shared_future()); olinkClient = std::make_shared(); - sink = std::make_shared(olinkClient); + sink = std::make_shared(); } void testFunction(uint32_t value) { m_latenciesStart[value] = std::chrono::high_resolution_clock::now(); - - auto task = std::async(std::launch::async, [this, value]() - { - auto res = olinkClient->funcInt(value); - m_latenciesStop[res] = std::chrono::high_resolution_clock::now(); - isAllReceived++; + auto task = sink->funcIntAsync(value, + [this](int32_t value) { + m_latenciesStop[value] = std::chrono::high_resolution_clock::now(); + msgsReceived++; }); - m_futures[value]=task.share(); + m_futures[value] = task.share(); } bool allResponsesReceived (uint32_t sentRequestsNumber) const { - return isAllReceived >= sentRequestsNumber; + return msgsReceived >= sentRequestsNumber; } std::vector& m_latenciesStart; std::vector& m_latenciesStop; - std::vector> m_futures; - std::atomic isAllReceived{ 0 }; + std::vector> m_futures; std::shared_ptr< Cpp::Api::olink::TestApi0Client> olinkClient; - std::shared_ptr sink; + std::atomic msgsReceived{ 0 }; + std::shared_ptr sink; }; /* diff --git a/cpp/olink_tests/single_object_many_threads/client_setIntProperty.cpp b/cpp/olink_tests/single_object_many_threads/client_setIntProperty.cpp index d73e22f7..561136aa 100644 --- a/cpp/olink_tests/single_object_many_threads/client_setIntProperty.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_setIntProperty.cpp @@ -1,8 +1,8 @@ #include "../helpers/inspected_sink.h" #include "api/generated/olink/testapi0client.h" -#include "../helpers/olink_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#include "../olink_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include diff --git a/cpp/olink_tests/single_object_many_threads/client_setStringProperty.cpp b/cpp/olink_tests/single_object_many_threads/client_setStringProperty.cpp index 11a5563f..7efbe680 100644 --- a/cpp/olink_tests/single_object_many_threads/client_setStringProperty.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_setStringProperty.cpp @@ -1,7 +1,7 @@ #include "../helpers/inspected_sink.h" #include "api/generated/olink/testapi0client.h" -#include "../helpers/olink_network_protocol_handler_for_test.hpp" +#include "../olink_network_protocol_handler_for_test.hpp" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include diff --git a/cpp/olink_tests/single_object_many_threads/client_syncIntMethodCall.cpp b/cpp/olink_tests/single_object_many_threads/client_syncIntMethodCall.cpp index e2b795b3..c19c8b6d 100644 --- a/cpp/olink_tests/single_object_many_threads/client_syncIntMethodCall.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_syncIntMethodCall.cpp @@ -1,8 +1,8 @@ #include "../helpers/inspected_sink.h" #include "api/generated/olink/testapi0client.h" -#include "../helpers/olink_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#include "../olink_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include diff --git a/cpp/olink_tests/single_object_many_threads/client_syncSetIntProperty.cpp b/cpp/olink_tests/single_object_many_threads/client_syncSetIntProperty.cpp index 9d441616..cce5b374 100644 --- a/cpp/olink_tests/single_object_many_threads/client_syncSetIntProperty.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_syncSetIntProperty.cpp @@ -1,8 +1,8 @@ #include "../helpers/inspected_sink.h" #include "api/generated/olink/testapi0client.h" -#include "../helpers/olink_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#include "../olink_network_protocol_handler_for_test.hpp" +#include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include diff --git a/cpp/testApi/modules/api/implementation/testapi0.cpp b/cpp/testApi/modules/api/implementation/testapi0.cpp index ca5afbf7..a9b75189 100644 --- a/cpp/testApi/modules/api/implementation/testapi0.cpp +++ b/cpp/testApi/modules/api/implementation/testapi0.cpp @@ -1,124 +1,136 @@ - - -#include "api/implementation/testapi0.h" -#include "api/generated/core/testapi0.publisher.h" -#include "api/generated/core/testapi0.data.h" - -using namespace Cpp::Api; - -TestApi0::TestApi0() - : m_publisher(std::make_unique()) -{ -} -TestApi0::~TestApi0() -{ -} - -void TestApi0::setPropInt(int propInt) -{ - if (m_data.m_propInt != propInt) { - m_data.m_propInt = propInt; - m_publisher->publishPropIntChanged(propInt); - } -} - -int TestApi0::getPropInt() const -{ - return m_data.m_propInt; -} - -void TestApi0::setPropFloat(float propFloat) -{ - if (m_data.m_propFloat != propFloat) { - m_data.m_propFloat = propFloat; - m_publisher->publishPropFloatChanged(propFloat); - } -} - -float TestApi0::getPropFloat() const -{ - return m_data.m_propFloat; -} - -void TestApi0::setPropString(const std::string& propString) -{ - if (m_data.m_propString != propString) { - m_data.m_propString = propString; - m_publisher->publishPropStringChanged(propString); - } -} - -const std::string& TestApi0::getPropString() const -{ - return m_data.m_propString; -} - -int TestApi0::funcInt(int paramInt) -{ - return paramInt; -} - -std::future TestApi0::funcIntAsync(int paramInt) -{ - return std::async(std::launch::async, [this, - paramInt]() - { - return funcInt(paramInt); - } - ); -} - -float TestApi0::funcFloat(float paramFloat) -{ - (void) paramFloat; // suppress the 'Unreferenced Formal Parameter' warning. - // do business logic here - return 0.0f; -} - -std::future TestApi0::funcFloatAsync(float paramFloat) -{ - return std::async(std::launch::async, [this, - paramFloat]() - { - return funcFloat(paramFloat); - } - ); -} - -std::string TestApi0::funcString(const std::string& paramString) -{ - (void) paramString; // suppress the 'Unreferenced Formal Parameter' warning. - // do business logic here - return std::string(); -} - -std::future TestApi0::funcStringAsync(const std::string& paramString) -{ - return std::async(std::launch::async, [this, - paramString]() - { - return funcString(paramString); - } - ); -} - -void TestApi0::funcVoid(int someParam) -{ - (void) someParam; // suppress the 'Unreferenced Formal Parameter' warning. - // do business logic here -} - -std::future TestApi0::funcVoidAsync(int someParam) -{ - return std::async(std::launch::async, [this, - someParam]() - { - return funcVoid(someParam); - } - ); -} - -ITestApi0Publisher& TestApi0::_getPublisher() const -{ - return *m_publisher; -} + + +#include "api/implementation/testapi0.h" +#include "api/generated/core/testapi0.publisher.h" +#include "api/generated/core/testapi0.data.h" + +using namespace Cpp::Api; + +TestApi0::TestApi0() + : m_publisher(std::make_unique()) +{ +} +TestApi0::~TestApi0() +{ +} + +void TestApi0::setPropInt(int propInt) +{ + if (m_data.m_propInt != propInt) { + m_data.m_propInt = propInt; + m_publisher->publishPropIntChanged(propInt); + } +} + +int TestApi0::getPropInt() const +{ + return m_data.m_propInt; +} + +void TestApi0::setPropFloat(float propFloat) +{ + if (m_data.m_propFloat != propFloat) { + m_data.m_propFloat = propFloat; + m_publisher->publishPropFloatChanged(propFloat); + } +} + +float TestApi0::getPropFloat() const +{ + return m_data.m_propFloat; +} + +void TestApi0::setPropString(const std::string& propString) +{ + if (m_data.m_propString != propString) { + m_data.m_propString = propString; + m_publisher->publishPropStringChanged(propString); + } +} + +const std::string& TestApi0::getPropString() const +{ + return m_data.m_propString; +} + +int TestApi0::funcInt(int paramInt) +{ + return paramInt; +} + +std::future TestApi0::funcIntAsync(int paramInt, std::function callback) +{ + return std::async(std::launch::async, [this, callback, + paramInt]() + {auto result = funcInt(paramInt); + if (callback) + { + callback(result); + }return result; + } + ); +} + +float TestApi0::funcFloat(float paramFloat) +{ + (void) paramFloat; // suppress the 'Unreferenced Formal Parameter' warning. + // do business logic here + return 0.0f; +} + +std::future TestApi0::funcFloatAsync(float paramFloat, std::function callback) +{ + return std::async(std::launch::async, [this, callback, + paramFloat]() + {auto result = funcFloat(paramFloat); + if (callback) + { + callback(result); + }return result; + } + ); +} + +std::string TestApi0::funcString(const std::string& paramString) +{ + (void) paramString; // suppress the 'Unreferenced Formal Parameter' warning. + // do business logic here + return std::string(); +} + +std::future TestApi0::funcStringAsync(const std::string& paramString, std::function callback) +{ + return std::async(std::launch::async, [this, callback, + paramString]() + {auto result = funcString(paramString); + if (callback) + { + callback(result); + }return result; + } + ); +} + +void TestApi0::funcVoid(int paramInt) +{ + (void) paramInt; // suppress the 'Unreferenced Formal Parameter' warning. + // do business logic here +} + +std::future TestApi0::funcVoidAsync(int paramInt, std::function callback) +{ + return std::async(std::launch::async, [this, callback, + paramInt]() + {funcVoid(paramInt); + if (callback) + { + callback(); + } + } + ); +} + +ITestApi0Publisher& TestApi0::_getPublisher() const +{ + return *m_publisher; +} diff --git a/testRunner/testRunner/scenarios/mqtt_single_cpp_latency.txt b/testRunner/testRunner/scenarios/mqtt_single_cpp_latency.txt new file mode 100644 index 00000000..880f0676 --- /dev/null +++ b/testRunner/testRunner/scenarios/mqtt_single_cpp_latency.txt @@ -0,0 +1,19 @@ +servers: +CPP_BUILD/mqtt_single_server.exe +clients: +CPP_BUILD/mqtt_single_client_syncMethodInt.exe 1 1 +CPP_BUILD/mqtt_single_client_syncMethodInt.exe 10 1 +CPP_BUILD/mqtt_single_client_syncMethodInt.exe 100 1 +CPP_BUILD/mqtt_single_client_syncMethodInt.exe 1000 1 +CPP_BUILD/mqtt_single_client_setIntProperty.exe 1 1 +CPP_BUILD/mqtt_single_client_setIntProperty.exe 10 1 +CPP_BUILD/mqtt_single_client_setIntProperty.exe 100 1 +CPP_BUILD/mqtt_single_client_setIntProperty.exe 1000 1 +CPP_BUILD/mqtt_single_client_asyncMethodInt.exe 1 1 +CPP_BUILD/mqtt_single_client_asyncMethodInt.exe 10 1 +CPP_BUILD/mqtt_single_client_asyncMethodInt.exe 100 1 +CPP_BUILD/mqtt_single_client_asyncMethodInt.exe 1000 1 +CPP_BUILD/mqtt_single_client_syncSetIntProperty.exe 1 1 +CPP_BUILD/mqtt_single_client_syncSetIntProperty.exe 10 1 +CPP_BUILD/mqtt_single_client_syncSetIntProperty.exe 100 1 +CPP_BUILD/mqtt_single_client_syncSetIntProperty.exe 1000 1 \ No newline at end of file diff --git a/testRunner/testRunner/scenarios/nats_single_cpp_latency.txt b/testRunner/testRunner/scenarios/nats_single_cpp_latency.txt new file mode 100644 index 00000000..af52d146 --- /dev/null +++ b/testRunner/testRunner/scenarios/nats_single_cpp_latency.txt @@ -0,0 +1,18 @@ +servers: +CPP_BUILD/nats_single_server.exe +clients: +CPP_BUILD/nats_single_client_syncMethodInt.exe 1 1 +CPP_BUILD/nats_single_client_syncMethodInt.exe 10 1 +CPP_BUILD/nats_single_client_syncMethodInt.exe 100 1 +CPP_BUILD/nats_single_client_syncMethodInt.exe 1000 1 +CPP_BUILD/nats_single_client_setIntProperty.exe 1 1 +CPP_BUILD/nats_single_client_setIntProperty.exe 10 1 +CPP_BUILD/nats_single_client_setIntProperty.exe 100 1 +CPP_BUILD/nats_single_client_setIntProperty.exe 1000 1 +CPP_BUILD/nats_single_client_asyncMethodInt.exe 1 1 +CPP_BUILD/nats_single_client_asyncMethodInt.exe 10 1 +CPP_BUILD/nats_single_client_asyncMethodInt.exe 100 1 +CPP_BUILD/nats_single_client_syncSetIntProperty.exe 1 1 +CPP_BUILD/nats_single_client_syncSetIntProperty.exe 10 1 +CPP_BUILD/nats_single_client_syncSetIntProperty.exe 100 1 +CPP_BUILD/nats_single_client_syncSetIntProperty.exe 1000 1 \ No newline at end of file