From 8fccbc4712b6ce142bb6b540a38c082ebd3a2399 Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Fri, 10 Jan 2020 16:11:56 -0800 Subject: [PATCH 01/15] wip --- src/signalrclient/hub_connection_builder.cpp | 1 + test/signalrclienttests/hub_connection_tests.cpp | 3 --- test/signalrclienttests/websocket_transport_tests.cpp | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/signalrclient/hub_connection_builder.cpp b/src/signalrclient/hub_connection_builder.cpp index 582de5e1..c09c575e 100644 --- a/src/signalrclient/hub_connection_builder.cpp +++ b/src/signalrclient/hub_connection_builder.cpp @@ -3,6 +3,7 @@ #include "stdafx.h" #include "signalrclient/hub_connection_builder.h" +#include namespace signalr { diff --git a/test/signalrclienttests/hub_connection_tests.cpp b/test/signalrclienttests/hub_connection_tests.cpp index 3d27d588..02b0cb36 100644 --- a/test/signalrclienttests/hub_connection_tests.cpp +++ b/test/signalrclienttests/hub_connection_tests.cpp @@ -848,8 +848,6 @@ TEST(send, creates_correct_payload) TEST(send, does_not_wait_for_server_response) { - pplx::task_completion_event waitForSend; - auto websocket_client = create_test_websocket_client(); auto hub_connection = create_hub_connection(websocket_client); @@ -872,7 +870,6 @@ TEST(send, does_not_wait_for_server_response) mre.set(exception); }); mre.get(); - waitForSend.set(); } TEST(send, passing_non_array_arguments_fails) diff --git a/test/signalrclienttests/websocket_transport_tests.cpp b/test/signalrclienttests/websocket_transport_tests.cpp index 431c2fb7..acef178e 100644 --- a/test/signalrclienttests/websocket_transport_tests.cpp +++ b/test/signalrclienttests/websocket_transport_tests.cpp @@ -50,7 +50,7 @@ TEST(websocket_transport_connect, connect_propagates_exceptions) auto client = std::make_shared(); client->set_connect_function([](const std::string&, std::function callback) { - callback(std::make_exception_ptr(web::websockets::client::websocket_exception(_XPLATSTR("connecting failed")))); + callback(std::make_exception_ptr(std::runtime_error("connecting failed"))); }); auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); @@ -67,7 +67,7 @@ TEST(websocket_transport_connect, connect_propagates_exceptions) } catch (const std::exception &e) { - ASSERT_EQ(_XPLATSTR("connecting failed"), utility::conversions::to_string_t(e.what())); + ASSERT_EQ("connecting failed", e.what()); } } From 6129c6a373ce7111c2a80569d74d91d26165ed36 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Sun, 12 Jan 2020 22:54:45 -0800 Subject: [PATCH 02/15] almost --- include/signalrclient/signalr_client_config.h | 12 ++++-- src/signalrclient/connection_impl.cpp | 7 ++-- src/signalrclient/negotiate.cpp | 6 +-- src/signalrclient/signalr_client_config.cpp | 11 ++++-- .../connection_impl_tests.cpp | 37 +++++++------------ test/signalrclienttests/logger_tests.cpp | 12 +++--- .../websocket_transport_tests.cpp | 8 ++-- 7 files changed, 45 insertions(+), 48 deletions(-) diff --git a/include/signalrclient/signalr_client_config.h b/include/signalrclient/signalr_client_config.h index 428e71fa..55ac3b5f 100644 --- a/include/signalrclient/signalr_client_config.h +++ b/include/signalrclient/signalr_client_config.h @@ -9,13 +9,14 @@ #endif #include "_exports.h" +#include namespace signalr { class signalr_client_config { -#ifdef USE_CPPRESTSDK public: +#ifdef USE_CPPRESTSDK SIGNALRCLIENT_API void __cdecl set_proxy(const web::web_proxy &proxy); // Please note that setting credentials does not work in all cases. // For example, Basic Authentication fails under Win32. @@ -28,14 +29,17 @@ namespace signalr SIGNALRCLIENT_API web::websockets::client::websocket_client_config __cdecl get_websocket_client_config() const noexcept; SIGNALRCLIENT_API void __cdecl set_websocket_client_config(const web::websockets::client::websocket_client_config& websocket_client_config); +#endif - SIGNALRCLIENT_API web::http::http_headers __cdecl get_http_headers() const noexcept; - SIGNALRCLIENT_API void __cdecl set_http_headers(const web::http::http_headers& http_headers); + SIGNALRCLIENT_API const std::map& __cdecl get_http_headers() const noexcept; + SIGNALRCLIENT_API std::map& __cdecl get_http_headers() noexcept; + SIGNALRCLIENT_API void __cdecl set_http_headers(const std::map& http_headers); private: +#ifdef USE_CPPRESTSDK web::http::client::http_client_config m_http_client_config; web::websockets::client::websocket_client_config m_websocket_client_config; - web::http::http_headers m_http_headers; #endif + std::map m_http_headers; }; } diff --git a/src/signalrclient/connection_impl.cpp b/src/signalrclient/connection_impl.cpp index 3d7f4a41..6700d1df 100644 --- a/src/signalrclient/connection_impl.cpp +++ b/src/signalrclient/connection_impl.cpp @@ -50,7 +50,9 @@ namespace signalr } else { +#ifdef USE_CPPRESTSDK m_http_client = std::unique_ptr(new default_http_client()); +#endif } } @@ -198,9 +200,8 @@ namespace signalr { if (!response.accessToken.empty()) { - auto headers = connection->m_signalr_client_config.get_http_headers(); - headers[_XPLATSTR("Authorization")] = utility::conversions::to_string_t("Bearer " + response.accessToken); - connection->m_signalr_client_config.set_http_headers(headers); + auto& headers = connection->m_signalr_client_config.get_http_headers(); + headers["Authorization"] = "Bearer " + response.accessToken; } connection->start_negotiate(response.url, redirect_count + 1, callback); return; diff --git a/src/signalrclient/negotiate.cpp b/src/signalrclient/negotiate.cpp index 8ee8f6a8..7eab07b6 100644 --- a/src/signalrclient/negotiate.cpp +++ b/src/signalrclient/negotiate.cpp @@ -32,11 +32,7 @@ namespace signalr // TODO: signalr_client_config http_request request; request.method = http_method::POST; - - for (auto& header : config.get_http_headers()) - { - request.headers.insert(std::make_pair(utility::conversions::to_utf8string(header.first), utility::conversions::to_utf8string(header.second))); - } + request.headers = config.get_http_headers(); client.send(negotiate_url, request, [callback](const http_response& http_response, std::exception_ptr exception) { diff --git a/src/signalrclient/signalr_client_config.cpp b/src/signalrclient/signalr_client_config.cpp index 161af510..bd4d25ea 100644 --- a/src/signalrclient/signalr_client_config.cpp +++ b/src/signalrclient/signalr_client_config.cpp @@ -42,15 +42,20 @@ namespace signalr { m_websocket_client_config = websocket_client_config; } +#endif + + const std::map& signalr_client_config::get_http_headers() const noexcept + { + return m_http_headers; + } - web::http::http_headers signalr_client_config::get_http_headers() const noexcept + std::map& signalr_client_config::get_http_headers() noexcept { return m_http_headers; } - void signalr_client_config::set_http_headers(const web::http::http_headers& http_headers) + void signalr_client_config::set_http_headers(const std::map& http_headers) { m_http_headers = http_headers; } -#endif } diff --git a/test/signalrclienttests/connection_impl_tests.cpp b/test/signalrclienttests/connection_impl_tests.cpp index 5cf6439a..6028f5d7 100644 --- a/test/signalrclienttests/connection_impl_tests.cpp +++ b/test/signalrclienttests/connection_impl_tests.cpp @@ -412,16 +412,12 @@ TEST(connection_impl_start, start_fails_if_negotiate_response_has_error) return http_response{ 200, response_body }; }); - pplx::task_completion_event tce; + auto connect_mre = manual_reset_event(); auto websocket_client = std::make_shared(); - websocket_client->set_connect_function([tce](const std::string&, std::function callback) + websocket_client->set_connect_function([&connect_mre](const std::string&, std::function callback) { - pplx::task(tce) - .then([callback](pplx::task prev_task) - { - prev_task.get(); - callback(nullptr); - }); + connect_mre.get(); + callback(nullptr); }); auto connection = @@ -444,7 +440,7 @@ TEST(connection_impl_start, start_fails_if_negotiate_response_has_error) ASSERT_STREQ("bad negotiate", e.what()); } - tce.set(); + connect_mre.set(); } TEST(connection_impl_start, start_fails_if_negotiate_response_does_not_have_websockets) @@ -924,16 +920,12 @@ TEST(connection_impl_start, start_fails_if_connect_request_times_out) auto http_client = create_test_http_client(); - pplx::task_completion_event tce; + auto connect_mre = manual_reset_event(); auto websocket_client = std::make_shared(); - websocket_client->set_connect_function([tce](const std::string&, std::function callback) + websocket_client->set_connect_function([&connect_mre](const std::string&, std::function callback) { - pplx::task(tce) - .then([callback](pplx::task prev_task) - { - prev_task.get(); - callback(nullptr); - }); + connect_mre.get(); + callback(nullptr); }); auto connection = @@ -956,7 +948,7 @@ TEST(connection_impl_start, start_fails_if_connect_request_times_out) ASSERT_STREQ("transport timed out when trying to connect", e.what()); } - tce.set(); + connect_mre.set(); } TEST(connection_impl_process_response, process_response_logs_messages) @@ -1277,11 +1269,8 @@ TEST(connection_impl_stop, stopping_disconnecting_connection_returns_canceled_ta /* connect function */ [&close_event](const std::string&, std::function callback) { callback(nullptr); }, /* close function */ [&close_event](std::function callback) { - pplx::create_task([&close_event, callback]() - { - close_event.wait(); - callback(nullptr); - }); + close_event.wait(); + callback(nullptr); }); auto connection = create_connection(websocket_client, writer, trace_level::state_changes); @@ -1699,7 +1688,7 @@ TEST(connection_impl_config, custom_headers_set_in_requests) signalr::signalr_client_config signalr_client_config{}; auto http_headers = signalr_client_config.get_http_headers(); - http_headers[_XPLATSTR("Answer")] = _XPLATSTR("42"); + http_headers["Answer"] = "42"; signalr_client_config.set_http_headers(http_headers); connection->set_client_config(signalr_client_config); diff --git a/test/signalrclienttests/logger_tests.cpp b/test/signalrclienttests/logger_tests.cpp index d3f5760a..df06450e 100644 --- a/test/signalrclienttests/logger_tests.cpp +++ b/test/signalrclienttests/logger_tests.cpp @@ -3,10 +3,10 @@ #include "stdafx.h" #include "test_utils.h" -#include "cpprest/asyncrt_utils.h" #include "trace_log_writer.h" #include "logger.h" #include "memory_log_writer.h" +#include using namespace signalr; TEST(logger_write, entry_added_if_trace_level_set) @@ -61,9 +61,11 @@ TEST(logger_write, entries_formatted_correctly) auto entry = log_entries[0]; - auto date_str = entry.substr(0, entry.find_first_of("Z") + 1); - auto date = utility::datetime::from_string(utility::conversions::to_string_t(date_str), utility::datetime::ISO_8601); - ASSERT_EQ(date_str, utility::conversions::to_utf8string(date.to_string(utility::datetime::ISO_8601))); + //0000-0-00T00:00:00Z [message ] message\n + std::regex r{ "[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z \\[.{12}\\] \\w{1,}\\n" }; + ASSERT_TRUE(std::regex_match(entry, r)); - ASSERT_EQ("[message ] message\n", remove_date_from_log_entry(entry)); + auto expected_message = std::string("[message ] message\n"); + auto pos = entry.find(expected_message); + ASSERT_EQ(expected_message.size(), entry.size() - pos); } diff --git a/test/signalrclienttests/websocket_transport_tests.cpp b/test/signalrclienttests/websocket_transport_tests.cpp index acef178e..2ea1afc2 100644 --- a/test/signalrclienttests/websocket_transport_tests.cpp +++ b/test/signalrclienttests/websocket_transport_tests.cpp @@ -67,7 +67,7 @@ TEST(websocket_transport_connect, connect_propagates_exceptions) } catch (const std::exception &e) { - ASSERT_EQ("connecting failed", e.what()); + ASSERT_STREQ("connecting failed", e.what()); } } @@ -127,7 +127,7 @@ TEST(websocket_transport_connect, cannot_call_connect_on_already_connected_trans } catch (const std::exception &e) { - ASSERT_EQ(_XPLATSTR("transport already connected"), utility::conversions::to_string_t(e.what())); + ASSERT_STREQ("transport already connected", e.what()); } } @@ -255,7 +255,7 @@ TEST(websocket_transport_disconnect, disconnect_logs_exceptions) auto client = std::make_shared(); client->set_close_function([](std::function callback) { - callback(std::make_exception_ptr(web::websockets::client::websocket_exception(_XPLATSTR("connection closing failed")))); + callback(std::make_exception_ptr(std::runtime_error("connection closing failed"))); }); std::shared_ptr writer(std::make_shared()); @@ -494,7 +494,7 @@ TEST(websocket_transport_receive_loop, error_callback_called_when_exception_thro TEST(websocket_transport_get_transport_type, get_transport_type_returns_websockets) { auto ws_transport = websocket_transport::create( - [](){ return std::make_shared(); }, + [](){ return std::make_shared(); }, logger(std::make_shared(), trace_level::none)); ASSERT_EQ(transport_type::websockets, ws_transport->get_transport_type()); From 28f14824bd4a217bc2709f96357cb3c7be6d6a49 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Mon, 13 Jan 2020 09:48:08 -0800 Subject: [PATCH 03/15] config --- include/signalrclient/hub_connection.h | 2 +- .../signalrclient/hub_connection_builder.h | 4 +- src/signalrclient/connection_impl.cpp | 6 +-- src/signalrclient/connection_impl.h | 4 +- .../default_websocket_client.cpp | 6 ++- src/signalrclient/hub_connection.cpp | 2 +- src/signalrclient/hub_connection_builder.cpp | 2 +- src/signalrclient/hub_connection_impl.cpp | 4 +- src/signalrclient/hub_connection_impl.h | 4 +- src/signalrclient/transport_factory.cpp | 5 +- src/signalrclient/transport_factory.h | 4 +- src/signalrclient/websocket_transport.cpp | 15 +++--- src/signalrclient/websocket_transport.h | 11 ++-- .../connection_impl_tests.cpp | 50 +++++++++++-------- .../hub_connection_tests.cpp | 4 +- .../websocket_transport_tests.cpp | 30 +++++------ 16 files changed, 82 insertions(+), 71 deletions(-) diff --git a/include/signalrclient/hub_connection.h b/include/signalrclient/hub_connection.h index 9eef359e..8cbebc59 100644 --- a/include/signalrclient/hub_connection.h +++ b/include/signalrclient/hub_connection.h @@ -55,7 +55,7 @@ namespace signalr explicit hub_connection(const std::string& url, trace_level trace_level = trace_level::all, std::shared_ptr log_writer = nullptr, std::shared_ptr http_client = nullptr, - std::function()> websocket_factory = nullptr); + std::function(const signalr_client_config&)> websocket_factory = nullptr); std::shared_ptr m_pImpl; }; diff --git a/include/signalrclient/hub_connection_builder.h b/include/signalrclient/hub_connection_builder.h index 956b2f1b..258ff530 100644 --- a/include/signalrclient/hub_connection_builder.h +++ b/include/signalrclient/hub_connection_builder.h @@ -28,7 +28,7 @@ namespace signalr SIGNALRCLIENT_API hub_connection_builder& with_logging(std::shared_ptr logger, trace_level logLevel); - SIGNALRCLIENT_API hub_connection_builder& with_websocket_factory(std::function()> factory); + SIGNALRCLIENT_API hub_connection_builder& with_websocket_factory(std::function(const signalr_client_config&)> factory); SIGNALRCLIENT_API hub_connection_builder& with_http_client(std::shared_ptr http_client); @@ -39,7 +39,7 @@ namespace signalr std::string m_url; std::shared_ptr m_logger; trace_level m_log_level; - std::function()> m_websocket_factory; + std::function(const signalr_client_config&)> m_websocket_factory; std::shared_ptr m_http_client; }; } diff --git a/src/signalrclient/connection_impl.cpp b/src/signalrclient/connection_impl.cpp index 6700d1df..df1986d8 100644 --- a/src/signalrclient/connection_impl.cpp +++ b/src/signalrclient/connection_impl.cpp @@ -33,7 +33,7 @@ namespace signalr } std::shared_ptr connection_impl::create(const std::string& url, trace_level trace_level, const std::shared_ptr& log_writer, - std::shared_ptr http_client, std::function()> websocket_factory) + std::shared_ptr http_client, std::function(const signalr_client_config&)> websocket_factory) { return std::shared_ptr(new connection_impl(url, trace_level, log_writer ? log_writer : std::make_shared(), http_client, websocket_factory)); @@ -57,7 +57,7 @@ namespace signalr } connection_impl::connection_impl(const std::string& url, trace_level trace_level, const std::shared_ptr& log_writer, - std::shared_ptr http_client, std::function()> websocket_factory) + std::shared_ptr http_client, std::function(const signalr_client_config&)> websocket_factory) : m_base_url(url), m_connection_state(connection_state::disconnected), m_logger(log_writer, trace_level), m_transport(nullptr), m_message_received([](const std::string&) noexcept {}), m_disconnected([]() noexcept {}) { @@ -75,7 +75,7 @@ namespace signalr if (websocket_factory == nullptr) { #ifdef USE_CPPRESTSDK - websocket_factory = []() { return std::make_shared(); }; + websocket_factory = [](const signalr_client_config& signalr_client_config) { return std::make_shared(signalr_client_config); }; #endif } diff --git a/src/signalrclient/connection_impl.h b/src/signalrclient/connection_impl.h index e1e72a56..900024f3 100644 --- a/src/signalrclient/connection_impl.h +++ b/src/signalrclient/connection_impl.h @@ -29,7 +29,7 @@ namespace signalr static std::shared_ptr create(const std::string& url, trace_level trace_level, const std::shared_ptr& log_writer); static std::shared_ptr create(const std::string& url, trace_level trace_level, const std::shared_ptr& log_writer, - std::shared_ptr http_client, std::function()> websocket_factory); + std::shared_ptr http_client, std::function(const signalr_client_config&)> websocket_factory); connection_impl(const connection_impl&) = delete; @@ -70,7 +70,7 @@ namespace signalr std::unique_ptr http_client, std::unique_ptr transport_factory); connection_impl(const std::string& url, trace_level trace_level, const std::shared_ptr& log_writer, - std::shared_ptr http_client, std::function()> websocket_factory); + std::shared_ptr http_client, std::function(const signalr_client_config&)> websocket_factory); void start_transport(const std::string& url, std::function, std::exception_ptr)> callback); void send_connect_request(const std::shared_ptr& transport, diff --git a/src/signalrclient/default_websocket_client.cpp b/src/signalrclient/default_websocket_client.cpp index e9a2fc3e..fed63a65 100644 --- a/src/signalrclient/default_websocket_client.cpp +++ b/src/signalrclient/default_websocket_client.cpp @@ -13,7 +13,11 @@ namespace signalr static web::websockets::client::websocket_client_config create_client_config(const signalr_client_config& signalr_client_config) noexcept { auto websocket_client_config = signalr_client_config.get_websocket_client_config(); - websocket_client_config.headers() = signalr_client_config.get_http_headers(); + auto websocket_headers = websocket_client_config.headers(); + for (auto& header : signalr_client_config.get_http_headers()) + { + websocket_headers.add(utility::conversions::to_string_t(header.first), utility::conversions::to_string_t(header.second)); + } return websocket_client_config; } diff --git a/src/signalrclient/hub_connection.cpp b/src/signalrclient/hub_connection.cpp index 1ae1a2d4..1e73b521 100644 --- a/src/signalrclient/hub_connection.cpp +++ b/src/signalrclient/hub_connection.cpp @@ -12,7 +12,7 @@ namespace signalr { hub_connection::hub_connection(const std::string& url, trace_level trace_level, std::shared_ptr log_writer, std::shared_ptr http_client, - std::function()> websocket_factory) + std::function(const signalr_client_config&)> websocket_factory) : m_pImpl(hub_connection_impl::create(url, trace_level, log_writer, http_client, websocket_factory)) {} diff --git a/src/signalrclient/hub_connection_builder.cpp b/src/signalrclient/hub_connection_builder.cpp index c09c575e..4be9a102 100644 --- a/src/signalrclient/hub_connection_builder.cpp +++ b/src/signalrclient/hub_connection_builder.cpp @@ -56,7 +56,7 @@ namespace signalr return *this; } - hub_connection_builder& hub_connection_builder::with_websocket_factory(std::function()> factory) + hub_connection_builder& hub_connection_builder::with_websocket_factory(std::function(const signalr_client_config&)> factory) { m_websocket_factory = factory; diff --git a/src/signalrclient/hub_connection_impl.cpp b/src/signalrclient/hub_connection_impl.cpp index 8e9b05a0..685a70ee 100644 --- a/src/signalrclient/hub_connection_impl.cpp +++ b/src/signalrclient/hub_connection_impl.cpp @@ -24,7 +24,7 @@ namespace signalr std::shared_ptr hub_connection_impl::create(const std::string& url, trace_level trace_level, const std::shared_ptr& log_writer, std::shared_ptr http_client, - std::function()> websocket_factory) + std::function(const signalr_client_config&)> websocket_factory) { auto connection = std::shared_ptr(new hub_connection_impl(url, trace_level, log_writer, http_client, websocket_factory)); @@ -35,7 +35,7 @@ namespace signalr hub_connection_impl::hub_connection_impl(const std::string& url, trace_level trace_level, const std::shared_ptr& log_writer, std::shared_ptr http_client, - std::function()> websocket_factory) + std::function(const signalr_client_config&)> websocket_factory) : m_connection(connection_impl::create(url, trace_level, log_writer, http_client, websocket_factory)), m_logger(log_writer, trace_level), m_callback_manager(signalr::value(std::map { { std::string("error"), std::string("connection went out of scope before invocation result was received") } })), diff --git a/src/signalrclient/hub_connection_impl.h b/src/signalrclient/hub_connection_impl.h index 5af3f438..644a2bc1 100644 --- a/src/signalrclient/hub_connection_impl.h +++ b/src/signalrclient/hub_connection_impl.h @@ -25,7 +25,7 @@ namespace signalr public: static std::shared_ptr create(const std::string& url, trace_level trace_level, const std::shared_ptr& log_writer, std::shared_ptr http_client, - std::function()> websocket_factory); + std::function(const signalr_client_config&)> websocket_factory); hub_connection_impl(const hub_connection_impl&) = delete; hub_connection_impl& operator=(const hub_connection_impl&) = delete; @@ -47,7 +47,7 @@ namespace signalr private: hub_connection_impl(const std::string& url, trace_level trace_level, const std::shared_ptr& log_writer, std::shared_ptr http_client, - std::function()> websocket_factory); + std::function(const signalr_client_config&)> websocket_factory); std::shared_ptr m_connection; logger m_logger; diff --git a/src/signalrclient/transport_factory.cpp b/src/signalrclient/transport_factory.cpp index e18dfaf7..2bb1180b 100644 --- a/src/signalrclient/transport_factory.cpp +++ b/src/signalrclient/transport_factory.cpp @@ -9,17 +9,16 @@ namespace signalr { - transport_factory::transport_factory(std::shared_ptr http_client, std::function()> websocket_factory) + transport_factory::transport_factory(std::shared_ptr http_client, std::function(const signalr_client_config&)> websocket_factory) : m_http_client(http_client), m_websocket_factory(websocket_factory) {} std::shared_ptr transport_factory::create_transport(transport_type transport_type, const logger& logger, const signalr_client_config& signalr_client_config) { - // TODO: Handle config with transport(s) if (transport_type == signalr::transport_type::websockets) { - return websocket_transport::create(m_websocket_factory, + return websocket_transport::create(m_websocket_factory, signalr_client_config, logger); } diff --git a/src/signalrclient/transport_factory.h b/src/signalrclient/transport_factory.h index 17644a29..230a9037 100644 --- a/src/signalrclient/transport_factory.h +++ b/src/signalrclient/transport_factory.h @@ -16,7 +16,7 @@ namespace signalr class transport_factory { public: - transport_factory(std::shared_ptr http_client, std::function()> websocket_factory); + transport_factory(std::shared_ptr http_client, std::function(const signalr_client_config&)> websocket_factory); virtual std::shared_ptr create_transport(transport_type transport_type, const logger& logger, const signalr_client_config& signalr_client_config); @@ -24,6 +24,6 @@ namespace signalr virtual ~transport_factory(); private: std::shared_ptr m_http_client; - std::function()> m_websocket_factory; + std::function(const signalr_client_config&)> m_websocket_factory; }; } diff --git a/src/signalrclient/websocket_transport.cpp b/src/signalrclient/websocket_transport.cpp index 3cc55376..fcbf025f 100644 --- a/src/signalrclient/websocket_transport.cpp +++ b/src/signalrclient/websocket_transport.cpp @@ -10,17 +10,18 @@ namespace signalr { - std::shared_ptr websocket_transport::create(const std::function()>& websocket_client_factory, - const logger& logger) + std::shared_ptr websocket_transport::create(const std::function(const signalr_client_config&)>& websocket_client_factory, + const signalr_client_config& signalr_client_config, const logger& logger) { return std::shared_ptr( - new websocket_transport(websocket_client_factory, logger)); + new websocket_transport(websocket_client_factory, signalr_client_config, logger)); } - websocket_transport::websocket_transport(const std::function()>& websocket_client_factory, - const logger& logger) + websocket_transport::websocket_transport(const std::function(const signalr_client_config&)>& websocket_client_factory, + const signalr_client_config& signalr_client_config, const logger& logger) : transport(logger), m_websocket_client_factory(websocket_client_factory), m_close_callback([](std::exception_ptr) {}), - m_process_response_callback([](std::string, std::exception_ptr) {}), m_receive_loop_cts(std::make_shared()) + m_process_response_callback([](std::string, std::exception_ptr) {}), m_receive_loop_cts(std::make_shared()), + m_signalr_client_config(signalr_client_config) { // we use this cts to check if the receive loop is running so it should be // initially canceled to indicate that the receive loop is not running @@ -161,7 +162,7 @@ namespace signalr std::string("[websocket transport] connecting to: ") .append(url)); - auto websocket_client = m_websocket_client_factory(); + auto websocket_client = m_websocket_client_factory(m_signalr_client_config); { std::lock_guard client_lock(m_websocket_client_lock); diff --git a/src/signalrclient/websocket_transport.h b/src/signalrclient/websocket_transport.h index 35bf8cf7..7f627fac 100644 --- a/src/signalrclient/websocket_transport.h +++ b/src/signalrclient/websocket_transport.h @@ -13,8 +13,8 @@ namespace signalr class websocket_transport : public transport, public std::enable_shared_from_this { public: - static std::shared_ptr create(const std::function()>& websocket_client_factory, - const logger& logger); + static std::shared_ptr create(const std::function(const signalr_client_config&)>& websocket_client_factory, + const signalr_client_config& signalr_client_config, const logger& logger); ~websocket_transport(); @@ -33,15 +33,16 @@ namespace signalr void on_receive(std::function) override; private: - websocket_transport(const std::function()>& websocket_client_factory, - const logger& logger); + websocket_transport(const std::function(const signalr_client_config&)>& websocket_client_factory, + const signalr_client_config& signalr_client_config, const logger& logger); - std::function()> m_websocket_client_factory; + std::function(const signalr_client_config&)> m_websocket_client_factory; std::shared_ptr m_websocket_client; std::mutex m_websocket_client_lock; std::mutex m_start_stop_lock; std::function m_process_response_callback; std::function m_close_callback; + signalr_client_config m_signalr_client_config; std::shared_ptr m_receive_loop_cts; diff --git a/test/signalrclienttests/connection_impl_tests.cpp b/test/signalrclienttests/connection_impl_tests.cpp index 6028f5d7..cbdeb839 100644 --- a/test/signalrclienttests/connection_impl_tests.cpp +++ b/test/signalrclienttests/connection_impl_tests.cpp @@ -17,7 +17,7 @@ static std::shared_ptr create_connection(std::shared_ptr log_writer = std::make_shared(), trace_level trace_level = trace_level::all) { return connection_impl::create(create_uri(), trace_level, log_writer, create_test_http_client(), - [websocket_client]() { return websocket_client; }); + [websocket_client](const signalr_client_config&) { return websocket_client; }); } TEST(connection_impl_connection_state, initial_connection_state_is_disconnected) @@ -137,7 +137,8 @@ TEST(connection_impl_start, throws_for_invalid_uri) auto websocket_client = create_test_websocket_client(); - auto connection = connection_impl::create(":1\t ä bad_uri&a=b", trace_level::errors, writer, create_test_http_client(), [websocket_client]() { return websocket_client; }); + auto connection = connection_impl::create(":1\t ä bad_uri&a=b", trace_level::errors, writer, create_test_http_client(), + [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -171,7 +172,8 @@ TEST(connection_impl_start, start_sets_id_query_string) callback(std::make_exception_ptr(std::runtime_error("connecting failed"))); }); - auto connection = connection_impl::create(create_uri(""), trace_level::errors, writer, create_test_http_client(), [websocket_client]() { return websocket_client; }); + auto connection = connection_impl::create(create_uri(""), trace_level::errors, writer, create_test_http_client(), + [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -205,7 +207,8 @@ TEST(connection_impl_start, start_appends_id_query_string) callback(std::make_exception_ptr(std::runtime_error("connecting failed"))); }); - auto connection = connection_impl::create(create_uri("a=b&c=d"), trace_level::errors, writer, create_test_http_client(), [websocket_client]() { return websocket_client; }); + auto connection = connection_impl::create(create_uri("a=b&c=d"), trace_level::errors, writer, create_test_http_client(), + [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -379,7 +382,7 @@ TEST(connection_impl_start, start_fails_if_negotiate_request_fails) auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -422,7 +425,7 @@ TEST(connection_impl_start, start_fails_if_negotiate_response_has_error) auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -461,7 +464,7 @@ TEST(connection_impl_start, start_fails_if_negotiate_response_does_not_have_webs auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -498,7 +501,7 @@ TEST(connection_impl_start, start_fails_if_negotiate_response_does_not_have_tran auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -535,7 +538,7 @@ TEST(connection_impl_start, start_fails_if_negotiate_response_is_invalid) auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -585,7 +588,7 @@ TEST(connection_impl_start, negotiate_follows_redirect) auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -634,7 +637,7 @@ TEST(connection_impl_start, negotiate_redirect_uses_accessToken) auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -668,7 +671,7 @@ TEST(connection_impl_start, negotiate_fails_after_too_many_redirects) auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -706,7 +709,7 @@ TEST(connection_impl_start, negotiate_fails_if_ProtocolVersion_in_response) auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -753,7 +756,7 @@ TEST(connection_impl_start, negotiate_redirect_does_not_overwrite_url) auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -809,7 +812,8 @@ TEST(connection_impl_start, negotiate_redirect_uses_own_query_string) return http_response{ 200, response_body }; }); - auto connection = connection_impl::create(create_uri("a=b&c=d"), trace_level::errors, writer, std::move(http_client), [websocket_client]() { return websocket_client; }); + auto connection = connection_impl::create(create_uri("a=b&c=d"), trace_level::errors, writer, std::move(http_client), + [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -856,7 +860,8 @@ TEST(connection_impl_start, negotiate_with_negotiateVersion_uses_connectionToken return http_response{ 200, response_body }; }); - auto connection = connection_impl::create(create_uri(), trace_level::errors, writer, std::move(http_client), [websocket_client]() { return websocket_client; }); + auto connection = connection_impl::create(create_uri(), trace_level::errors, writer, std::move(http_client), + [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -901,7 +906,8 @@ TEST(connection_impl_start, correct_connection_id_returned_with_negotiateVersion return http_response{ 200, response_body }; }); - auto connection = connection_impl::create(create_uri(), trace_level::errors, writer, std::move(http_client), [websocket_client]() { return websocket_client; }); + auto connection = connection_impl::create(create_uri(), trace_level::errors, writer, std::move(http_client), + [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -930,7 +936,7 @@ TEST(connection_impl_start, start_fails_if_connect_request_times_out) auto connection = connection_impl::create(create_uri(), trace_level::messages, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -1461,7 +1467,7 @@ TEST(connection_impl_stop, stop_cancels_ongoing_start_request) auto writer = std::shared_ptr{ std::make_shared() }; auto connection = connection_impl::create(create_uri(), trace_level::all, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -1518,7 +1524,7 @@ TEST(connection_impl_stop, DISABLED_ongoing_start_request_canceled_if_connection auto writer = std::shared_ptr{ std::make_shared() }; auto connection = connection_impl::create(create_uri(), trace_level::all, writer, - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) @@ -1684,7 +1690,7 @@ TEST(connection_impl_config, custom_headers_set_in_requests) auto connection = connection_impl::create(create_uri(), trace_level::state_changes, - writer, std::move(http_client), [websocket_client]() { return websocket_client; }); + writer, std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); signalr::signalr_client_config signalr_client_config{}; auto http_headers = signalr_client_config.get_http_headers(); @@ -1851,7 +1857,7 @@ TEST(connection_id, connection_id_reset_when_starting_connection) auto connection = connection_impl::create(create_uri(), trace_level::none, std::make_shared(), - std::move(http_client), [websocket_client]() { return websocket_client; }); + std::move(http_client), [websocket_client](const signalr_client_config&) { return websocket_client; }); auto mre = manual_reset_event(); connection->start([&mre](std::exception_ptr exception) diff --git a/test/signalrclienttests/hub_connection_tests.cpp b/test/signalrclienttests/hub_connection_tests.cpp index 02b0cb36..3391f50f 100644 --- a/test/signalrclienttests/hub_connection_tests.cpp +++ b/test/signalrclienttests/hub_connection_tests.cpp @@ -18,7 +18,7 @@ hub_connection create_hub_connection(std::shared_ptr websocket return hub_connection_builder::create(create_uri()) .with_logging(log_writer, trace_level) .with_http_client(create_test_http_client()) - .with_websocket_factory([websocket_client]() { return websocket_client; }) + .with_websocket_factory([websocket_client](const signalr_client_config&) { return websocket_client; }) .build(); } @@ -109,7 +109,7 @@ TEST(url, negotiate_appended_to_url) auto hub_connection = hub_connection_builder::create(base_url) .with_logging(std::make_shared(), trace_level::none) .with_http_client(http_client) - .with_websocket_factory([]() { return create_test_websocket_client(); }) + .with_websocket_factory([](const signalr_client_config&) { return create_test_websocket_client(); }) .build(); auto mre = manual_reset_event(); diff --git a/test/signalrclienttests/websocket_transport_tests.cpp b/test/signalrclienttests/websocket_transport_tests.cpp index 2ea1afc2..8ee7f5b9 100644 --- a/test/signalrclienttests/websocket_transport_tests.cpp +++ b/test/signalrclienttests/websocket_transport_tests.cpp @@ -25,7 +25,7 @@ TEST(websocket_transport_connect, connect_connects_and_starts_receive_loop) std::shared_ptr writer(std::make_shared()); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(writer, trace_level::info)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&) { return client; }, signalr_client_config{}, logger(writer, trace_level::info)); auto mre = manual_reset_event(); ws_transport->start("ws://fakeuri.org/connect?param=42", transfer_format::text, [&mre](std::exception_ptr exception) @@ -53,7 +53,7 @@ TEST(websocket_transport_connect, connect_propagates_exceptions) callback(std::make_exception_ptr(std::runtime_error("connecting failed"))); }); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); try { @@ -80,7 +80,7 @@ TEST(websocket_transport_connect, connect_logs_exceptions) }); std::shared_ptr writer(std::make_shared()); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(writer, trace_level::errors)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(writer, trace_level::errors)); auto mre = manual_reset_event(); ws_transport->start("ws://fakeuri.org", transfer_format::text, [&mre](std::exception_ptr exception) @@ -107,7 +107,7 @@ TEST(websocket_transport_connect, connect_logs_exceptions) TEST(websocket_transport_connect, cannot_call_connect_on_already_connected_transport) { auto client = std::make_shared(); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); auto mre = manual_reset_event(); ws_transport->start("ws://fakeuri.org", transfer_format::text, [&mre](std::exception_ptr exception) @@ -134,7 +134,7 @@ TEST(websocket_transport_connect, cannot_call_connect_on_already_connected_trans TEST(websocket_transport_connect, can_connect_after_disconnecting) { auto client = std::make_shared(); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); auto mre = manual_reset_event(); ws_transport->start("ws://fakeuri.org", transfer_format::text, [&mre](std::exception_ptr exception) @@ -168,7 +168,7 @@ TEST(websocket_transport_send, send_creates_and_sends_websocket_messages) callback(nullptr); }); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); auto mre = manual_reset_event(); ws_transport->start("ws://url", transfer_format::text, [&mre](std::exception_ptr exception) @@ -198,7 +198,7 @@ TEST(websocket_transport_disconnect, disconnect_closes_websocket) callback(nullptr); }); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); auto mre = manual_reset_event(); ws_transport->start("ws://url", transfer_format::text, [&mre](std::exception_ptr exception) @@ -227,7 +227,7 @@ TEST(websocket_transport_stop, propogates_exception_from_close) callback(std::make_exception_ptr(std::exception())); }); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); auto mre = manual_reset_event(); ws_transport->start("ws://url", transfer_format::text, [&mre](std::exception_ptr exception) @@ -260,7 +260,7 @@ TEST(websocket_transport_disconnect, disconnect_logs_exceptions) std::shared_ptr writer(std::make_shared()); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(writer, trace_level::errors)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(writer, trace_level::errors)); auto mre = manual_reset_event(); ws_transport->start("ws://url", transfer_format::text, [&mre](std::exception_ptr exception) @@ -305,7 +305,7 @@ TEST(websocket_transport_disconnect, receive_not_called_after_disconnect) callback(nullptr); }); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); auto mre = manual_reset_event(); ws_transport->start("ws://fakeuri.org", transfer_format::text, [&mre](std::exception_ptr) @@ -350,7 +350,7 @@ TEST(websocket_transport_disconnect, disconnect_is_no_op_if_transport_not_starte callback(nullptr); }); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); auto mre = manual_reset_event(); ws_transport->stop([&mre](std::exception_ptr exception) @@ -379,7 +379,7 @@ void receive_loop_logs_exception_runner(const T& e, const std::string& expected_ auto client = std::make_shared(); std::shared_ptr writer(std::make_shared()); - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(writer, trace_level)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&) { return client; }, signalr_client_config{}, logger(writer, trace_level)); auto mre = manual_reset_event(); ws_transport->start("ws://url", transfer_format::text, [&mre](std::exception_ptr exception) @@ -429,7 +429,7 @@ TEST(websocket_transport_receive_loop, process_response_callback_called_when_mes process_response_event->cancel(); }; - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); ws_transport->on_receive(process_response); auto mre = manual_reset_event(); @@ -473,7 +473,7 @@ TEST(websocket_transport_receive_loop, error_callback_called_when_exception_thro error_event->cancel(); }; - auto ws_transport = websocket_transport::create([&](){ return client; }, logger(std::make_shared(), trace_level::none)); + auto ws_transport = websocket_transport::create([&](const signalr_client_config&){ return client; }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); ws_transport->on_close(error_callback); auto mre = manual_reset_event(); @@ -494,7 +494,7 @@ TEST(websocket_transport_receive_loop, error_callback_called_when_exception_thro TEST(websocket_transport_get_transport_type, get_transport_type_returns_websockets) { auto ws_transport = websocket_transport::create( - [](){ return std::make_shared(); }, + [](const signalr_client_config&){ return std::make_shared(); }, signalr_client_config{}, logger(std::make_shared(), trace_level::none)); ASSERT_EQ(transport_type::websockets, ws_transport->get_transport_type()); From f57e9d0dacbece7f30cb52b29f05b3809baf4341 Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 09:59:37 -0800 Subject: [PATCH 04/15] nit --- src/signalrclient/default_websocket_client.cpp | 2 +- test/signalrclienttests/logger_tests.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/signalrclient/default_websocket_client.cpp b/src/signalrclient/default_websocket_client.cpp index fed63a65..fe50996c 100644 --- a/src/signalrclient/default_websocket_client.cpp +++ b/src/signalrclient/default_websocket_client.cpp @@ -13,7 +13,7 @@ namespace signalr static web::websockets::client::websocket_client_config create_client_config(const signalr_client_config& signalr_client_config) noexcept { auto websocket_client_config = signalr_client_config.get_websocket_client_config(); - auto websocket_headers = websocket_client_config.headers(); + auto& websocket_headers = websocket_client_config.headers(); for (auto& header : signalr_client_config.get_http_headers()) { websocket_headers.add(utility::conversions::to_string_t(header.first), utility::conversions::to_string_t(header.second)); diff --git a/test/signalrclienttests/logger_tests.cpp b/test/signalrclienttests/logger_tests.cpp index df06450e..da70bdc4 100644 --- a/test/signalrclienttests/logger_tests.cpp +++ b/test/signalrclienttests/logger_tests.cpp @@ -62,7 +62,7 @@ TEST(logger_write, entries_formatted_correctly) auto entry = log_entries[0]; //0000-0-00T00:00:00Z [message ] message\n - std::regex r{ "[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z \\[.{12}\\] \\w{1,}\\n" }; + std::regex r{ "[\\d]{4}-[\\d]{2}-[\\d]{2}T[\\d]{2}:[\\d]{2}:[\\d]{2}Z \\[.{12}\\] \\w{1,}\\n" }; ASSERT_TRUE(std::regex_match(entry, r)); auto expected_message = std::string("[message ] message\n"); From 573367375032efeabb6e8b6ca9fe2d8a2eda512c Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 10:14:55 -0800 Subject: [PATCH 05/15] yml --- .azure/default-build.yml | 3 ++- azure-pipelines.yml | 27 ++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/.azure/default-build.yml b/.azure/default-build.yml index c7c29a64..6d39c98c 100644 --- a/.azure/default-build.yml +++ b/.azure/default-build.yml @@ -7,6 +7,7 @@ parameters: timeoutInMinutes: 60 cMakeRunArgs: '' configuration: 'Release' + useCppRestSDK: true gtestFlags: '--gtest_output=xml:$(Build.ArtifactStagingDirectory)/testOut/' jobs: @@ -43,7 +44,7 @@ jobs: - task: CMake@1 inputs: - cmakeArgs: .. ${{ parameters.cMakeRunArgs }} -DCMAKE_TOOLCHAIN_FILE=../submodules/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=${{ parameters.configuration }} -DUSE_CPPRESTSDK=true + cmakeArgs: .. ${{ parameters.cMakeRunArgs }} -DCMAKE_TOOLCHAIN_FILE=../submodules/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=${{ parameters.configuration }} -DUSE_CPPRESTSDK=${{ parameters.useCppRestSDK }} workingDirectory: 'build.${{ parameters.configuration }}' displayName: Create build files - task: CMake@1 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 53bff5f1..dbabeb67 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -30,7 +30,8 @@ stages: - template: .azure/default-build.yml parameters: agentOs: Windows - jobName: Windows_Build_Test + jobName: Windows_Build_Test_With_CppRestSDK + useCppRestSDK: true cMakeRunArgs: '-A x64' beforeBuild: # check if vcpkg exists on the machine before trying to build it @@ -57,7 +58,8 @@ stages: - template: .azure/default-build.yml parameters: agentOs: macOs - jobName: Mac_Build_Test + jobName: Mac_Build_Test_With_CppRestSDK + useCppRestSDK: true beforeBuild: # XCode 11 doesn't play nicely with gcc, workaround by using XCode 10. We can try updating to a newer XCode in the future # Once the problem has been resolved @@ -73,12 +75,31 @@ stages: - template: .azure/default-build.yml parameters: agentOs: Linux - jobName: Linux_Build_Test + jobName: Linux_Build_Test_With_CppRestSDK + useCppRestSDK: true beforeBuild: - script: sudo vcpkg install cpprestsdk boost-system boost-chrono boost-thread --vcpkg-root ./submodules/vcpkg condition: ne(variables.CACHE_RESTORED, 'true') displayName: vcpkg install dependencies + - template: .azure/default-build.yml + parameters: + agentOs: Linux + jobName: Linux_Build_Test + useCppRestSDK: false + + - template: .azure/default-build.yml + parameters: + agentOs: Windows + jobName: Windows_Build_Test + useCppRestSDK: false + + - template: .azure/default-build.yml + parameters: + agentOs: macOs + jobName: Mac_Build_Test + useCppRestSDK: false + # Publish to the BAR - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - template: /eng/common/templates/job/publish-build-assets.yml From 5bd0e90671032c0e86ce3cca10735d5523253869 Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 10:34:36 -0800 Subject: [PATCH 06/15] display name --- .azure/default-build.yml | 2 +- CMakeLists.txt | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.azure/default-build.yml b/.azure/default-build.yml index 6d39c98c..e1f6a1f5 100644 --- a/.azure/default-build.yml +++ b/.azure/default-build.yml @@ -14,7 +14,7 @@ jobs: - template: /eng/common/templates/job/job.yml parameters: name: ${{ coalesce(parameters.jobName, parameters.agentOs) }} - displayName: ${{ coalesce(parameters.jobDisplayName, parameters.agentOs) }} + displayName: ${{ coalesce(parameters.jobName, parameters.agentOs) }} dependsOn: ${{ parameters.dependsOn }} timeoutInMinutes: ${{ parameters.timeoutInMinutes }} ${{ if and(eq(variables['System.TeamProject'], 'internal'), eq(parameters.agentOs, 'Windows')) }}: diff --git a/CMakeLists.txt b/CMakeLists.txt index 776b2f25..33ff7340 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,14 +32,16 @@ include_directories (include) # We need this for testing, but we might just add all the files to the test project manually set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) -if(NOT WIN32) - if(APPLE) - file(GLOB OPENSSL_ROOT_DIR /usr/local/Cellar/openssl/*) - list(REVERSE OPENSSL_ROOT_DIR) +if(USE_CPPRESTSDK) + if(NOT WIN32) + if(APPLE) + file(GLOB OPENSSL_ROOT_DIR /usr/local/Cellar/openssl/*) + list(REVERSE OPENSSL_ROOT_DIR) + endif() + + find_package(OpenSSL 1.0.0 REQUIRED) + find_package(Boost REQUIRED COMPONENTS system thread chrono) endif() - - find_package(OpenSSL 1.0.0 REQUIRED) - find_package(Boost REQUIRED COMPONENTS system thread chrono) endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) From 9de54dd756ad523a27dbaa8fd31df5ab3719e16b Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 10:46:30 -0800 Subject: [PATCH 07/15] fixups --- azure-pipelines.yml | 6 ++++++ src/signalrclient/negotiation_response.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index dbabeb67..387a8eb3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -93,12 +93,18 @@ stages: agentOs: Windows jobName: Windows_Build_Test useCppRestSDK: false + cMakeRunArgs: '-A x64' - template: .azure/default-build.yml parameters: agentOs: macOs jobName: Mac_Build_Test useCppRestSDK: false + beforeBuild: + # XCode 11 doesn't play nicely with gcc, workaround by using XCode 10. We can try updating to a newer XCode in the future + # Once the problem has been resolved + - script: sudo xcode-select --switch /Applications/Xcode_10.3.app + - script: brew install gcc # Publish to the BAR - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: diff --git a/src/signalrclient/negotiation_response.h b/src/signalrclient/negotiation_response.h index d727f390..c28c157f 100644 --- a/src/signalrclient/negotiation_response.h +++ b/src/signalrclient/negotiation_response.h @@ -3,6 +3,8 @@ #pragma once +#include + namespace signalr { struct available_transport From 8fe0b6033a70a38ec4ff973306a5c10c7e9f77bc Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 10:56:35 -0800 Subject: [PATCH 08/15] progress --- .azure/default-build.yml | 1 + azure-pipelines.yml | 2 ++ src/signalrclient/negotiation_response.h | 1 + 3 files changed, 4 insertions(+) diff --git a/.azure/default-build.yml b/.azure/default-build.yml index e1f6a1f5..49e31559 100644 --- a/.azure/default-build.yml +++ b/.azure/default-build.yml @@ -39,6 +39,7 @@ jobs: path: ./submodules/vcpkg/installed cacheHitVar: CACHE_RESTORED displayName: Cache vcpkg packages + condition: eq( '${{ parameters.useCppRestSDK }}', 'true' ) - ${{ parameters.beforeBuild }} diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 387a8eb3..996232ef 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -64,7 +64,9 @@ stages: # XCode 11 doesn't play nicely with gcc, workaround by using XCode 10. We can try updating to a newer XCode in the future # Once the problem has been resolved - script: sudo xcode-select --switch /Applications/Xcode_10.3.app + displayName: xcode-select - script: brew install gcc + displayName: Install gcc - bash: "./submodules/vcpkg/bootstrap-vcpkg.sh" condition: ne(variables.CACHE_RESTORED, 'true') displayName: Bootstrap vcpkg diff --git a/src/signalrclient/negotiation_response.h b/src/signalrclient/negotiation_response.h index c28c157f..de68db09 100644 --- a/src/signalrclient/negotiation_response.h +++ b/src/signalrclient/negotiation_response.h @@ -4,6 +4,7 @@ #pragma once #include +#include namespace signalr { From 0c8bd22fb6679e4b9c35dd67c3bb9d65478c5ff1 Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 3 Feb 2020 11:26:32 -0800 Subject: [PATCH 09/15] fix --- include/signalrclient/signalr_client_config.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/signalrclient/signalr_client_config.h b/include/signalrclient/signalr_client_config.h index 55ac3b5f..ccc3f2ff 100644 --- a/include/signalrclient/signalr_client_config.h +++ b/include/signalrclient/signalr_client_config.h @@ -10,6 +10,7 @@ #include "_exports.h" #include +#include namespace signalr { From b13db26151fff311d9f66098d4a3ff52df6ae0cf Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 13:18:46 -0800 Subject: [PATCH 10/15] cdecl --- azure-pipelines.yml | 5 +++++ include/signalrclient/_exports.h | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 996232ef..ebb670a4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -106,13 +106,18 @@ stages: # XCode 11 doesn't play nicely with gcc, workaround by using XCode 10. We can try updating to a newer XCode in the future # Once the problem has been resolved - script: sudo xcode-select --switch /Applications/Xcode_10.3.app + displayName: xcode-select - script: brew install gcc + displayName: Install gcc # Publish to the BAR - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - template: /eng/common/templates/job/publish-build-assets.yml parameters: dependsOn: + - Windows_Build_Test_With_CppRestSDK + - Mac_Build_Test_With_CppRestSDK + - Linux_Build_Test_With_CppRestSDK - Windows_Build_Test - Mac_Build_Test - Linux_Build_Test diff --git a/include/signalrclient/_exports.h b/include/signalrclient/_exports.h index c9e9fadb..c6432913 100644 --- a/include/signalrclient/_exports.h +++ b/include/signalrclient/_exports.h @@ -11,4 +11,14 @@ #else #define SIGNALRCLIENT_API __declspec(dllimport) #endif // SIGNALRCLIENT_EXPORTS -#endif // NO_SIGNALRCLIENT_EXPORTS \ No newline at end of file +#endif // NO_SIGNALRCLIENT_EXPORTS + +#ifndef _WIN32 +#ifndef __cdecl +#ifdef (cdecl) +#define __cdecl __attribute__((cdecl)) +#else +#define __cdecl +#endif // cdecl +#endif // !__cdecl +#endif // _WIN32 \ No newline at end of file From 614cbd450d2de0e15c1d1a66b90a10b2d0169c7f Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 13:24:35 -0800 Subject: [PATCH 11/15] typo --- include/signalrclient/_exports.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/signalrclient/_exports.h b/include/signalrclient/_exports.h index c6432913..79a5fa0d 100644 --- a/include/signalrclient/_exports.h +++ b/include/signalrclient/_exports.h @@ -15,7 +15,7 @@ #ifndef _WIN32 #ifndef __cdecl -#ifdef (cdecl) +#ifdef cdecl #define __cdecl __attribute__((cdecl)) #else #define __cdecl From 67ebdbdd004f502067411a002408688cd9edffa5 Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 15:11:20 -0800 Subject: [PATCH 12/15] fix test --- test/signalrclienttests/connection_impl_tests.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/signalrclienttests/connection_impl_tests.cpp b/test/signalrclienttests/connection_impl_tests.cpp index cbdeb839..eaec6b3c 100644 --- a/test/signalrclienttests/connection_impl_tests.cpp +++ b/test/signalrclienttests/connection_impl_tests.cpp @@ -927,11 +927,13 @@ TEST(connection_impl_start, start_fails_if_connect_request_times_out) auto http_client = create_test_http_client(); auto connect_mre = manual_reset_event(); + auto wait_connect_mre = manual_reset_event(); auto websocket_client = std::make_shared(); - websocket_client->set_connect_function([&connect_mre](const std::string&, std::function callback) + websocket_client->set_connect_function([&connect_mre, &wait_connect_mre](const std::string&, std::function callback) { connect_mre.get(); callback(nullptr); + wait_connect_mre.set(); }); auto connection = @@ -955,6 +957,7 @@ TEST(connection_impl_start, start_fails_if_connect_request_times_out) } connect_mre.set(); + wait_connect_mre.get(); } TEST(connection_impl_process_response, process_response_logs_messages) From d922e313609fe91a332c0348174e52781926bcc0 Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 15:20:26 -0800 Subject: [PATCH 13/15] update vcpkg --- submodules/vcpkg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/vcpkg b/submodules/vcpkg index b9f30b71..85bf9d9d 160000 --- a/submodules/vcpkg +++ b/submodules/vcpkg @@ -1 +1 @@ -Subproject commit b9f30b7197fd5874aa919e85ce6fabafa790a3c4 +Subproject commit 85bf9d9d792e379e973d66c8af9f39d65d1d6d42 From 8a1f96b462dc843be9ad8f9b2819630ec6fd6e01 Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 3 Feb 2020 15:25:19 -0800 Subject: [PATCH 14/15] different commit --- submodules/vcpkg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/vcpkg b/submodules/vcpkg index 85bf9d9d..586bee9b 160000 --- a/submodules/vcpkg +++ b/submodules/vcpkg @@ -1 +1 @@ -Subproject commit 85bf9d9d792e379e973d66c8af9f39d65d1d6d42 +Subproject commit 586bee9bcd30993033a3590f7e84ef1b648cad10 From f1f5ea8bbcaa00ac7e4c4895d1b0c1a267c421ec Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Tue, 4 Feb 2020 15:57:54 -0800 Subject: [PATCH 15/15] Fb --- test/signalrclienttests/logger_tests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/signalrclienttests/logger_tests.cpp b/test/signalrclienttests/logger_tests.cpp index da70bdc4..9c3f6916 100644 --- a/test/signalrclienttests/logger_tests.cpp +++ b/test/signalrclienttests/logger_tests.cpp @@ -62,7 +62,7 @@ TEST(logger_write, entries_formatted_correctly) auto entry = log_entries[0]; //0000-0-00T00:00:00Z [message ] message\n - std::regex r{ "[\\d]{4}-[\\d]{2}-[\\d]{2}T[\\d]{2}:[\\d]{2}:[\\d]{2}Z \\[.{12}\\] \\w{1,}\\n" }; + std::regex r{ "[\\d]{4}-[\\d]{2}-[\\d]{2}T[\\d]{2}:[\\d]{2}:[\\d]{2}Z \\[message \\] message\\n" }; ASSERT_TRUE(std::regex_match(entry, r)); auto expected_message = std::string("[message ] message\n");