From be6efb64176b8b6ffa30d37c01e8bb58862f947f Mon Sep 17 00:00:00 2001 From: JackLivio Date: Thu, 3 Mar 2022 16:28:46 -0500 Subject: Check if app id exists in cloud_app_id_map_ (#3870) * Check if app id exists in cloud_app_id_map_ * Update cloud_app_id_map_ if does not exist or endpoint changed * Fix style * Expand unit tests for connection handler --- .../src/connection_handler_impl.cc | 9 ++- .../test/connection_handler_impl_test.cc | 92 ++++++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index c2c70ccae8..e00eaa33e0 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -1487,8 +1487,13 @@ void ConnectionHandlerImpl::AddCloudAppDevice( const transport_manager::transport_adapter::CloudAppProperties& cloud_properties) { cloud_app_id_map_lock_.Acquire(); - cloud_app_id_map_[policy_app_id] = - std::make_pair(cloud_properties.endpoint, 0); + auto it = cloud_app_id_map_.find(policy_app_id); + if (cloud_app_id_map_.end() == it || + cloud_properties.endpoint != it->second.first) { + // Init map entry if does not exist or if endpoint changed + cloud_app_id_map_[policy_app_id] = + std::make_pair(cloud_properties.endpoint, 0); + } cloud_app_id_map_lock_.Release(); transport_manager_.AddCloudDevice(cloud_properties); } diff --git a/src/components/connection_handler/test/connection_handler_impl_test.cc b/src/components/connection_handler/test/connection_handler_impl_test.cc index 79b237253c..5c9f9a7bd3 100644 --- a/src/components/connection_handler/test/connection_handler_impl_test.cc +++ b/src/components/connection_handler/test/connection_handler_impl_test.cc @@ -2463,6 +2463,98 @@ TEST_F(ConnectionHandlerTest, CloseSession_LastSession_ConnectionOpened) { EXPECT_EQ(0u, connection->session_map().size()); EXPECT_EQ(1u, connection_list.size()); } + +TEST_F(ConnectionHandlerTest, AddCloudAppDevice_GetCloudAppID_Success) { + const transport_manager::transport_adapter::CloudAppProperties properties{ + "ws://192.168.1.100:9876", "", true, "iAmAAuthToken!", "WS", "CLOUD"}; + std::string policyID = "iAmAPolicyID-12345"; + EXPECT_CALL(mock_transport_manager_, AddCloudDevice(_)); + connection_handler_->AddCloudAppDevice(policyID, properties); + + const std::string result = connection_handler_->GetCloudAppID(0); + EXPECT_EQ(result, policyID); +} + +TEST_F(ConnectionHandlerTest, AddCloudAppDevice_OnConnectPending_Success) { + std::string endpoint = "ws://192.168.1.100:9876"; + const transport_manager::transport_adapter::CloudAppProperties properties{ + endpoint, "", true, "iAmAAuthToken!", "WS", "CLOUD"}; + std::string policyID = "iAmAPolicyID-12345"; + const transport_manager::DeviceInfo device_info(1, endpoint, endpoint, "WS"); + + connection_handler_->OnDeviceAdded(device_info); + + EXPECT_CALL(mock_transport_manager_, AddCloudDevice(_)); + connection_handler_->AddCloudAppDevice(policyID, properties); + + connection_handler_test::MockConnectionHandlerObserver + mock_connection_handler_observer; + connection_handler_->set_connection_handler_observer( + &mock_connection_handler_observer); + EXPECT_CALL(mock_connection_handler_observer, + CreatePendingApplication(1, device_info, _)); + connection_handler_->OnConnectionPending(device_info, 1); + + const std::string result = connection_handler_->GetCloudAppID(1); + EXPECT_EQ(result, policyID); +} + +TEST_F(ConnectionHandlerTest, AddCloudAppDevice_Repeated_Success) { + std::string endpoint = "ws://192.168.1.100:9876"; + const transport_manager::transport_adapter::CloudAppProperties properties{ + endpoint, "", true, "iAmAAuthToken!", "WS", "CLOUD"}; + std::string policyID = "iAmAPolicyID-12345"; + const transport_manager::DeviceInfo device_info(1, endpoint, endpoint, "WS"); + + connection_handler_->OnDeviceAdded(device_info); + + EXPECT_CALL(mock_transport_manager_, AddCloudDevice(_)).Times(2); + connection_handler_->AddCloudAppDevice(policyID, properties); + + connection_handler_test::MockConnectionHandlerObserver + mock_connection_handler_observer; + connection_handler_->set_connection_handler_observer( + &mock_connection_handler_observer); + EXPECT_CALL(mock_connection_handler_observer, + CreatePendingApplication(1, device_info, _)); + connection_handler_->OnConnectionPending(device_info, 1); + + // Call AddCloudAppDevice and verify policy id is still recoverable + connection_handler_->AddCloudAppDevice(policyID, properties); + const std::string result = connection_handler_->GetCloudAppID(1); + EXPECT_EQ(result, policyID); +} + +TEST_F(ConnectionHandlerTest, AddCloudAppDevice_NewEndpoint_Success) { + std::string endpoint = "ws://192.168.1.100:9876"; + const transport_manager::transport_adapter::CloudAppProperties properties{ + endpoint, "", true, "iAmAAuthToken!", "WS", "CLOUD"}; + std::string policyID = "iAmAPolicyID-12345"; + const transport_manager::DeviceInfo device_info(1, endpoint, endpoint, "WS"); + + connection_handler_->OnDeviceAdded(device_info); + + EXPECT_CALL(mock_transport_manager_, AddCloudDevice(_)).Times(2); + connection_handler_->AddCloudAppDevice(policyID, properties); + + connection_handler_test::MockConnectionHandlerObserver + mock_connection_handler_observer; + connection_handler_->set_connection_handler_observer( + &mock_connection_handler_observer); + EXPECT_CALL(mock_connection_handler_observer, + CreatePendingApplication(1, device_info, _)); + connection_handler_->OnConnectionPending(device_info, 1); + + // Call AddCloudAppDevice with new endpoint and verify connection id re-init + // to 0 + std::string endpoint2 = "ws://192.168.1.111:9888"; + const transport_manager::transport_adapter::CloudAppProperties properties2{ + endpoint2, "", true, "iAmAAuthToken2!", "WS", "CLOUD"}; + connection_handler_->AddCloudAppDevice(policyID, properties2); + const std::string result = connection_handler_->GetCloudAppID(0); + EXPECT_EQ(result, policyID); +} + } // namespace connection_handler_test } // namespace components } // namespace test -- cgit v1.2.1