From 09a07e7b80a9fa040f585b01cde5e7e6031c8b97 Mon Sep 17 00:00:00 2001 From: Francesco Pham Date: Thu, 25 Aug 2022 16:48:59 +0200 Subject: [PATCH 1/5] linux/CoapClient: fix token being reused after new session is created every time a new coap session is created the token generated are restarted from 0 causing the same token to be reused in different coap request, this gives rise to problem in matching responses with the correct requests. FIxing by initializing session token with the last generated token. Signed-off-by: Francesco Pham --- linux/communication/include/CoapClient.h | 6 +++-- linux/communication/src/CoapClient.cpp | 31 +++++++++++------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/linux/communication/include/CoapClient.h b/linux/communication/include/CoapClient.h index deb3af9..e6d987b 100644 --- a/linux/communication/include/CoapClient.h +++ b/linux/communication/include/CoapClient.h @@ -28,9 +28,11 @@ private: coap_session_t *open_session(const char *dst_host, const char *dst_port); - std::thread client_thread; - static ThreadSafeMap *messages; + + std::string last_token; + + std::thread client_thread; static std::mutex client_mutex; static std::condition_variable client_condition; diff --git a/linux/communication/src/CoapClient.cpp b/linux/communication/src/CoapClient.cpp index 95310b5..71cd59f 100644 --- a/linux/communication/src/CoapClient.cpp +++ b/linux/communication/src/CoapClient.cpp @@ -118,24 +118,16 @@ void CoapClient::set_quit(bool value) { } std::string CoapClient::send_message(request_t request) { - coap_session_t *session; uint8_t buf[1024]; - size_t buflen; uint8_t *sbuf = buf; coap_pdu_t *pdu; int res; coap_optlist_t *optlist = nullptr; - uint8_t token_buf[1024]; - memset(token_buf, 0, sizeof(token_buf)); - size_t token_len; - uint8_t *token = token_buf; - // BEGIN CRITICAL CALLS TO CoAP APIs std::unique_lock lock(CoapClient::client_mutex); - session = open_session(request.dst_host, request.dst_port); - + coap_session_t * session = open_session(request.dst_host, request.dst_port); if (!session) { LOG_ERR("Error creating remote session"); coap_session_release(session); @@ -148,12 +140,20 @@ std::string CoapClient::send_message(request_t request) { coap_new_message_id(session), coap_session_max_pdu_size(session)); - // Add token to the request - coap_session_new_token(session, &token_len, token); - coap_add_token(pdu, token_len, token); + // initialize session token to last generated token so that new sessions does not reuse same token again + if (!last_token.empty()) + coap_session_init_token(session, last_token.length(), (const uint8_t *)last_token.c_str()); + + // generate new token and add to PDU + uint8_t token_buf[8]; + size_t token_len; + coap_session_new_token(session, &token_len, token_buf); + std::string token_str = std::string(reinterpret_cast(token_buf), token_len); + this->last_token = token_str; + coap_add_token(pdu, token_len, token_buf); if (request.path) { - buflen = sizeof(buf); + size_t buflen = sizeof(buf); res = coap_split_path((const uint8_t *) request.path, strlen(request.path), sbuf, @@ -175,7 +175,7 @@ std::string CoapClient::send_message(request_t request) { // Add query as option to the PDU if (request.query) { - buflen = sizeof(buf); + size_t buflen = sizeof(buf); res = coap_split_query((const uint8_t *) request.query, strlen(request.query), sbuf, &buflen); while (res--) { @@ -195,9 +195,6 @@ std::string CoapClient::send_message(request_t request) { coap_add_data(pdu, request.data_length, request.data); } - // add token string as valid token - std::string token_str = std::string(reinterpret_cast(token), token_len); - coap_send(session, pdu); // END OF CRITICAL LINES -- GitLab From 36668243ae343175b414ffa3d23d71e00812c4bb Mon Sep 17 00:00:00 2001 From: Francesco Pham Date: Tue, 30 Aug 2022 15:54:36 +0200 Subject: [PATCH 2/5] linux/virtualization: fix return of destroyed string - VirtualizationSender: fix return of destroyed string by returning std::string instead of char* - VirtualizationReceiver: remove check if preferred_resource_type exists - parse program argument and forward ip and port parameter to EddieEndpoint - remove unused stuff Signed-off-by: Francesco Pham --- linux/CMakeLists.txt | 1 + linux/communication/src/EddieEndpoint.cpp | 2 + linux/examples/virt_client.cpp | 2 +- linux/examples/virt_server.cpp | 29 ++++++++- .../include/VirtualizationReceiver.h | 2 +- .../include/VirtualizationSender.h | 2 +- .../src/VirtualizationReceiver.cpp | 63 ++++++------------- .../src/VirtualizationSender.cpp | 5 +- 8 files changed, 54 insertions(+), 52 deletions(-) diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index a8c3bed..68ee79f 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -41,6 +41,7 @@ install(TARGETS eddie-endpoint RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # virtualization server add_executable(eddie-virt-server examples/virt_server.cpp ${SOURCES}) target_link_libraries(eddie-virt-server PkgConfig::GLIB ${CMAKE_THREAD_LIBS_INIT} eddie-communication eddie-virtualization) +target_include_directories(eddie-virt-server PUBLIC ${PROJECT_SOURCE_DIR}/include) set_property(TARGET eddie-virt-server PROPERTY C_STANDARD 11) install(TARGETS eddie-virt-server RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/linux/communication/src/EddieEndpoint.cpp b/linux/communication/src/EddieEndpoint.cpp index 94857ea..edf6bca 100644 --- a/linux/communication/src/EddieEndpoint.cpp +++ b/linux/communication/src/EddieEndpoint.cpp @@ -92,6 +92,7 @@ int EddieEndpoint::add_resource(EddieResource *resource) { } int EddieEndpoint::start_server(bool blocking) { + LOG_DBG("starting server"); if (blocking) return get_server()->run(); else @@ -99,6 +100,7 @@ int EddieEndpoint::start_server(bool blocking) { } int EddieEndpoint::stop_server() { + LOG_DBG("stopping server"); return get_server()->stop_server(); } diff --git a/linux/examples/virt_client.cpp b/linux/examples/virt_client.cpp index def14f4..d37ca16 100644 --- a/linux/examples/virt_client.cpp +++ b/linux/examples/virt_client.cpp @@ -24,7 +24,7 @@ int main() { }); auto answer = send_message(parameters); - printf("%s\n", answer); + printf("%s\n", answer.c_str()); disconnect(watcher_id); diff --git a/linux/examples/virt_server.cpp b/linux/examples/virt_server.cpp index a2526c4..aef4b0e 100644 --- a/linux/examples/virt_server.cpp +++ b/linux/examples/virt_server.cpp @@ -8,10 +8,35 @@ #include #include #include "VirtualizationReceiver.h" +#include "argparse.hpp" using namespace std; -int main() { - VirtualizationReceiver receiver = VirtualizationReceiver(); +int main(int argc, char *argv[]) { + argparse::ArgumentParser program("eddie-virt-server"); + + program.add_argument("--ip", "-a") + .help("Ip address") + .default_value(std::string{"auto"}); + + program.add_argument("--port", "-p") + .help("Port number") + .scan<'i', int>() + .default_value(5683); + + try { + program.parse_args(argc, argv); + } + catch (const std::runtime_error& err) { + std::cerr << err.what() << std::endl; + std::cerr << program; + std::exit(1); + } + + auto port_number = program.get("port"); + auto ip = program.get("ip"); + if (ip == "auto") ip = ""; + + VirtualizationReceiver receiver = VirtualizationReceiver(ip, std::to_string(port_number)); receiver.run(vector(), vector(), 0); } diff --git a/linux/virtualization/include/VirtualizationReceiver.h b/linux/virtualization/include/VirtualizationReceiver.h index fadf631..3807c56 100644 --- a/linux/virtualization/include/VirtualizationReceiver.h +++ b/linux/virtualization/include/VirtualizationReceiver.h @@ -40,7 +40,7 @@ private: on_name_lost(GDBusConnection *connection, const gchar *name, gpointer user_data); public: - VirtualizationReceiver(); + VirtualizationReceiver(const std::string& ip = "", const std::string& port = "5683"); static EddieEndpoint *communication_layer(); diff --git a/linux/virtualization/include/VirtualizationSender.h b/linux/virtualization/include/VirtualizationSender.h index 18287f7..34ca1df 100644 --- a/linux/virtualization/include/VirtualizationSender.h +++ b/linux/virtualization/include/VirtualizationSender.h @@ -16,7 +16,7 @@ guint connect(); void disconnect(guint watcher_id); -const gchar *send_message(const std::unordered_map ¶meters); +std::string send_message(const std::unordered_map ¶meters); void run(); diff --git a/linux/virtualization/src/VirtualizationReceiver.cpp b/linux/virtualization/src/VirtualizationReceiver.cpp index dfa3408..ac3aa57 100644 --- a/linux/virtualization/src/VirtualizationReceiver.cpp +++ b/linux/virtualization/src/VirtualizationReceiver.cpp @@ -30,7 +30,7 @@ static const gchar *introspection_XML = " " ""; -EddieEndpoint* VirtualizationReceiver::eddie_endpoint = new EddieEndpoint(); +EddieEndpoint* VirtualizationReceiver::eddie_endpoint; std::vector VirtualizationReceiver::resources; GDBusNodeInfo *VirtualizationReceiver::introspection_data = g_dbus_node_info_new_for_xml(introspection_XML, nullptr); const GDBusInterfaceVTable VirtualizationReceiver::interface_vtable = {handle_method_call}; @@ -38,18 +38,6 @@ const GDBusInterfaceVTable VirtualizationReceiver::interface_vtable = {handle_me std::unordered_multimap resources_by_ip; std::unordered_map resources_by_resource_name; -std::vector split_virt(const std::string &s, char delimiter) { - std::vector tokens; - std::string token; - std::istringstream tokenStream(s); - - while (std::getline(tokenStream, token, delimiter)) { - tokens.push_back(token); - } - - return tokens; -} - method_t method_from_string(const std::string &input) { if (input == "GET") return GET; else if (input == "POST") return POST; @@ -61,24 +49,17 @@ int mock_ai_executor(const std::string &method, const std::unordered_mapsecond.host; - port = resource_it->second.port; - query = ""; - } else { - res = "lamp1/status"; - ip = resource_it->second.host; - port = resource_it->second.port; - query = ""; + if (resource_it == resources_by_resource_name.end()) { + LOG_ERR("lamp/brightness resource not found"); + return -1; } + + ip = resource_it->second.host; + port = resource_it->second.port; + query = ""; return 0; } @@ -126,6 +107,8 @@ public: token = strtok(nullptr, "&"); } split_attributes.push_back(nullptr); + + data = "uninitialized data"; } ~MockEddieResource() { @@ -182,12 +165,9 @@ void VirtualizationReceiver::handle_method_call(GDBusConnection *connection, con } std::string ip, port, resource, query; - std::basic_string token; update_resources(); - std::string comm_answer; - if (mock_ai_executor(method, query_parameters, ip, port, resource, query)) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(s)", "ERROR forging the message")); LOG_ERR("ERROR forging the message"); @@ -205,10 +185,8 @@ void VirtualizationReceiver::handle_method_call(GDBusConnection *connection, con 0 }; message_t response = eddie_endpoint->get_client()->send_message_and_wait_response(request); - comm_answer = response.data; - LOG_DBG("return data: %s", comm_answer.c_str()); - g_dbus_method_invocation_return_value(invocation, g_variant_new("(s)", comm_answer.c_str())); + g_dbus_method_invocation_return_value(invocation, g_variant_new("(s)", response.data.c_str())); } } @@ -222,22 +200,20 @@ void VirtualizationReceiver::on_bus_acquired(GDBusConnection *connection, const nullptr, nullptr, nullptr); g_assert(registration_id > 0); + printf("Started virtualization layer"); } void VirtualizationReceiver::on_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) { - + LOG_DBG("[Virtualization Layer]: dbus name acquired -> %s", name); } void VirtualizationReceiver::on_name_lost(GDBusConnection *connection, const gchar *name, gpointer user_data) { + LOG_ERR("[Virtualization Layer]: dbus name lost <- %s", name); exit(-1); } -VirtualizationReceiver::VirtualizationReceiver() { - if (eddie_endpoint == nullptr) { - LOG_ERR("[VirtualizationReceiver::VirtualizationReceiver]: error setting up the infrastructure\n"); - LOG_ERR("\teddie_endpoint is null\n"); - exit(-1); - } +VirtualizationReceiver::VirtualizationReceiver(const std::string& ip, const std::string& port) { + eddie_endpoint = new EddieEndpoint(port, ip); eddie_endpoint->discover_rd(); } @@ -260,10 +236,7 @@ EddieEndpoint *VirtualizationReceiver::communication_layer() { } int VirtualizationReceiver::run(std::vector uris, std::vector attributes, int node) { - std::thread comm_runner([]() { - eddie_endpoint->start_server(); - }); - + eddie_endpoint->start_server(); if (uris.empty() || attributes.empty()) mock_comm_setup(uris, attributes); for (int i = 0; i < uris.size(); ++i) { diff --git a/linux/virtualization/src/VirtualizationSender.cpp b/linux/virtualization/src/VirtualizationSender.cpp index da170aa..0bd8531 100644 --- a/linux/virtualization/src/VirtualizationSender.cpp +++ b/linux/virtualization/src/VirtualizationSender.cpp @@ -99,7 +99,7 @@ void disconnect(guint watcher_id) { g_main_loop_quit(global_loop); } -const gchar *send_message(const std::unordered_map ¶meters) { +std::string send_message(const std::unordered_map ¶meters) { int count = 0; while (global_connection == nullptr && count < MAX_RETRIES) { @@ -172,11 +172,12 @@ const gchar *send_message(const std::unordered_map &pa } const gchar *response = g_dbus_message_get_arg0(method_reply_message); + std::string response_str = std::string(response); g_object_unref(method_call_message); g_object_unref(method_reply_message); - return response; + return response_str; } void run() { -- GitLab From 2d4c7166bacac948b6078ddc016d28e1abe12009 Mon Sep 17 00:00:00 2001 From: Francesco Pham Date: Tue, 30 Aug 2022 18:06:13 +0200 Subject: [PATCH 3/5] virt_server: add exampleres flag to add mock resources - add --exampleres flag to add mock resources to the node - remove unused node parameter from VirtualizationReceiver::run - move mock_comm_setup from VirtualizationReceiver to virt_server Signed-off-by: Francesco Pham --- linux/examples/virt_server.cpp | 27 ++++++++++++++++++- .../include/VirtualizationReceiver.h | 2 +- .../src/VirtualizationReceiver.cpp | 17 +----------- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/linux/examples/virt_server.cpp b/linux/examples/virt_server.cpp index aef4b0e..21bf35f 100644 --- a/linux/examples/virt_server.cpp +++ b/linux/examples/virt_server.cpp @@ -12,6 +12,20 @@ using namespace std; +void mock_comm_setup(std::vector &uris, std::vector &attributes) { + uris = { + "lamp", + "lamp/brightness", + "lamp/color_rgb" + }; + + attributes = { + "lt=90000&rt=eddie.lamp&ct=40", + "lt=90000&rt=eddie.lamp.brightness&range=0-1&ct=0", + "lt=90000&rt=eddie.lamp.color&ct=0" + }; +} + int main(int argc, char *argv[]) { argparse::ArgumentParser program("eddie-virt-server"); @@ -24,6 +38,11 @@ int main(int argc, char *argv[]) { .scan<'i', int>() .default_value(5683); + program.add_argument("--exampleres", "-e") + .help("Publish example lamp resources") + .default_value(false) + .implicit_value(true); + try { program.parse_args(argc, argv); } @@ -38,5 +57,11 @@ int main(int argc, char *argv[]) { if (ip == "auto") ip = ""; VirtualizationReceiver receiver = VirtualizationReceiver(ip, std::to_string(port_number)); - receiver.run(vector(), vector(), 0); + + vector uris; + vector attributes; + if (program["--exampleres"] == true) { + mock_comm_setup(uris, attributes); + } + receiver.run(uris, attributes); } diff --git a/linux/virtualization/include/VirtualizationReceiver.h b/linux/virtualization/include/VirtualizationReceiver.h index 3807c56..9e23eb9 100644 --- a/linux/virtualization/include/VirtualizationReceiver.h +++ b/linux/virtualization/include/VirtualizationReceiver.h @@ -44,7 +44,7 @@ public: static EddieEndpoint *communication_layer(); - int run(std::vector uris, std::vector attributes, int node); + int run(std::vector uris, std::vector attributes); static void update_resources(); }; diff --git a/linux/virtualization/src/VirtualizationReceiver.cpp b/linux/virtualization/src/VirtualizationReceiver.cpp index ac3aa57..6b3a508 100644 --- a/linux/virtualization/src/VirtualizationReceiver.cpp +++ b/linux/virtualization/src/VirtualizationReceiver.cpp @@ -63,20 +63,6 @@ int mock_ai_executor(const std::string &method, const std::unordered_map &uris, std::vector &attributes) { - uris = { - "lamp", - "lamp/brightness", - "lamp/color_rgb" - }; - - attributes = { - "lt=90000&rt=eddie.lamp&ct=40", - "lt=90000&rt=eddie.lamp.brightness&range=0-1&ct=0", - "lt=90000&rt=eddie.lamp.color&ct=0" - }; -} - class MockEddieResource : public EddieResource { private: char* path; @@ -235,9 +221,8 @@ EddieEndpoint *VirtualizationReceiver::communication_layer() { return eddie_endpoint; } -int VirtualizationReceiver::run(std::vector uris, std::vector attributes, int node) { +int VirtualizationReceiver::run(std::vector uris, std::vector attributes) { eddie_endpoint->start_server(); - if (uris.empty() || attributes.empty()) mock_comm_setup(uris, attributes); for (int i = 0; i < uris.size(); ++i) { EddieResource* new_resource = new MockEddieResource(uris[i], attributes[i]); -- GitLab From 52a49123c0b3040c23a93e2edc681242183312ae Mon Sep 17 00:00:00 2001 From: Francesco Pham Date: Wed, 31 Aug 2022 17:14:27 +0200 Subject: [PATCH 4/5] .ci/Dockerfile: add apt install dbus-x11 and add script to launch dbus dbus is required for the virtualization layer Signed-off-by: Francesco Pham --- .ci/Dockerfile | 5 ++++- .ci/run.sh | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .ci/run.sh diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 42c3740..ab5aee4 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,2 +1,5 @@ FROM ubuntu:22.04 -RUN apt update && DEBIAN_FRONTEND=noninteractive apt -y install make cmake pkg-config libcoap3-dev build-essential gcovr libgtest-dev libglib2.0-dev +COPY run.sh /etc/init/ +RUN apt update && DEBIAN_FRONTEND=noninteractive apt -y install make cmake pkg-config libcoap3-dev build-essential gcovr libgtest-dev dbus-x11 libglib2.0-dev +RUN ["chmod", "+x", "/etc/init/run.sh"] +ENTRYPOINT ["/etc/init/run.sh"] \ No newline at end of file diff --git a/.ci/run.sh b/.ci/run.sh new file mode 100644 index 0000000..e9305e6 --- /dev/null +++ b/.ci/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash +export $(dbus-launch) +/bin/bash \ No newline at end of file -- GitLab From 82f393aca43d65a433c4db408f633cf6f0dea614 Mon Sep 17 00:00:00 2001 From: Francesco Pham Date: Thu, 1 Sep 2022 10:32:53 +0200 Subject: [PATCH 5/5] virtualization_tests: add virtualization tests - add virtualization_tests.cpp containing virtualization tests. For now there is just one test copied from eddie-virt-client - add targets in linux/tests/CMakeLists.txt - fixture now starts `eddie-virt-server` instead of `resource-directory` - fixture starts `eddie-virt-server` with 3 mock example resources therefore adapting the communication tests - fixture-start.sh sleep time increased to 5 because timeout time is 5 seconds at initialization when the node searches for a non existent resource directory Signed-off-by: Francesco Pham --- linux/tests/CMakeLists.txt | 22 +++++++++++++---- linux/tests/communication_tests.cpp | 4 +-- linux/tests/virtualization_tests.cpp | 37 ++++++++++++++++++++++++++++ tests/fixture-start.sh | 2 +- 4 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 linux/tests/virtualization_tests.cpp diff --git a/linux/tests/CMakeLists.txt b/linux/tests/CMakeLists.txt index f2e63b3..4e133f8 100644 --- a/linux/tests/CMakeLists.txt +++ b/linux/tests/CMakeLists.txt @@ -2,6 +2,10 @@ add_executable( communication_tests communication_tests.cpp ) +add_executable( + virtualization_tests + virtualization_tests.cpp +) target_link_libraries( communication_tests gtest @@ -10,17 +14,25 @@ target_link_libraries( eddie-communication ) +target_link_libraries( + virtualization_tests + gtest + gtest_main + eddie-virtualization +) + include(GoogleTest) -gtest_discover_tests(communication_tests PROPERTIES FIXTURES_REQUIRED "resource-directory") +gtest_discover_tests(communication_tests PROPERTIES FIXTURES_REQUIRED "eddie-virt-server") +gtest_discover_tests(virtualization_tests PROPERTIES FIXTURES_REQUIRED "eddie-virt-server") add_test(NAME Fixture.Eddie_Server_Setup - COMMAND ${CMAKE_SOURCE_DIR}/tests/fixture-start.sh ./linux/resource-directory) + COMMAND ${CMAKE_SOURCE_DIR}/tests/fixture-start.sh "./linux/eddie-virt-server --exampleres --ip ::1") set_tests_properties(Fixture.Eddie_Server_Setup PROPERTIES WORKING_DIRECTORY . - FIXTURES_SETUP resource-directory) + FIXTURES_SETUP eddie-virt-server) add_test(NAME Fixture.Eddie_Server_Teardown - COMMAND ${CMAKE_SOURCE_DIR}/tests/fixture-stop.sh ./linux/resource-directory) + COMMAND ${CMAKE_SOURCE_DIR}/tests/fixture-stop.sh) set_tests_properties(Fixture.Eddie_Server_Teardown PROPERTIES WORKING_DIRECTORY . - FIXTURES_CLEANUP resource-directory) + FIXTURES_CLEANUP eddie-virt-server) diff --git a/linux/tests/communication_tests.cpp b/linux/tests/communication_tests.cpp index 4d33382..8c97e62 100644 --- a/linux/tests/communication_tests.cpp +++ b/linux/tests/communication_tests.cpp @@ -133,7 +133,7 @@ TEST(Communication, Get_Resources_From_Rd) { EXPECT_EQ(endpoint.discover_rd(), 0); std::vector res = endpoint.get_resources_from_rd(); - EXPECT_EQ(res.size(), 0); + EXPECT_EQ(res.size(), 3); } TEST(Communication, Publish_And_Get_Resources) { @@ -175,4 +175,4 @@ TEST(Communication, Publish_And_Get_Resources) { EXPECT_EQ(response.data, "on"); EXPECT_EQ(endpoint.stop_server(), 0); -} \ No newline at end of file +} diff --git a/linux/tests/virtualization_tests.cpp b/linux/tests/virtualization_tests.cpp new file mode 100644 index 0000000..3991cc1 --- /dev/null +++ b/linux/tests/virtualization_tests.cpp @@ -0,0 +1,37 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * SPDX-FileCopyrightText: Huawei Inc. + * SPDX-FileCopyrightText: Politecnico Di Milano + */ +#include +#include +#include + +#include "VirtualizationSender.h" + +TEST(Communication, Virtualization_Sender) { + guint watcher_id = connect(); + + std::thread main([]() { + run(); + }); + + std::unordered_map parameters = { + {"method", "POST"}, + {"payload", "100"} + }; + auto answer = send_message(parameters); + EXPECT_EQ(answer, ""); + + parameters = { + {"method", "GET"}, + {"payload", ""} + }; + answer = send_message(parameters); + EXPECT_EQ(answer, "100"); + + disconnect(watcher_id); + + main.join(); +} \ No newline at end of file diff --git a/tests/fixture-start.sh b/tests/fixture-start.sh index 2be3c64..bb6870e 100755 --- a/tests/fixture-start.sh +++ b/tests/fixture-start.sh @@ -3,5 +3,5 @@ $1 2>/dev/null 1>/dev/null 0 fixture.pid # Allow server to fully start before lauching clients with ctest -sleep 2 +sleep 5 exit 0 -- GitLab