From 83ab3ad26e09311eacc690a2e9295256e6fe475c Mon Sep 17 00:00:00 2001 From: dorotaphanSiili <108282075+dorotaphanSiili@users.noreply.github.com> Date: Sun, 5 Jan 2025 15:05:00 +0100 Subject: [PATCH 1/5] feat(nats): add nats test --- cpp/CMakeLists.txt | 1 + cpp/nats_tests/helpers/latency_helpers.cpp | 33 ++++++ cpp/nats_tests/helpers/latency_helpers.h | 23 ++++ ...nats_network_protocol_handler_for_test.hpp | 109 ++++++++++++++++++ cpp/nats_tests/helpers/test_message_topics.h | 9 ++ .../single_object_many_threads/CMakeLists.txt | 30 +++++ .../client_asyncIntMethodCall.cpp | 97 ++++++++++++++++ .../client_setIntProperty.cpp | 85 ++++++++++++++ .../client_setStringProperty.cpp | 93 +++++++++++++++ .../client_syncIntMethodCall.cpp | 85 ++++++++++++++ .../client_syncSetIntProperty.cpp | 93 +++++++++++++++ .../single_object_many_threads/server.cpp | 81 +++++++++++++ .../scenarios/nats_single_cpp_latency.txt | 18 +++ 13 files changed, 757 insertions(+) create mode 100644 cpp/nats_tests/helpers/latency_helpers.cpp create mode 100644 cpp/nats_tests/helpers/latency_helpers.h create mode 100644 cpp/nats_tests/helpers/nats_network_protocol_handler_for_test.hpp create mode 100644 cpp/nats_tests/helpers/test_message_topics.h create mode 100644 cpp/nats_tests/single_object_many_threads/CMakeLists.txt create mode 100644 cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp create mode 100644 cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp create mode 100644 cpp/nats_tests/single_object_many_threads/client_setStringProperty.cpp create mode 100644 cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp create mode 100644 cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp create mode 100644 cpp/nats_tests/single_object_many_threads/server.cpp create mode 100644 testRunner/testRunner/scenarios/nats_single_cpp_latency.txt diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index f053449..ff7b895 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/nats_tests/helpers/latency_helpers.cpp b/cpp/nats_tests/helpers/latency_helpers.cpp new file mode 100644 index 0000000..d3220ce --- /dev/null +++ b/cpp/nats_tests/helpers/latency_helpers.cpp @@ -0,0 +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; +} + diff --git a/cpp/nats_tests/helpers/latency_helpers.h b/cpp/nats_tests/helpers/latency_helpers.h new file mode 100644 index 0000000..bf39a69 --- /dev/null +++ b/cpp/nats_tests/helpers/latency_helpers.h @@ -0,0 +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); diff --git a/cpp/nats_tests/helpers/nats_network_protocol_handler_for_test.hpp b/cpp/nats_tests/helpers/nats_network_protocol_handler_for_test.hpp new file mode 100644 index 0000000..e88c56a --- /dev/null +++ b/cpp/nats_tests/helpers/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/helpers/test_message_topics.h b/cpp/nats_tests/helpers/test_message_topics.h new file mode 100644 index 0000000..9bff427 --- /dev/null +++ b/cpp/nats_tests/helpers/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/nats_tests/single_object_many_threads/CMakeLists.txt b/cpp/nats_tests/single_object_many_threads/CMakeLists.txt new file mode 100644 index 0000000..b6a7932 --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/CMakeLists.txt @@ -0,0 +1,30 @@ +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" "../helpers/latency_helpers.cpp") +#add_executable(nats_single_client_setStringProperty "client_setStringProperty.cpp" ) +add_executable(nats_single_server "server.cpp" ) +add_executable(nats_single_client_syncSetIntProperty "client_syncSetIntProperty.cpp" "../helpers/latency_helpers.cpp") +add_executable(nats_single_client_syncMethodInt "client_syncIntMethodCall.cpp" "../helpers/latency_helpers.cpp") +add_executable(nats_single_client_asyncMethodInt "client_asyncIntMethodCall.cpp" "../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) +#target_link_libraries(nats_single_client_setStringProperty 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 0000000..4473079 --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp @@ -0,0 +1,97 @@ +#include "api/generated/nats/testapi0client.h" + +#include "../helpers/nats_network_protocol_handler_for_test.hpp" +#include "../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 = std::async(std::launch::async, [this, value]() + { + auto res = sink->funcInt(value); + m_latenciesStop[res] = 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 0000000..364fff0 --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp @@ -0,0 +1,85 @@ +//#include "../helpers/itestsink.h" +#include "api/generated/nats/testapi0client.h" +#include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" +#include "../helpers/nats_network_protocol_handler_for_test.hpp" +#include "../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_setStringProperty.cpp b/cpp/nats_tests/single_object_many_threads/client_setStringProperty.cpp new file mode 100644 index 0000000..193956e --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/client_setStringProperty.cpp @@ -0,0 +1,93 @@ +//#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 +// +// +//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) +// { +// 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) +// { +// m_testFunction(value); +// } +// std::shared_ptr sink; +//private: +// std::function m_testFunction; +// // Prepare different messages to send before test starts not to slow down it with allocation of this many messages: +// std::vector messagesToSend; +//}; +// +// +///* +//By default test request property string change 600 times from each of 100 threads. +//Each message is over 100 character long. +//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 = "tcp://localhost:1883"; +// MqttHandlerForTest networkProtocolHandler(brokerUrl); +// +// PropertyStringTestData testObject(networkProtocolHandler.getClient(), messages_number,sendThreadNumber); +// executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); +// 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 0000000..db9e956 --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp @@ -0,0 +1,85 @@ +#include "api/generated/nats/testapi0client.h" + +#include "../helpers/nats_network_protocol_handler_for_test.hpp" +#include "../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 0000000..12af4f4 --- /dev/null +++ b/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp @@ -0,0 +1,93 @@ + +#include "api/generated/nats/testapi0client.h" + +#include "../helpers/nats_network_protocol_handler_for_test.hpp" +#include "../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 0000000..2aad5ab --- /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 "../helpers/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/testRunner/testRunner/scenarios/nats_single_cpp_latency.txt b/testRunner/testRunner/scenarios/nats_single_cpp_latency.txt new file mode 100644 index 0000000..af52d14 --- /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 From d9e9858e3cd0a4e6a3da512dcc4ddcd135d9fec2 Mon Sep 17 00:00:00 2001 From: dorotaphanSiili <108282075+dorotaphanSiili@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:38:06 +0100 Subject: [PATCH 2/5] fix: nats tests --- .../latency_helpers.cpp | 0 .../latency_helpers.h | 0 .../single_object_many_threads/CMakeLists.txt | 10 +- .../client_asyncIntMethodCall.cpp | 22 ++--- .../client_setIntProperty.cpp | 2 +- .../client_setStringProperty.cpp | 93 ------------------- .../client_syncIntMethodCall.cpp | 2 +- .../client_syncSetIntProperty.cpp | 2 +- 8 files changed, 17 insertions(+), 114 deletions(-) rename cpp/{nats_tests/helpers => latency_helpers}/latency_helpers.cpp (100%) rename cpp/{nats_tests/helpers => latency_helpers}/latency_helpers.h (100%) delete mode 100644 cpp/nats_tests/single_object_many_threads/client_setStringProperty.cpp diff --git a/cpp/nats_tests/helpers/latency_helpers.cpp b/cpp/latency_helpers/latency_helpers.cpp similarity index 100% rename from cpp/nats_tests/helpers/latency_helpers.cpp rename to cpp/latency_helpers/latency_helpers.cpp diff --git a/cpp/nats_tests/helpers/latency_helpers.h b/cpp/latency_helpers/latency_helpers.h similarity index 100% rename from cpp/nats_tests/helpers/latency_helpers.h rename to cpp/latency_helpers/latency_helpers.h diff --git a/cpp/nats_tests/single_object_many_threads/CMakeLists.txt b/cpp/nats_tests/single_object_many_threads/CMakeLists.txt index b6a7932..66e095e 100644 --- a/cpp/nats_tests/single_object_many_threads/CMakeLists.txt +++ b/cpp/nats_tests/single_object_many_threads/CMakeLists.txt @@ -15,16 +15,14 @@ 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" "../helpers/latency_helpers.cpp") -#add_executable(nats_single_client_setStringProperty "client_setStringProperty.cpp" ) +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" "../helpers/latency_helpers.cpp") -add_executable(nats_single_client_syncMethodInt "client_syncIntMethodCall.cpp" "../helpers/latency_helpers.cpp") -add_executable(nats_single_client_asyncMethodInt "client_asyncIntMethodCall.cpp" "../helpers/latency_helpers.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) -#target_link_libraries(nats_single_client_setStringProperty 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 index 4473079..1338713 100644 --- a/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp +++ b/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp @@ -1,7 +1,7 @@ #include "api/generated/nats/testapi0client.h" #include "../helpers/nats_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include @@ -21,27 +21,26 @@ 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 ()); sink = Cpp::Api::Nats::TestApi0Client::create(client); } 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 = sink->funcInt(value); - m_latenciesStop[res] = std::chrono::high_resolution_clock::now(); - msgsReceived++; - }); + 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; + return msgsReceived == sentRequestsNumber; } bool isReady() const @@ -55,7 +54,7 @@ class PropertyIntTestData } std::vector& m_latenciesStart; std::vector& m_latenciesStop; - std::vector> m_futures; + std::vector> m_futures; std::atomic msgsReceived{ 0 }; std::shared_ptr sink; }; @@ -90,7 +89,6 @@ int main(int argc, char* argv[]) PropertyIntTestData testObject(networkProtocolHandler.getClient(), m_latenciesStart, m_latenciesStop); executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); - calculateAndPrintLatencyParameters(m_latenciesStart, m_latenciesStop); return 0; diff --git a/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp b/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp index 364fff0..1be6983 100644 --- a/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp +++ b/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp @@ -2,7 +2,7 @@ #include "api/generated/nats/testapi0client.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include "../helpers/nats_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#include "../../latency_helpers/latency_helpers.h" #include diff --git a/cpp/nats_tests/single_object_many_threads/client_setStringProperty.cpp b/cpp/nats_tests/single_object_many_threads/client_setStringProperty.cpp deleted file mode 100644 index 193956e..0000000 --- a/cpp/nats_tests/single_object_many_threads/client_setStringProperty.cpp +++ /dev/null @@ -1,93 +0,0 @@ -//#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 -// -// -//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) -// { -// 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) -// { -// m_testFunction(value); -// } -// std::shared_ptr sink; -//private: -// std::function m_testFunction; -// // Prepare different messages to send before test starts not to slow down it with allocation of this many messages: -// std::vector messagesToSend; -//}; -// -// -///* -//By default test request property string change 600 times from each of 100 threads. -//Each message is over 100 character long. -//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 = "tcp://localhost:1883"; -// MqttHandlerForTest networkProtocolHandler(brokerUrl); -// -// PropertyStringTestData testObject(networkProtocolHandler.getClient(), messages_number,sendThreadNumber); -// executeTestFunction(testObject, networkProtocolHandler, messages_number, sendThreadNumber); -// 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 index db9e956..84e14e5 100644 --- a/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp +++ b/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp @@ -1,7 +1,7 @@ #include "api/generated/nats/testapi0client.h" #include "../helpers/nats_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include diff --git a/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp b/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp index 12af4f4..8478f92 100644 --- a/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp +++ b/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp @@ -2,7 +2,7 @@ #include "api/generated/nats/testapi0client.h" #include "../helpers/nats_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include From 29239204815d6db3cb891bcb0b003c9823647333 Mon Sep 17 00:00:00 2001 From: dorotaphanSiili <108282075+dorotaphanSiili@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:39:14 +0100 Subject: [PATCH 3/5] feat(cpp): align olink tests to latency helper and new async method --- cpp/olink_tests/helpers/latency_helpers.cpp | 33 ------------------- cpp/olink_tests/helpers/latency_helpers.h | 23 ------------- .../olink_core_only_tests/CMakeLists.txt | 4 +-- ...o_network_single_object_setIntProperty.cpp | 2 +- ...etwork_single_object_syncIntMethodCall.cpp | 2 +- .../single_object_many_threads/CMakeLists.txt | 10 +++--- .../client_asyncIntMethodCall.cpp | 26 +++++++-------- .../client_setIntProperty.cpp | 2 +- .../client_syncIntMethodCall.cpp | 2 +- .../client_syncSetIntProperty.cpp | 2 +- 10 files changed, 24 insertions(+), 82 deletions(-) delete mode 100644 cpp/olink_tests/helpers/latency_helpers.cpp delete mode 100644 cpp/olink_tests/helpers/latency_helpers.h diff --git a/cpp/olink_tests/helpers/latency_helpers.cpp b/cpp/olink_tests/helpers/latency_helpers.cpp deleted file mode 100644 index 637c990..0000000 --- a/cpp/olink_tests/helpers/latency_helpers.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#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/olink_tests/helpers/latency_helpers.h deleted file mode 100644 index 7aa65fd..0000000 --- a/cpp/olink_tests/helpers/latency_helpers.h +++ /dev/null @@ -1,23 +0,0 @@ -#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/olink_tests/olink_core_only_tests/CMakeLists.txt b/cpp/olink_tests/olink_core_only_tests/CMakeLists.txt index 258a467..cf1788c 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_setIntProperty.cpp b/cpp/olink_tests/olink_core_only_tests/olink_core_no_network_single_object_setIntProperty.cpp index e53929f..420137a 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 @@ -9,7 +9,7 @@ #include "api/implementation//testapi0.h" #include "../helpers/inspected_sink.h" -#include "../helpers/latency_helpers.h" +#include "../../latency_helpers/latency_helpers.h" #include "../helpers/olink_handler_no_network.hpp" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" 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 c596ae3..40a56fc 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,7 +10,7 @@ #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include "../helpers/inspected_sink.h" -#include "../helpers/latency_helpers.h" +#include "../../latency_helpers/latency_helpers.h" #include "../helpers/olink_handler_no_network.hpp" #include diff --git a/cpp/olink_tests/single_object_many_threads/CMakeLists.txt b/cpp/olink_tests/single_object_many_threads/CMakeLists.txt index 5a4d52b..72da372 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 d5f4451..282e17e 100644 --- a/cpp/olink_tests/single_object_many_threads/client_asyncIntMethodCall.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_asyncIntMethodCall.cpp @@ -2,7 +2,7 @@ #include "api/generated/olink/testapi0client.h" #include "../helpers/olink_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#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 d73e22f..a0a8757 100644 --- a/cpp/olink_tests/single_object_many_threads/client_setIntProperty.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_setIntProperty.cpp @@ -2,7 +2,7 @@ #include "api/generated/olink/testapi0client.h" #include "../helpers/olink_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#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_syncIntMethodCall.cpp b/cpp/olink_tests/single_object_many_threads/client_syncIntMethodCall.cpp index e2b795b..d35d108 100644 --- a/cpp/olink_tests/single_object_many_threads/client_syncIntMethodCall.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_syncIntMethodCall.cpp @@ -2,7 +2,7 @@ #include "api/generated/olink/testapi0client.h" #include "../helpers/olink_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#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 9d44161..4c1d358 100644 --- a/cpp/olink_tests/single_object_many_threads/client_syncSetIntProperty.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_syncSetIntProperty.cpp @@ -2,7 +2,7 @@ #include "api/generated/olink/testapi0client.h" #include "../helpers/olink_network_protocol_handler_for_test.hpp" -#include "../helpers/latency_helpers.h" +#include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include From 59b7427d6e9b96f505ad17acdb7befb7758a23f3 Mon Sep 17 00:00:00 2001 From: dorotaphanSiili <108282075+dorotaphanSiili@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:40:36 +0100 Subject: [PATCH 4/5] feat(cpp): add mqtt tests --- ...mqtt_network_protocol_handler_for_test.hpp | 6 +- .../single_object_many_threads/CMakeLists.txt | 9 +- .../client_asyncIntMethodCall.cpp | 103 ++++++++++++++++++ .../client_setIntProperty.cpp | 60 +++++++--- .../client_setStringProperty.cpp | 59 +++++----- .../client_syncIntMethodCall.cpp | 87 +++++++++++++++ .../client_syncSetIntProperty.cpp | 98 +++++++++++++++++ .../single_object_many_threads/server.cpp | 8 +- .../scenarios/mqtt_single_cpp_latency.txt | 19 ++++ 9 files changed, 393 insertions(+), 56 deletions(-) create mode 100644 cpp/mqtt_tests/single_object_many_threads/client_asyncIntMethodCall.cpp create mode 100644 cpp/mqtt_tests/single_object_many_threads/client_syncIntMethodCall.cpp create mode 100644 cpp/mqtt_tests/single_object_many_threads/client_syncSetIntProperty.cpp create mode 100644 testRunner/testRunner/scenarios/mqtt_single_cpp_latency.txt diff --git a/cpp/mqtt_tests/helpers/mqtt_network_protocol_handler_for_test.hpp b/cpp/mqtt_tests/helpers/mqtt_network_protocol_handler_for_test.hpp index a3297eb..6d364d8 100644 --- a/cpp/mqtt_tests/helpers/mqtt_network_protocol_handler_for_test.hpp +++ b/cpp/mqtt_tests/helpers/mqtt_network_protocol_handler_for_test.hpp @@ -70,7 +70,7 @@ class MqttHandlerForTest auto serviceWithAllMessages = 0u; for (const auto& element : testData) { - if (element.sink->receivedMessages() == messages_number) + if (element.receivedMessages() == messages_number) { serviceWithAllMessages++; } @@ -85,14 +85,14 @@ class MqttHandlerForTest auto allMessagesReceived = false; while (!allMessagesReceived) { - allMessagesReceived = testData.sink->receivedMessages() == messages_number; + allMessagesReceived = testData.receivedMessages() == messages_number; } } template void waitUntilObjectConnected(const TestData& object) { - while (!object.sink->isReady()) + while (!object.isReady()) { // wait until ready to use. } diff --git a/cpp/mqtt_tests/single_object_many_threads/CMakeLists.txt b/cpp/mqtt_tests/single_object_many_threads/CMakeLists.txt index 9c34f9e..eeb046b 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 0000000..f952539 --- /dev/null +++ b/cpp/mqtt_tests/single_object_many_threads/client_asyncIntMethodCall.cpp @@ -0,0 +1,103 @@ +#include "api/generated/mqtt/testapi0client.h" + +#include "../helpers/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 3a38e4d..b60772d 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 "../../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 f19e441..0eef636 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 -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 0000000..1021742 --- /dev/null +++ b/cpp/mqtt_tests/single_object_many_threads/client_syncIntMethodCall.cpp @@ -0,0 +1,87 @@ +#include "api/generated/mqtt/testapi0client.h" + +#include "../helpers/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 0000000..664ec67 --- /dev/null +++ b/cpp/mqtt_tests/single_object_many_threads/client_syncSetIntProperty.cpp @@ -0,0 +1,98 @@ + +#include "api/generated/mqtt/testapi0client.h" + +#include "../helpers/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 a9cd9b9..be735a7 100644 --- a/cpp/mqtt_tests/single_object_many_threads/server.cpp +++ b/cpp/mqtt_tests/single_object_many_threads/server.cpp @@ -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/testRunner/testRunner/scenarios/mqtt_single_cpp_latency.txt b/testRunner/testRunner/scenarios/mqtt_single_cpp_latency.txt new file mode 100644 index 0000000..880f067 --- /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 From 3d786bd7bd880fd5a6fd9ade47f782f0a363d4ab Mon Sep 17 00:00:00 2001 From: dorotaphanSiili <108282075+dorotaphanSiili@users.noreply.github.com> Date: Fri, 24 Jan 2025 10:06:30 +0100 Subject: [PATCH 5/5] chores: clean up structure the network adapters files are very imported files for test - this is not a heloer file, it should be more visible. Most of helepr files are used for many object tests and were move there aprat from olink, where it is still used for single object test, but probably should not. This is just a one step of clean up. The latency helpers (common for all tests) should be separate target The olink test may be improved. The TestData objects are very common between technologies, probably could be taken out. --- cpp/mqtt_tests/many_objects/CMakeLists.txt | 2 +- .../many_objects/client_setFloatProperty.cpp | 6 +- .../many_objects/client_setIntProperty.cpp | 6 +- .../many_objects/client_setStringProperty.cpp | 6 +- .../{ => many_objects}/helpers/itestsink.h | 114 +-- .../helpers/prepare_test_data.h | 488 ++++++------- .../helpers/prepare_test_services.cpp | 686 +++++++++--------- .../helpers/prepare_test_services.h | 10 +- cpp/mqtt_tests/many_objects/server.cpp | 4 +- ...mqtt_network_protocol_handler_for_test.hpp | 214 +++--- .../client_asyncIntMethodCall.cpp | 2 +- .../client_setIntProperty.cpp | 2 +- .../client_setStringProperty.cpp | 2 +- .../client_syncIntMethodCall.cpp | 2 +- .../client_syncSetIntProperty.cpp | 2 +- .../single_object_many_threads/server.cpp | 2 +- .../{helpers => }/test_message_topics.h | 18 +- ...nats_network_protocol_handler_for_test.hpp | 0 .../client_asyncIntMethodCall.cpp | 2 +- .../client_setIntProperty.cpp | 3 +- .../client_syncIntMethodCall.cpp | 2 +- .../client_syncSetIntProperty.cpp | 2 +- .../single_object_many_threads/server.cpp | 2 +- .../{helpers => }/test_message_topics.h | 0 ...o_network_single_object_asyncIntMethod.cpp | 4 +- ...o_network_single_object_setIntProperty.cpp | 6 +- ...etwork_single_object_syncIntMethodCall.cpp | 2 +- .../olink_handler_no_network.hpp | 96 +-- ...link_network_protocol_handler_for_test.hpp | 206 +++--- .../client_asyncIntMethodCall.cpp | 2 +- .../client_setIntProperty.cpp | 2 +- .../client_setStringProperty.cpp | 2 +- .../client_syncIntMethodCall.cpp | 2 +- .../client_syncSetIntProperty.cpp | 2 +- .../modules/api/implementation/testapi0.cpp | 260 +++---- 35 files changed, 1086 insertions(+), 1075 deletions(-) rename cpp/mqtt_tests/{ => many_objects}/helpers/itestsink.h (97%) rename cpp/mqtt_tests/{ => many_objects}/helpers/prepare_test_data.h (98%) rename cpp/mqtt_tests/{ => many_objects}/helpers/prepare_test_services.cpp (98%) rename cpp/mqtt_tests/{ => many_objects}/helpers/prepare_test_services.h (96%) rename cpp/mqtt_tests/{helpers => }/mqtt_network_protocol_handler_for_test.hpp (96%) rename cpp/mqtt_tests/{helpers => }/test_message_topics.h (96%) rename cpp/nats_tests/{helpers => }/nats_network_protocol_handler_for_test.hpp (100%) rename cpp/nats_tests/{helpers => }/test_message_topics.h (100%) rename cpp/olink_tests/{helpers => }/olink_handler_no_network.hpp (96%) rename cpp/olink_tests/{helpers => }/olink_network_protocol_handler_for_test.hpp (96%) diff --git a/cpp/mqtt_tests/many_objects/CMakeLists.txt b/cpp/mqtt_tests/many_objects/CMakeLists.txt index 1629a42..b42a35b 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 463a1ef..4bb90d8 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 0f0c9aa..548e326 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 655173f..eb92813 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 99b1a76..2f98f10 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 d743dea..947b864 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 be9beda..2fdc6cf 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 e595631..78f7694 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 c7f38b9..092c36b 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 96% 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 6d364d8..852d1dc 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.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; -}; +#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/client_asyncIntMethodCall.cpp b/cpp/mqtt_tests/single_object_many_threads/client_asyncIntMethodCall.cpp index f952539..95c37c7 100644 --- a/cpp/mqtt_tests/single_object_many_threads/client_asyncIntMethodCall.cpp +++ b/cpp/mqtt_tests/single_object_many_threads/client_asyncIntMethodCall.cpp @@ -1,6 +1,6 @@ #include "api/generated/mqtt/testapi0client.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 "../../scenario_templates/single_object_many_threads/executeTestFunction.h" 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 b60772d..f58fd0d 100644 --- a/cpp/mqtt_tests/single_object_many_threads/client_setIntProperty.cpp +++ b/cpp/mqtt_tests/single_object_many_threads/client_setIntProperty.cpp @@ -1,6 +1,6 @@ #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 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 0eef636..3be3f20 100644 --- a/cpp/mqtt_tests/single_object_many_threads/client_setStringProperty.cpp +++ b/cpp/mqtt_tests/single_object_many_threads/client_setStringProperty.cpp @@ -1,6 +1,6 @@ #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 diff --git a/cpp/mqtt_tests/single_object_many_threads/client_syncIntMethodCall.cpp b/cpp/mqtt_tests/single_object_many_threads/client_syncIntMethodCall.cpp index 1021742..26c9c47 100644 --- a/cpp/mqtt_tests/single_object_many_threads/client_syncIntMethodCall.cpp +++ b/cpp/mqtt_tests/single_object_many_threads/client_syncIntMethodCall.cpp @@ -1,6 +1,6 @@ #include "api/generated/mqtt/testapi0client.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 "../../scenario_templates/single_object_many_threads/executeTestFunction.h" diff --git a/cpp/mqtt_tests/single_object_many_threads/client_syncSetIntProperty.cpp b/cpp/mqtt_tests/single_object_many_threads/client_syncSetIntProperty.cpp index 664ec67..c3c9eb0 100644 --- a/cpp/mqtt_tests/single_object_many_threads/client_syncSetIntProperty.cpp +++ b/cpp/mqtt_tests/single_object_many_threads/client_syncSetIntProperty.cpp @@ -1,7 +1,7 @@ #include "api/generated/mqtt/testapi0client.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 "../../scenario_templates/single_object_many_threads/executeTestFunction.h" diff --git a/cpp/mqtt_tests/single_object_many_threads/server.cpp b/cpp/mqtt_tests/single_object_many_threads/server.cpp index be735a7..17c6d24 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 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 2345e38..ad39d79 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/helpers/nats_network_protocol_handler_for_test.hpp b/cpp/nats_tests/nats_network_protocol_handler_for_test.hpp similarity index 100% rename from cpp/nats_tests/helpers/nats_network_protocol_handler_for_test.hpp rename to cpp/nats_tests/nats_network_protocol_handler_for_test.hpp diff --git a/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp b/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp index 1338713..f0977dc 100644 --- a/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp +++ b/cpp/nats_tests/single_object_many_threads/client_asyncIntMethodCall.cpp @@ -1,6 +1,6 @@ #include "api/generated/nats/testapi0client.h" -#include "../helpers/nats_network_protocol_handler_for_test.hpp" +#include "../nats_network_protocol_handler_for_test.hpp" #include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" diff --git a/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp b/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp index 1be6983..a651ed7 100644 --- a/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp +++ b/cpp/nats_tests/single_object_many_threads/client_setIntProperty.cpp @@ -1,7 +1,6 @@ -//#include "../helpers/itestsink.h" #include "api/generated/nats/testapi0client.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" -#include "../helpers/nats_network_protocol_handler_for_test.hpp" +#include "../nats_network_protocol_handler_for_test.hpp" #include "../../latency_helpers/latency_helpers.h" #include diff --git a/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp b/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp index 84e14e5..a5a0d98 100644 --- a/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp +++ b/cpp/nats_tests/single_object_many_threads/client_syncIntMethodCall.cpp @@ -1,6 +1,6 @@ #include "api/generated/nats/testapi0client.h" -#include "../helpers/nats_network_protocol_handler_for_test.hpp" +#include "../nats_network_protocol_handler_for_test.hpp" #include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" diff --git a/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp b/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp index 8478f92..62d624a 100644 --- a/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp +++ b/cpp/nats_tests/single_object_many_threads/client_syncSetIntProperty.cpp @@ -1,7 +1,7 @@ #include "api/generated/nats/testapi0client.h" -#include "../helpers/nats_network_protocol_handler_for_test.hpp" +#include "../nats_network_protocol_handler_for_test.hpp" #include "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" diff --git a/cpp/nats_tests/single_object_many_threads/server.cpp b/cpp/nats_tests/single_object_many_threads/server.cpp index 2aad5ab..c08b095 100644 --- a/cpp/nats_tests/single_object_many_threads/server.cpp +++ b/cpp/nats_tests/single_object_many_threads/server.cpp @@ -1,7 +1,7 @@ #include "api/generated/nats/testapi0service.h" #include "api/implementation/testapi0.h" #include "apigear/nats/natsservice.h" -#include "../helpers/test_message_topics.h" +#include "../test_message_topics.h" #include #include #include diff --git a/cpp/nats_tests/helpers/test_message_topics.h b/cpp/nats_tests/test_message_topics.h similarity index 100% rename from cpp/nats_tests/helpers/test_message_topics.h rename to cpp/nats_tests/test_message_topics.h 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 baf9900..589616e 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 420137a..5696d67 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 "../../latency_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 40a56fc..b29da37 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 @@ -11,7 +11,7 @@ #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" #include "../helpers/inspected_sink.h" #include "../../latency_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/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 9a41849..9971c89 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 19cf7b2..bf5cb5e 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/client_asyncIntMethodCall.cpp b/cpp/olink_tests/single_object_many_threads/client_asyncIntMethodCall.cpp index 282e17e..84c6bc9 100644 --- a/cpp/olink_tests/single_object_many_threads/client_asyncIntMethodCall.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_asyncIntMethodCall.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 "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" 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 a0a8757..561136a 100644 --- a/cpp/olink_tests/single_object_many_threads/client_setIntProperty.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_setIntProperty.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 "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" 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 11a5563..7efbe68 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 d35d108..c19c8b6 100644 --- a/cpp/olink_tests/single_object_many_threads/client_syncIntMethodCall.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_syncIntMethodCall.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 "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" 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 4c1d358..cce5b37 100644 --- a/cpp/olink_tests/single_object_many_threads/client_syncSetIntProperty.cpp +++ b/cpp/olink_tests/single_object_many_threads/client_syncSetIntProperty.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 "../../latency_helpers/latency_helpers.h" #include "../../scenario_templates/single_object_many_threads/executeTestFunction.h" diff --git a/cpp/testApi/modules/api/implementation/testapi0.cpp b/cpp/testApi/modules/api/implementation/testapi0.cpp index ca5afbf..a9b7518 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; +}