diff --git a/xplat/Sonar/SonarClient.cpp b/xplat/Sonar/SonarClient.cpp index 9ac2fe9ca..d86beeea3 100644 --- a/xplat/Sonar/SonarClient.cpp +++ b/xplat/Sonar/SonarClient.cpp @@ -31,8 +31,9 @@ static SonarClient* kInstance; using folly::dynamic; void SonarClient::init(SonarInitConfig config) { + auto state = std::make_shared(); kInstance = - new SonarClient(std::make_unique(std::move(config))); + new SonarClient(std::make_unique(std::move(config), state), state); } SonarClient* SonarClient::instance() { diff --git a/xplat/Sonar/SonarClient.h b/xplat/Sonar/SonarClient.h index 49f90b688..79d0a8a46 100644 --- a/xplat/Sonar/SonarClient.h +++ b/xplat/Sonar/SonarClient.h @@ -39,9 +39,8 @@ class SonarClient : public SonarWebSocket::Callbacks { /** Only public for testing */ - SonarClient(std::unique_ptr socket) - : socket_(std::move(socket)) { - sonarState_ = std::make_unique(); + SonarClient(std::unique_ptr socket, std::shared_ptr state) + : socket_(std::move(socket)), sonarState_(state) { auto step = sonarState_->start("Create client"); socket_->setCallbacks(this); step->complete(); @@ -92,7 +91,7 @@ class SonarClient : public SonarWebSocket::Callbacks { std::map> plugins_; std::map> connections_; std::mutex mutex_; - std::unique_ptr sonarState_; + std::shared_ptr sonarState_; void performAndReportError(const std::function& func); void disconnect(std::shared_ptr plugin); diff --git a/xplat/Sonar/SonarWebSocketImpl.cpp b/xplat/Sonar/SonarWebSocketImpl.cpp index 8c01fd6ce..0d800f287 100644 --- a/xplat/Sonar/SonarWebSocketImpl.cpp +++ b/xplat/Sonar/SonarWebSocketImpl.cpp @@ -91,8 +91,8 @@ class Responder : public rsocket::RSocketResponder { } }; -SonarWebSocketImpl::SonarWebSocketImpl(SonarInitConfig config) - : deviceData_(config.deviceData), sonarEventBase_(config.callbackWorker), connectionEventBase_(config.connectionWorker) {} +SonarWebSocketImpl::SonarWebSocketImpl(SonarInitConfig config, std::shared_ptr state) + : deviceData_(config.deviceData), sonarState_(state), sonarEventBase_(config.callbackWorker), connectionEventBase_(config.connectionWorker) {} SonarWebSocketImpl::~SonarWebSocketImpl() { stop(); diff --git a/xplat/Sonar/SonarWebSocketImpl.h b/xplat/Sonar/SonarWebSocketImpl.h index ca1e3710a..b1547a94d 100644 --- a/xplat/Sonar/SonarWebSocketImpl.h +++ b/xplat/Sonar/SonarWebSocketImpl.h @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -26,7 +27,7 @@ class SonarWebSocketImpl : public SonarWebSocket { friend Responder; public: - SonarWebSocketImpl(SonarInitConfig config); + SonarWebSocketImpl(SonarInitConfig config, std::shared_ptr state); ~SonarWebSocketImpl(); @@ -46,6 +47,7 @@ class SonarWebSocketImpl : public SonarWebSocket { bool isOpen_ = false; Callbacks* callbacks_; DeviceData deviceData_; + std::shared_ptr sonarState_; folly::EventBase* sonarEventBase_; folly::EventBase* connectionEventBase_; diff --git a/xplat/SonarTests/SonarClientTests.cpp b/xplat/SonarTests/SonarClientTests.cpp index 4a2c63e53..0d32d1fa0 100644 --- a/xplat/SonarTests/SonarClientTests.cpp +++ b/xplat/SonarTests/SonarClientTests.cpp @@ -19,6 +19,8 @@ namespace test { using folly::dynamic; +auto state = std::make_shared(); + TEST(SonarClientTests, testSaneMocks) { SonarWebSocketMock socket; socket.start(); @@ -32,7 +34,7 @@ TEST(SonarClientTests, testSaneMocks) { TEST(SonarClientTests, testGetPlugins) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); client.start(); client.addPlugin(std::make_shared("Cat")); @@ -48,7 +50,7 @@ TEST(SonarClientTests, testGetPlugins) { TEST(SonarClientTests, testGetPlugin) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); const auto catPlugin = std::make_shared("Cat"); client.addPlugin(catPlugin); @@ -61,7 +63,7 @@ TEST(SonarClientTests, testGetPlugin) { TEST(SonarClientTests, testGetPluginWithDowncast) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); const auto catPlugin = std::make_shared("Cat"); client.addPlugin(catPlugin); @@ -70,7 +72,7 @@ TEST(SonarClientTests, testGetPluginWithDowncast) { TEST(SonarClientTests, testRemovePlugin) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); client.start(); auto plugin = std::make_shared("Test"); @@ -87,7 +89,7 @@ TEST(SonarClientTests, testRemovePlugin) { TEST(SonarClientTests, testStartStop) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); client.start(); EXPECT_TRUE(socket->isOpen()); @@ -98,7 +100,7 @@ TEST(SonarClientTests, testStartStop) { TEST(SonarClientTests, testConnectDisconnect) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); bool pluginConnected = false; const auto connectionCallback = [&](std::shared_ptr conn) { @@ -121,7 +123,7 @@ TEST(SonarClientTests, testConnectDisconnect) { TEST(SonarClientTests, testInitDeinit) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); bool pluginConnected = false; const auto connectionCallback = [&](std::shared_ptr conn) { @@ -159,7 +161,7 @@ TEST(SonarClientTests, testInitDeinit) { TEST(SonarClientTests, testRemovePluginWhenConnected) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); bool pluginConnected = false; const auto connectionCallback = [&](std::shared_ptr conn) { @@ -180,7 +182,7 @@ TEST(SonarClientTests, testRemovePluginWhenConnected) { TEST(SonarClientTests, testUnhandleableMethod) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); auto plugin = std::make_shared("Test"); client.addPlugin(plugin); @@ -200,7 +202,7 @@ TEST(SonarClientTests, testUnhandleableMethod) { TEST(SonarClientTests, testExecute) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); client.start(); const auto connectionCallback = [](std::shared_ptr conn) { @@ -230,7 +232,7 @@ TEST(SonarClientTests, testExecute) { TEST(SonarClientTests, testExecuteWithParams) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); const auto connectionCallback = [&](std::shared_ptr conn) { const auto receiver = [](const dynamic ¶ms, @@ -263,7 +265,7 @@ TEST(SonarClientTests, testExecuteWithParams) { TEST(SonarClientTests, testExceptionUnknownPlugin) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); client.start(); dynamic messageInit = dynamic::object("method", "init")( @@ -276,7 +278,7 @@ TEST(SonarClientTests, testExceptionUnknownPlugin) { TEST(SonarClientTests, testExceptionUnknownApi) { auto socket = new SonarWebSocketMock; - SonarClient client(std::unique_ptr{socket}); + SonarClient client(std::unique_ptr{socket}, state); client.start(); dynamic messageInit = dynamic::object("method", "execute")(