From df9e8cc6268570e2627c40cf6085dd36944784bc Mon Sep 17 00:00:00 2001 From: AKalinich-Luxoft Date: Tue, 12 Dec 2017 10:03:37 +0200 Subject: Fix starting of the session Heartbeat In the current implementation SDL starts session heartbeat right after application registration. However the correct behavior is to start session heartbeat after first heartbeat request from mobile app. Following changes were done: - Removed starting session heartbeat on app registration - Added session heartbeat start on frist heartbeat request from mobile app - Added check to prevent starting of session heartbeat if it was disabled in settings --- .../application_manager/src/application_manager_impl.cc | 5 ----- .../connection_handler/src/heartbeat_monitor.cc | 17 ++++++++++++++--- .../protocol_handler/src/protocol_handler_impl.cc | 11 +++++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index a2cba5198e..c4779dcbfc 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -578,11 +578,6 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication( connection_handler().BindProtocolVersionWithSession( connection_key, static_cast(protocol_version)); } - if ((protocol_version == - protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_3) && - (get_settings().heart_beat_timeout() != 0)) { - connection_handler().StartSessionHeartBeat(connection_key); - } // Keep HMI add id in case app is present in "waiting for registration" list apps_to_register_list_lock_.Acquire(); diff --git a/src/components/connection_handler/src/heartbeat_monitor.cc b/src/components/connection_handler/src/heartbeat_monitor.cc index f3a2322810..15ca2cfca8 100644 --- a/src/components/connection_handler/src/heartbeat_monitor.cc +++ b/src/components/connection_handler/src/heartbeat_monitor.cc @@ -90,18 +90,29 @@ void HeartBeatMonitor::threadMain() { } void HeartBeatMonitor::AddSession(uint8_t session_id) { + if (0 == default_heartbeat_timeout_) { + LOG4CXX_INFO(logger_, + "Won't add session with id " + << static_cast(session_id) + << " because Heartbeat is disabled."); + return; + } + LOG4CXX_DEBUG(logger_, - "Add session with id " << static_cast(session_id)); + "Add session with id " << static_cast(session_id)); AutoLock auto_lock(sessions_list_lock_); if (sessions_.end() != sessions_.find(session_id)) { LOG4CXX_WARN(logger_, - "Session with id " << static_cast(session_id) + "Session with id " << static_cast(session_id) << " already exists"); return; } + sessions_.insert( std::make_pair(session_id, SessionState(default_heartbeat_timeout_))); - LOG4CXX_INFO(logger_, "Start heartbeat for session " << session_id); + LOG4CXX_INFO(logger_, + "Start heartbeat for session " + << static_cast(session_id)); } void HeartBeatMonitor::RemoveSession(uint8_t session_id) { diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc index 23ac2927ef..a2a38c3bee 100644 --- a/src/components/protocol_handler/src/protocol_handler_impl.cc +++ b/src/components/protocol_handler/src/protocol_handler_impl.cc @@ -1689,17 +1689,20 @@ void ProtocolHandlerImpl::NotifySessionStartedResult( RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat( const ProtocolPacket& packet) { const ConnectionID connection_id = packet.connection_id(); + const uint32_t session_id = packet.session_id(); LOG4CXX_DEBUG(logger_, "Sending heart beat acknowledgment for connection " - << connection_id); + << connection_id << " session " << session_id); uint8_t protocol_version; if (session_observer_.ProtocolVersionUsed( - connection_id, packet.session_id(), protocol_version)) { + connection_id, session_id, protocol_version)) { // TODO(EZamakhov): investigate message_id for HeartBeatAck if (protocol_version >= PROTOCOL_VERSION_3 && protocol_version <= PROTOCOL_VERSION_5) { - return SendHeartBeatAck( - connection_id, packet.session_id(), packet.message_id()); + const uint32_t connection_key = + session_observer_.KeyFromPair(connection_id, session_id); + connection_handler_.StartSessionHeartBeat(connection_key); + return SendHeartBeatAck(connection_id, session_id, packet.message_id()); } else { LOG4CXX_WARN(logger_, "HeartBeat is not supported"); return RESULT_HEARTBEAT_IS_NOT_SUPPORTED; -- cgit v1.2.1 From 68fdb3a280212d9b6971cf23648f7dd0ab5688d5 Mon Sep 17 00:00:00 2001 From: AKalinich-Luxoft Date: Thu, 14 Dec 2017 16:21:58 +0200 Subject: Added check if HB tracking for session is already enabled This prevents SDL from starting HB session tracking every time SDL receives HB request from mobile. --- .../application_manager/src/application_manager_impl.cc | 6 ------ .../include/connection_handler/connection.h | 8 ++++++++ .../include/connection_handler/connection_handler_impl.h | 8 ++++++++ .../include/connection_handler/heartbeat_monitor.h | 10 +++++++++- src/components/connection_handler/src/connection.cc | 4 ++++ .../connection_handler/src/connection_handler_impl.cc | 15 +++++++++++++++ .../connection_handler/src/heartbeat_monitor.cc | 8 ++++++++ .../include/connection_handler/connection_handler.h | 9 +++++++++ .../test/connection_handler/mock_connection_handler.h | 2 ++ .../protocol_handler/src/protocol_handler_impl.cc | 12 +++++++++++- 10 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index c4779dcbfc..71978b6d56 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -573,12 +573,6 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication( message[strings::params][strings::protocol_version].asInt()); application->set_protocol_version(protocol_version); - if (protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_UNKNOWN != - protocol_version) { - connection_handler().BindProtocolVersionWithSession( - connection_key, static_cast(protocol_version)); - } - // Keep HMI add id in case app is present in "waiting for registration" list apps_to_register_list_lock_.Acquire(); AppsWaitRegistrationSet::iterator it = apps_to_register_.find(application); diff --git a/src/components/connection_handler/include/connection_handler/connection.h b/src/components/connection_handler/include/connection_handler/connection.h index bd5858c4cd..11515ca7ae 100644 --- a/src/components/connection_handler/include/connection_handler/connection.h +++ b/src/components/connection_handler/include/connection_handler/connection.h @@ -228,6 +228,14 @@ class Connection { */ void KeepAlive(uint8_t session_id); + /** + * @brief Check is heartbeat monitoring started for specified session + * @param session_id session id + * @return returns true if heartbeat monitoring started for specified session + * otherwise returns false + */ + bool IsSessionHeartbeatTracked(const uint8_t session_id) const; + /** * @brief Start heartbeat for specified session * @param session_id session id diff --git a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h index aebc612a22..d4962c23d8 100644 --- a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h +++ b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h @@ -399,6 +399,14 @@ class ConnectionHandlerImpl */ void SendEndService(uint32_t key, uint8_t service_type) OVERRIDE; + /** + * @brief Check is heartbeat monitoring started for specified connection key + * @param connection_key pair of connection and session id + * @return returns true if heartbeat monitoring started for specified + * connection key otherwise returns false + */ + bool IsSessionHeartbeatTracked(const uint32_t connection_key) const OVERRIDE; + /** * \brief Start heartbeat for specified session * diff --git a/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h b/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h index 4d1d07112c..d5ee0946ff 100644 --- a/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h +++ b/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h @@ -68,6 +68,14 @@ class HeartBeatMonitor : public threads::ThreadDelegate { */ void KeepAlive(uint8_t session_id); + /** + * @brief Check is heartbeat monitoring started for specified session + * @param session_id session id + * @return returns true if heartbeat monitoring started for specified session + * otherwise returns false + */ + bool IsSessionHeartbeatTracked(const uint8_t session_id) const; + /** * \brief Thread exit procedure. */ @@ -111,7 +119,7 @@ class HeartBeatMonitor : public threads::ThreadDelegate { typedef std::map SessionMap; SessionMap sessions_; - sync_primitives::Lock sessions_list_lock_; // recurcive + mutable sync_primitives::Lock sessions_list_lock_; // recurcive sync_primitives::Lock main_thread_lock_; mutable sync_primitives::Lock heartbeat_timeout_seconds_lock_; sync_primitives::ConditionalVariable heartbeat_monitor_; diff --git a/src/components/connection_handler/src/connection.cc b/src/components/connection_handler/src/connection.cc index 202736e612..c4088470c8 100644 --- a/src/components/connection_handler/src/connection.cc +++ b/src/components/connection_handler/src/connection.cc @@ -369,6 +369,10 @@ bool Connection::ProtocolVersion(uint8_t session_id, return true; } +bool Connection::IsSessionHeartbeatTracked(const uint8_t session_id) const { + return heartbeat_monitor_->IsSessionHeartbeatTracked(session_id); +} + void Connection::StartHeartBeat(uint8_t session_id) { heartbeat_monitor_->AddSession(session_id); } diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index bd5b3d79bb..0b637a0288 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -1069,6 +1069,21 @@ void ConnectionHandlerImpl::SendEndService(uint32_t key, uint8_t service_type) { } } +bool ConnectionHandlerImpl::IsSessionHeartbeatTracked( + const uint32_t connection_key) const { + LOG4CXX_AUTO_TRACE(logger_); + uint32_t connection_handle = 0; + uint8_t session_id = 0; + PairFromKey(connection_key, &connection_handle, &session_id); + + sync_primitives::AutoReadLock lock(connection_list_lock_); + ConnectionList::const_iterator it = connection_list_.find(connection_handle); + if (connection_list_.end() != it) { + return it->second->IsSessionHeartbeatTracked(session_id); + } + return false; +} + void ConnectionHandlerImpl::StartSessionHeartBeat(uint32_t connection_key) { LOG4CXX_AUTO_TRACE(logger_); uint32_t connection_handle = 0; diff --git a/src/components/connection_handler/src/heartbeat_monitor.cc b/src/components/connection_handler/src/heartbeat_monitor.cc index 15ca2cfca8..677bab6aa3 100644 --- a/src/components/connection_handler/src/heartbeat_monitor.cc +++ b/src/components/connection_handler/src/heartbeat_monitor.cc @@ -142,6 +142,14 @@ void HeartBeatMonitor::KeepAlive(uint8_t session_id) { } } +bool HeartBeatMonitor::IsSessionHeartbeatTracked( + const uint8_t session_id) const { + LOG4CXX_AUTO_TRACE(logger_); + AutoLock auto_lock(sessions_list_lock_); + + return sessions_.end() != sessions_.find(session_id); +} + void HeartBeatMonitor::exitThreadMain() { // FIXME (dchmerev@luxoft.com): thread requested to stop should stop as soon // as possible, diff --git a/src/components/include/connection_handler/connection_handler.h b/src/components/include/connection_handler/connection_handler.h index c70861b5f6..3402dcae41 100644 --- a/src/components/include/connection_handler/connection_handler.h +++ b/src/components/include/connection_handler/connection_handler.h @@ -129,6 +129,15 @@ class ConnectionHandler { */ virtual void SendEndService(uint32_t key, uint8_t service_type) = 0; + /** + * @brief Check is heartbeat monitoring started for specified connection key + * @param connection_key pair of connection and session id + * @return returns true if heartbeat monitoring started for specified + * connection key otherwise returns false + */ + virtual bool IsSessionHeartbeatTracked( + const uint32_t connection_key) const = 0; + /** * \brief Start heartbeat for specified session * diff --git a/src/components/include/test/connection_handler/mock_connection_handler.h b/src/components/include/test/connection_handler/mock_connection_handler.h index 5cb5f471b5..0933859089 100644 --- a/src/components/include/test/connection_handler/mock_connection_handler.h +++ b/src/components/include/test/connection_handler/mock_connection_handler.h @@ -75,6 +75,8 @@ class MockConnectionHandler : public connection_handler::ConnectionHandler { uint8_t session_id, CloseSessionReason close_reason)); MOCK_METHOD2(SendEndService, void(uint32_t key, uint8_t service_type)); + MOCK_CONST_METHOD1(IsSessionHeartbeatTracked, + bool(const uint32_t connection_key)); MOCK_METHOD1(StartSessionHeartBeat, void(uint32_t connection_key)); MOCK_METHOD2(SendHeartBeat, void(ConnectionHandle connection_handle, uint8_t session_id)); diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc index a2a38c3bee..c9d9f56a63 100644 --- a/src/components/protocol_handler/src/protocol_handler_impl.cc +++ b/src/components/protocol_handler/src/protocol_handler_impl.cc @@ -309,6 +309,11 @@ void ProtocolHandlerImpl::SendStartSessionAck( raw_ford_messages_to_mobile_.PostMessage( impl::RawFordMessageToMobile(ptr, false)); + const uint32_t connection_key = + session_observer_.KeyFromPair(connection_id, session_id); + connection_handler_.BindProtocolVersionWithSession(connection_key, + ack_protocol_version); + LOG4CXX_DEBUG(logger_, "SendStartSessionAck() for connection " << connection_id << " for service_type " @@ -1701,7 +1706,12 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat( protocol_version <= PROTOCOL_VERSION_5) { const uint32_t connection_key = session_observer_.KeyFromPair(connection_id, session_id); - connection_handler_.StartSessionHeartBeat(connection_key); + if (!connection_handler_.IsSessionHeartbeatTracked(connection_key)) { + LOG4CXX_DEBUG(logger_, + "Session heartbeat tracking is not started. " + << "Starting it for session " << session_id); + connection_handler_.StartSessionHeartBeat(connection_key); + } return SendHeartBeatAck(connection_id, session_id, packet.message_id()); } else { LOG4CXX_WARN(logger_, "HeartBeat is not supported"); -- cgit v1.2.1 From 1b921ede4a8763b793e8e3f3e7cf4a0ca31efff1 Mon Sep 17 00:00:00 2001 From: JackLivio Date: Thu, 12 Nov 2020 10:36:05 -0500 Subject: Fix errors from merge conflicts --- .../connection_handler/include/connection_handler/heartbeat_monitor.h | 2 +- src/components/connection_handler/src/connection_handler_impl.cc | 2 +- src/components/connection_handler/src/heartbeat_monitor.cc | 4 ++-- src/components/protocol_handler/src/protocol_handler_impl.cc | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h b/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h index 80c20b832e..7713d2490f 100644 --- a/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h +++ b/src/components/connection_handler/include/connection_handler/heartbeat_monitor.h @@ -119,7 +119,7 @@ class HeartBeatMonitor : public threads::ThreadDelegate { typedef std::map SessionMap; SessionMap sessions_; - sync_primitives::RecursiveLock sessions_list_lock_; // recursive + mutable sync_primitives::RecursiveLock sessions_list_lock_; // recursive sync_primitives::Lock main_thread_lock_; mutable sync_primitives::Lock heartbeat_timeout_seconds_lock_; sync_primitives::ConditionalVariable heartbeat_monitor_; diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index 70fd3f96a7..a771f0a104 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -1669,7 +1669,7 @@ void ConnectionHandlerImpl::SendEndService(uint32_t key, uint8_t service_type) { bool ConnectionHandlerImpl::IsSessionHeartbeatTracked( const uint32_t connection_key) const { - LOG4CXX_AUTO_TRACE(logger_); + SDL_LOG_AUTO_TRACE(); uint32_t connection_handle = 0; uint8_t session_id = 0; PairFromKey(connection_key, &connection_handle, &session_id); diff --git a/src/components/connection_handler/src/heartbeat_monitor.cc b/src/components/connection_handler/src/heartbeat_monitor.cc index e3b0e39654..be50e6c802 100644 --- a/src/components/connection_handler/src/heartbeat_monitor.cc +++ b/src/components/connection_handler/src/heartbeat_monitor.cc @@ -88,7 +88,7 @@ void HeartBeatMonitor::threadMain() { void HeartBeatMonitor::AddSession(uint8_t session_id) { if (0 == default_heartbeat_timeout_) { - SDL_LOG_INFO(logger_, + SDL_LOG_INFO( "Won't add session with id " << static_cast(session_id) << " because Heartbeat is disabled."); @@ -136,7 +136,7 @@ void HeartBeatMonitor::KeepAlive(uint8_t session_id) { bool HeartBeatMonitor::IsSessionHeartbeatTracked( const uint8_t session_id) const { - LOG4CXX_AUTO_TRACE(logger_); + SDL_LOG_AUTO_TRACE(); AutoLock auto_lock(sessions_list_lock_); return sessions_.end() != sessions_.find(session_id); diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc index 2d963bd997..d0505a42a3 100644 --- a/src/components/protocol_handler/src/protocol_handler_impl.cc +++ b/src/components/protocol_handler/src/protocol_handler_impl.cc @@ -2057,7 +2057,7 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat( const ProtocolPacket& packet) { const ConnectionID connection_id = packet.connection_id(); const uint32_t session_id = packet.session_id(); - SDL_LOG_DEBUG(logger_, + SDL_LOG_DEBUG( "Sending heart beat acknowledgment for connection " << connection_id << " session " << session_id); uint8_t protocol_version; @@ -2069,7 +2069,7 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat( const uint32_t connection_key = session_observer_.KeyFromPair(connection_id, session_id); if (!connection_handler_.IsSessionHeartbeatTracked(connection_key)) { - LOG4CXX_DEBUG(logger_, + SDL_LOG_DEBUG( "Session heartbeat tracking is not started. " << "Starting it for session " << session_id); connection_handler_.StartSessionHeartBeat(connection_key); -- cgit v1.2.1 From bd51e85a28b70f3f2dc44ed572b405b1017dfef9 Mon Sep 17 00:00:00 2001 From: JackLivio Date: Fri, 13 Nov 2020 13:07:51 -0500 Subject: Fix unit tests --- src/components/connection_handler/src/heartbeat_monitor.cc | 7 +++---- src/components/protocol_handler/src/protocol_handler_impl.cc | 10 ++++------ .../protocol_handler/test/protocol_handler_tm_test.cc | 10 +++++----- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/components/connection_handler/src/heartbeat_monitor.cc b/src/components/connection_handler/src/heartbeat_monitor.cc index be50e6c802..8e15c934b9 100644 --- a/src/components/connection_handler/src/heartbeat_monitor.cc +++ b/src/components/connection_handler/src/heartbeat_monitor.cc @@ -88,10 +88,9 @@ void HeartBeatMonitor::threadMain() { void HeartBeatMonitor::AddSession(uint8_t session_id) { if (0 == default_heartbeat_timeout_) { - SDL_LOG_INFO( - "Won't add session with id " - << static_cast(session_id) - << " because Heartbeat is disabled."); + SDL_LOG_INFO("Won't add session with id " + << static_cast(session_id) + << " because Heartbeat is disabled."); return; } diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc index d0505a42a3..c6edc58a91 100644 --- a/src/components/protocol_handler/src/protocol_handler_impl.cc +++ b/src/components/protocol_handler/src/protocol_handler_impl.cc @@ -2057,9 +2057,8 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat( const ProtocolPacket& packet) { const ConnectionID connection_id = packet.connection_id(); const uint32_t session_id = packet.session_id(); - SDL_LOG_DEBUG( - "Sending heart beat acknowledgment for connection " - << connection_id << " session " << session_id); + SDL_LOG_DEBUG("Sending heart beat acknowledgment for connection " + << connection_id << " session " << session_id); uint8_t protocol_version; if (session_observer_.ProtocolVersionUsed( connection_id, session_id, protocol_version)) { @@ -2069,9 +2068,8 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat( const uint32_t connection_key = session_observer_.KeyFromPair(connection_id, session_id); if (!connection_handler_.IsSessionHeartbeatTracked(connection_key)) { - SDL_LOG_DEBUG( - "Session heartbeat tracking is not started. " - << "Starting it for session " << session_id); + SDL_LOG_DEBUG("Session heartbeat tracking is not started. " + << "Starting it for session " << session_id); connection_handler_.StartSessionHeartBeat(connection_key); } return SendHeartBeatAck(connection_id, session_id, packet.message_id()); diff --git a/src/components/protocol_handler/test/protocol_handler_tm_test.cc b/src/components/protocol_handler/test/protocol_handler_tm_test.cc index 41c16817b5..e7d241ecbb 100644 --- a/src/components/protocol_handler/test/protocol_handler_tm_test.cc +++ b/src/components/protocol_handler/test/protocol_handler_tm_test.cc @@ -1995,7 +1995,7 @@ void ProtocolHandlerImplTest::VerifySecondaryTransportParamsInStartSessionAck( AddSecurityManager(); EXPECT_CALL(session_observer_mock, KeyFromPair(connection_id, session_id)) - .WillOnce(Return(connection_key)); + .WillRepeatedly(Return(connection_key)); EXPECT_CALL(session_observer_mock, GetSSLContext(connection_key, kRpc)) .WillOnce(ReturnNull()); @@ -2107,7 +2107,7 @@ void ProtocolHandlerImplTest::VerifyCloudAppParamsInStartSessionAck( AddSecurityManager(); EXPECT_CALL(session_observer_mock, KeyFromPair(connection_id, session_id)) - .WillOnce(Return(connection_key)); + .WillRepeatedly(Return(connection_key)); EXPECT_CALL(session_observer_mock, GetSSLContext(connection_key, kRpc)) .WillOnce(ReturnNull()); @@ -2577,7 +2577,7 @@ TEST_F(ProtocolHandlerImplTest, AddSecurityManager(); EXPECT_CALL(session_observer_mock, KeyFromPair(connection_id, session_id)) - .WillOnce(Return(connection_key)); + .WillRepeatedly(Return(connection_key)); EXPECT_CALL(session_observer_mock, GetSSLContext(connection_key, kRpc)) .WillOnce(ReturnNull()); @@ -2763,7 +2763,7 @@ TEST_F(ProtocolHandlerImplTest, AddSecurityManager(); EXPECT_CALL(session_observer_mock, KeyFromPair(connection_id, session_id)) - .WillOnce(Return(connection_key)); + .WillRepeatedly(Return(connection_key)); EXPECT_CALL(session_observer_mock, GetSSLContext(connection_key, kRpc)) .WillOnce(ReturnNull()); @@ -2884,7 +2884,7 @@ TEST_F(ProtocolHandlerImplTest, AddSecurityManager(); EXPECT_CALL(session_observer_mock, KeyFromPair(connection_id, session_id)) - .WillOnce(Return(connection_key)); + .WillRepeatedly(Return(connection_key)); EXPECT_CALL(session_observer_mock, GetSSLContext(connection_key, kRpc)) .WillOnce(ReturnNull()); -- cgit v1.2.1