| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/bind_helpers.h" | 6 #include "base/bind_helpers.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "remoting/base/auto_thread_task_runner.h" | 8 #include "remoting/base/auto_thread_task_runner.h" |
| 9 #include "remoting/host/audio_capturer.h" | 9 #include "remoting/host/audio_capturer.h" |
| 10 #include "remoting/host/chromoting_host.h" | 10 #include "remoting/host/chromoting_host.h" |
| 11 #include "remoting/host/chromoting_host_context.h" | 11 #include "remoting/host/chromoting_host_context.h" |
| 12 #include "remoting/host/fake_desktop_environment.h" | 12 #include "remoting/host/fake_desktop_environment.h" |
| 13 #include "remoting/host/fake_mouse_cursor_monitor.h" | 13 #include "remoting/host/fake_mouse_cursor_monitor.h" |
| 14 #include "remoting/host/host_mock_objects.h" | 14 #include "remoting/host/host_mock_objects.h" |
| 15 #include "remoting/proto/video.pb.h" | 15 #include "remoting/proto/video.pb.h" |
| 16 #include "remoting/protocol/errors.h" | 16 #include "remoting/protocol/errors.h" |
| 17 #include "remoting/protocol/fake_connection_to_client.h" | 17 #include "remoting/protocol/fake_connection_to_client.h" |
| 18 #include "remoting/protocol/fake_desktop_capturer.h" | 18 #include "remoting/protocol/fake_desktop_capturer.h" |
| 19 #include "remoting/protocol/protocol_mock_objects.h" | 19 #include "remoting/protocol/protocol_mock_objects.h" |
| 20 #include "remoting/protocol/session_config.h" | 20 #include "remoting/protocol/session_config.h" |
| 21 #include "remoting/signaling/mock_signal_strategy.h" | |
| 22 #include "testing/gmock/include/gmock/gmock.h" | 21 #include "testing/gmock/include/gmock/gmock.h" |
| 23 #include "testing/gmock_mutant.h" | 22 #include "testing/gmock_mutant.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 25 | 24 |
| 26 using ::remoting::protocol::MockClientStub; | 25 using ::remoting::protocol::MockClientStub; |
| 27 using ::remoting::protocol::MockConnectionToClientEventHandler; | 26 using ::remoting::protocol::MockConnectionToClientEventHandler; |
| 28 using ::remoting::protocol::MockHostStub; | 27 using ::remoting::protocol::MockHostStub; |
| 29 using ::remoting::protocol::MockSession; | 28 using ::remoting::protocol::MockSession; |
| 30 using ::remoting::protocol::MockVideoStub; | 29 using ::remoting::protocol::MockVideoStub; |
| 31 using ::remoting::protocol::Session; | 30 using ::remoting::protocol::Session; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 54 ChromotingHostTest() { | 53 ChromotingHostTest() { |
| 55 } | 54 } |
| 56 | 55 |
| 57 void SetUp() override { | 56 void SetUp() override { |
| 58 task_runner_ = new AutoThreadTaskRunner(message_loop_.task_runner(), | 57 task_runner_ = new AutoThreadTaskRunner(message_loop_.task_runner(), |
| 59 base::Bind(&base::DoNothing)); | 58 base::Bind(&base::DoNothing)); |
| 60 | 59 |
| 61 desktop_environment_factory_.reset(new FakeDesktopEnvironmentFactory()); | 60 desktop_environment_factory_.reset(new FakeDesktopEnvironmentFactory()); |
| 62 session_manager_ = new protocol::MockSessionManager(); | 61 session_manager_ = new protocol::MockSessionManager(); |
| 63 | 62 |
| 64 host_.reset(new ChromotingHost( | 63 host_.reset(new ChromotingHost(desktop_environment_factory_.get(), |
| 65 &signal_strategy_, | 64 make_scoped_ptr(session_manager_), |
| 66 desktop_environment_factory_.get(), | 65 task_runner_, // Audio |
| 67 make_scoped_ptr(session_manager_), | 66 task_runner_, // Input |
| 68 task_runner_, // Audio | 67 task_runner_, // Video capture |
| 69 task_runner_, // Input | 68 task_runner_, // Video encode |
| 70 task_runner_, // Video capture | 69 task_runner_, // Network |
| 71 task_runner_, // Video encode | 70 task_runner_)); // UI |
| 72 task_runner_, // Network | |
| 73 task_runner_)); // UI | |
| 74 host_->AddStatusObserver(&host_status_observer_); | 71 host_->AddStatusObserver(&host_status_observer_); |
| 75 | 72 |
| 76 xmpp_login_ = "host@domain"; | 73 xmpp_login_ = "host@domain"; |
| 77 session1_ = new MockSession(); | 74 session1_ = new MockSession(); |
| 78 session2_ = new MockSession(); | 75 session2_ = new MockSession(); |
| 79 session_unowned1_.reset(new MockSession()); | 76 session_unowned1_.reset(new MockSession()); |
| 80 session_unowned2_.reset(new MockSession()); | 77 session_unowned2_.reset(new MockSession()); |
| 81 session_config1_ = SessionConfig::ForTest(); | 78 session_config1_ = SessionConfig::ForTest(); |
| 82 session_jid1_ = "user@domain/rest-of-jid"; | 79 session_jid1_ = "user@domain/rest-of-jid"; |
| 83 session_config2_ = SessionConfig::ForTest(); | 80 session_config2_ = SessionConfig::ForTest(); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 session_unowned2_event_handler_->OnSessionStateChange(Session::CLOSED); | 179 session_unowned2_event_handler_->OnSessionStateChange(Session::CLOSED); |
| 183 } | 180 } |
| 184 } | 181 } |
| 185 | 182 |
| 186 void ShutdownHost() { | 183 void ShutdownHost() { |
| 187 EXPECT_CALL(host_status_observer_, OnShutdown()); | 184 EXPECT_CALL(host_status_observer_, OnShutdown()); |
| 188 host_.reset(); | 185 host_.reset(); |
| 189 desktop_environment_factory_.reset(); | 186 desktop_environment_factory_.reset(); |
| 190 } | 187 } |
| 191 | 188 |
| 192 // Expect the host and session manager to start, and return the expectation | 189 // Starts the host. |
| 193 // that the session manager has started. | 190 void StartHost() { |
| 194 Expectation ExpectHostAndSessionManagerStart() { | |
| 195 EXPECT_CALL(host_status_observer_, OnStart(xmpp_login_)); | 191 EXPECT_CALL(host_status_observer_, OnStart(xmpp_login_)); |
| 196 return EXPECT_CALL(*session_manager_, Init(_, host_.get())); | 192 EXPECT_CALL(*session_manager_, AcceptIncoming(_)); |
| 193 host_->Start(xmpp_login_); |
| 197 } | 194 } |
| 198 | 195 |
| 199 // Expect a client to connect. | 196 // Expect a client to connect. |
| 200 // Return an expectation that a session has started. | 197 // Return an expectation that a session has started. |
| 201 Expectation ExpectClientConnected(int connection_index) { | 198 Expectation ExpectClientConnected(int connection_index) { |
| 202 const std::string& session_jid = get_session_jid(connection_index); | 199 const std::string& session_jid = get_session_jid(connection_index); |
| 203 | 200 |
| 204 Expectation client_authenticated = | 201 Expectation client_authenticated = |
| 205 EXPECT_CALL(host_status_observer_, OnClientAuthenticated(session_jid)); | 202 EXPECT_CALL(host_status_observer_, OnClientAuthenticated(session_jid)); |
| 206 return EXPECT_CALL(host_status_observer_, OnClientConnected(session_jid)) | 203 return EXPECT_CALL(host_status_observer_, OnClientConnected(session_jid)) |
| 207 .After(client_authenticated); | 204 .After(client_authenticated); |
| 208 } | 205 } |
| 209 | 206 |
| 210 // Expect that a client is disconnected. The given action will be done after | 207 // Expect that a client is disconnected. The given action will be done after |
| 211 // the status observer is notified that the session has finished. | 208 // the status observer is notified that the session has finished. |
| 212 Expectation ExpectClientDisconnected(int connection_index) { | 209 Expectation ExpectClientDisconnected(int connection_index) { |
| 213 return EXPECT_CALL(host_status_observer_, | 210 return EXPECT_CALL(host_status_observer_, |
| 214 OnClientDisconnected(get_session_jid(connection_index))) | 211 OnClientDisconnected(get_session_jid(connection_index))) |
| 215 .RetiresOnSaturation(); | 212 .RetiresOnSaturation(); |
| 216 } | 213 } |
| 217 | 214 |
| 218 protected: | 215 protected: |
| 219 base::MessageLoop message_loop_; | 216 base::MessageLoop message_loop_; |
| 220 scoped_refptr<AutoThreadTaskRunner> task_runner_; | 217 scoped_refptr<AutoThreadTaskRunner> task_runner_; |
| 221 MockConnectionToClientEventHandler handler_; | 218 MockConnectionToClientEventHandler handler_; |
| 222 MockSignalStrategy signal_strategy_; | |
| 223 scoped_ptr<FakeDesktopEnvironmentFactory> desktop_environment_factory_; | 219 scoped_ptr<FakeDesktopEnvironmentFactory> desktop_environment_factory_; |
| 224 MockHostStatusObserver host_status_observer_; | 220 MockHostStatusObserver host_status_observer_; |
| 225 scoped_ptr<ChromotingHost> host_; | 221 scoped_ptr<ChromotingHost> host_; |
| 226 protocol::MockSessionManager* session_manager_; | 222 protocol::MockSessionManager* session_manager_; |
| 227 std::string xmpp_login_; | 223 std::string xmpp_login_; |
| 228 protocol::FakeConnectionToClient* connection1_; | 224 protocol::FakeConnectionToClient* connection1_; |
| 229 scoped_ptr<protocol::FakeConnectionToClient> owned_connection1_; | 225 scoped_ptr<protocol::FakeConnectionToClient> owned_connection1_; |
| 230 ClientSession* client1_; | 226 ClientSession* client1_; |
| 231 std::string session_jid1_; | 227 std::string session_jid1_; |
| 232 MockSession* session1_; // Owned by |connection_|. | 228 MockSession* session1_; // Owned by |connection_|. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 261 std::list<ClientSession*>& get_clients_from_host() { | 257 std::list<ClientSession*>& get_clients_from_host() { |
| 262 return host_->clients_; | 258 return host_->clients_; |
| 263 } | 259 } |
| 264 | 260 |
| 265 const std::string& get_session_jid(int connection_index) { | 261 const std::string& get_session_jid(int connection_index) { |
| 266 return (connection_index == 0) ? session_jid1_ : session_jid2_; | 262 return (connection_index == 0) ? session_jid1_ : session_jid2_; |
| 267 } | 263 } |
| 268 }; | 264 }; |
| 269 | 265 |
| 270 TEST_F(ChromotingHostTest, StartAndShutdown) { | 266 TEST_F(ChromotingHostTest, StartAndShutdown) { |
| 271 ExpectHostAndSessionManagerStart(); | 267 StartHost(); |
| 272 host_->Start(xmpp_login_); | |
| 273 } | 268 } |
| 274 | 269 |
| 275 TEST_F(ChromotingHostTest, Connect) { | 270 TEST_F(ChromotingHostTest, Connect) { |
| 276 ExpectHostAndSessionManagerStart(); | 271 StartHost(); |
| 277 host_->Start(xmpp_login_); | |
| 278 | 272 |
| 279 // Shut down the host when the first video packet is received. | 273 // Shut down the host when the first video packet is received. |
| 280 ExpectClientConnected(0); | 274 ExpectClientConnected(0); |
| 281 SimulateClientConnection(0, true, false); | 275 SimulateClientConnection(0, true, false); |
| 282 } | 276 } |
| 283 | 277 |
| 284 TEST_F(ChromotingHostTest, AuthenticationFailed) { | 278 TEST_F(ChromotingHostTest, AuthenticationFailed) { |
| 285 ExpectHostAndSessionManagerStart(); | 279 StartHost(); |
| 286 host_->Start(xmpp_login_); | |
| 287 | 280 |
| 288 EXPECT_CALL(host_status_observer_, OnAccessDenied(session_jid1_)); | 281 EXPECT_CALL(host_status_observer_, OnAccessDenied(session_jid1_)); |
| 289 SimulateClientConnection(0, false, false); | 282 SimulateClientConnection(0, false, false); |
| 290 } | 283 } |
| 291 | 284 |
| 292 TEST_F(ChromotingHostTest, Reconnect) { | 285 TEST_F(ChromotingHostTest, Reconnect) { |
| 293 ExpectHostAndSessionManagerStart(); | 286 StartHost(); |
| 294 host_->Start(xmpp_login_); | |
| 295 | 287 |
| 296 // Connect first client. | 288 // Connect first client. |
| 297 ExpectClientConnected(0); | 289 ExpectClientConnected(0); |
| 298 SimulateClientConnection(0, true, false); | 290 SimulateClientConnection(0, true, false); |
| 299 | 291 |
| 300 // Disconnect first client. | 292 // Disconnect first client. |
| 301 ExpectClientDisconnected(0); | 293 ExpectClientDisconnected(0); |
| 302 client1_->OnConnectionClosed(connection1_, protocol::OK); | 294 client1_->OnConnectionClosed(connection1_, protocol::OK); |
| 303 | 295 |
| 304 // Connect second client. | 296 // Connect second client. |
| 305 ExpectClientConnected(1); | 297 ExpectClientConnected(1); |
| 306 SimulateClientConnection(1, true, false); | 298 SimulateClientConnection(1, true, false); |
| 307 | 299 |
| 308 // Disconnect second client. | 300 // Disconnect second client. |
| 309 ExpectClientDisconnected(1); | 301 ExpectClientDisconnected(1); |
| 310 client2_->OnConnectionClosed(connection2_, protocol::OK); | 302 client2_->OnConnectionClosed(connection2_, protocol::OK); |
| 311 } | 303 } |
| 312 | 304 |
| 313 TEST_F(ChromotingHostTest, ConnectWhenAnotherClientIsConnected) { | 305 TEST_F(ChromotingHostTest, ConnectWhenAnotherClientIsConnected) { |
| 314 ExpectHostAndSessionManagerStart(); | 306 StartHost(); |
| 315 host_->Start(xmpp_login_); | |
| 316 | 307 |
| 317 // Connect first client. | 308 // Connect first client. |
| 318 ExpectClientConnected(0); | 309 ExpectClientConnected(0); |
| 319 SimulateClientConnection(0, true, false); | 310 SimulateClientConnection(0, true, false); |
| 320 | 311 |
| 321 // Connect second client. First client should be disconnected automatically. | 312 // Connect second client. First client should be disconnected automatically. |
| 322 { | 313 { |
| 323 InSequence s; | 314 InSequence s; |
| 324 ExpectClientDisconnected(0); | 315 ExpectClientDisconnected(0); |
| 325 ExpectClientConnected(1); | 316 ExpectClientConnected(1); |
| 326 } | 317 } |
| 327 SimulateClientConnection(1, true, false); | 318 SimulateClientConnection(1, true, false); |
| 328 | 319 |
| 329 // Disconnect second client. | 320 // Disconnect second client. |
| 330 ExpectClientDisconnected(1); | 321 ExpectClientDisconnected(1); |
| 331 client2_->OnConnectionClosed(connection2_, protocol::OK); | 322 client2_->OnConnectionClosed(connection2_, protocol::OK); |
| 332 } | 323 } |
| 333 | 324 |
| 334 TEST_F(ChromotingHostTest, IncomingSessionAccepted) { | 325 TEST_F(ChromotingHostTest, IncomingSessionAccepted) { |
| 335 ExpectHostAndSessionManagerStart(); | 326 StartHost(); |
| 336 host_->Start(xmpp_login_); | |
| 337 | 327 |
| 338 MockSession* session = session_unowned1_.get(); | 328 MockSession* session = session_unowned1_.get(); |
| 339 protocol::SessionManager::IncomingSessionResponse response = | 329 protocol::SessionManager::IncomingSessionResponse response = |
| 340 protocol::SessionManager::DECLINE; | 330 protocol::SessionManager::DECLINE; |
| 341 host_->OnIncomingSession(session_unowned1_.release(), &response); | 331 host_->OnIncomingSession(session_unowned1_.release(), &response); |
| 342 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); | 332 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); |
| 343 | 333 |
| 344 EXPECT_CALL(*session, Close(_)).WillOnce(InvokeWithoutArgs( | 334 EXPECT_CALL(*session, Close(_)).WillOnce(InvokeWithoutArgs( |
| 345 this, &ChromotingHostTest::NotifyConnectionClosed1)); | 335 this, &ChromotingHostTest::NotifyConnectionClosed1)); |
| 346 ShutdownHost(); | 336 ShutdownHost(); |
| 347 } | 337 } |
| 348 | 338 |
| 349 TEST_F(ChromotingHostTest, LoginBackOffUponConnection) { | 339 TEST_F(ChromotingHostTest, LoginBackOffUponConnection) { |
| 350 ExpectHostAndSessionManagerStart(); | 340 StartHost(); |
| 351 host_->Start(xmpp_login_); | |
| 352 | 341 |
| 353 protocol::SessionManager::IncomingSessionResponse response = | 342 protocol::SessionManager::IncomingSessionResponse response = |
| 354 protocol::SessionManager::DECLINE; | 343 protocol::SessionManager::DECLINE; |
| 355 | 344 |
| 356 EXPECT_CALL(*session_unowned1_, Close(_)).WillOnce( | 345 EXPECT_CALL(*session_unowned1_, Close(_)).WillOnce( |
| 357 InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed1)); | 346 InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed1)); |
| 358 host_->OnIncomingSession(session_unowned1_.release(), &response); | 347 host_->OnIncomingSession(session_unowned1_.release(), &response); |
| 359 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); | 348 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); |
| 360 | 349 |
| 361 host_->OnSessionAuthenticating(get_clients_from_host().front()); | 350 host_->OnSessionAuthenticating(get_clients_from_host().front()); |
| 362 host_->OnIncomingSession(session_unowned2_.get(), &response); | 351 host_->OnIncomingSession(session_unowned2_.get(), &response); |
| 363 EXPECT_EQ(protocol::SessionManager::OVERLOAD, response); | 352 EXPECT_EQ(protocol::SessionManager::OVERLOAD, response); |
| 364 } | 353 } |
| 365 | 354 |
| 366 TEST_F(ChromotingHostTest, LoginBackOffUponAuthenticating) { | 355 TEST_F(ChromotingHostTest, LoginBackOffUponAuthenticating) { |
| 367 ExpectHostAndSessionManagerStart(); | 356 StartHost(); |
| 368 | 357 |
| 369 EXPECT_CALL(*session_unowned1_, Close(_)).WillOnce( | 358 EXPECT_CALL(*session_unowned1_, Close(_)).WillOnce( |
| 370 InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed1)); | 359 InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed1)); |
| 371 | 360 |
| 372 EXPECT_CALL(*session_unowned2_, Close(_)).WillOnce( | 361 EXPECT_CALL(*session_unowned2_, Close(_)).WillOnce( |
| 373 InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed2)); | 362 InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed2)); |
| 374 | 363 |
| 375 host_->Start(xmpp_login_); | |
| 376 | |
| 377 protocol::SessionManager::IncomingSessionResponse response = | 364 protocol::SessionManager::IncomingSessionResponse response = |
| 378 protocol::SessionManager::DECLINE; | 365 protocol::SessionManager::DECLINE; |
| 379 | 366 |
| 380 host_->OnIncomingSession(session_unowned1_.release(), &response); | 367 host_->OnIncomingSession(session_unowned1_.release(), &response); |
| 381 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); | 368 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); |
| 382 | 369 |
| 383 host_->OnIncomingSession(session_unowned2_.release(), &response); | 370 host_->OnIncomingSession(session_unowned2_.release(), &response); |
| 384 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); | 371 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); |
| 385 | 372 |
| 386 // This will set the backoff. | 373 // This will set the backoff. |
| 387 host_->OnSessionAuthenticating(get_clients_from_host().front()); | 374 host_->OnSessionAuthenticating(get_clients_from_host().front()); |
| 388 | 375 |
| 389 // This should disconnect client2. | 376 // This should disconnect client2. |
| 390 host_->OnSessionAuthenticating(get_clients_from_host().back()); | 377 host_->OnSessionAuthenticating(get_clients_from_host().back()); |
| 391 | 378 |
| 392 // Verify that the host only has 1 client at this point. | 379 // Verify that the host only has 1 client at this point. |
| 393 EXPECT_EQ(get_clients_from_host().size(), 1U); | 380 EXPECT_EQ(get_clients_from_host().size(), 1U); |
| 394 } | 381 } |
| 395 | 382 |
| 396 TEST_F(ChromotingHostTest, OnSessionRouteChange) { | 383 TEST_F(ChromotingHostTest, OnSessionRouteChange) { |
| 397 ExpectHostAndSessionManagerStart(); | 384 StartHost(); |
| 398 host_->Start(xmpp_login_); | |
| 399 | 385 |
| 400 | 386 |
| 401 ExpectClientConnected(0); | 387 ExpectClientConnected(0); |
| 402 SimulateClientConnection(0, true, false); | 388 SimulateClientConnection(0, true, false); |
| 403 | 389 |
| 404 std::string channel_name("ChannelName"); | 390 std::string channel_name("ChannelName"); |
| 405 protocol::TransportRoute route; | 391 protocol::TransportRoute route; |
| 406 EXPECT_CALL(host_status_observer_, | 392 EXPECT_CALL(host_status_observer_, |
| 407 OnClientRouteChange(session_jid1_, channel_name, _)); | 393 OnClientRouteChange(session_jid1_, channel_name, _)); |
| 408 host_->OnSessionRouteChange(get_client(0), channel_name, route); | 394 host_->OnSessionRouteChange(get_client(0), channel_name, route); |
| 409 } | 395 } |
| 410 | 396 |
| 411 TEST_F(ChromotingHostTest, DisconnectAllClients) { | 397 TEST_F(ChromotingHostTest, DisconnectAllClients) { |
| 412 ExpectHostAndSessionManagerStart(); | 398 StartHost(); |
| 413 host_->Start(xmpp_login_); | |
| 414 | 399 |
| 415 ExpectClientConnected(0); | 400 ExpectClientConnected(0); |
| 416 SimulateClientConnection(0, true, false); | 401 SimulateClientConnection(0, true, false); |
| 417 | 402 |
| 418 ExpectClientDisconnected(0); | 403 ExpectClientDisconnected(0); |
| 419 DisconnectAllClients(); | 404 DisconnectAllClients(); |
| 420 testing::Mock::VerifyAndClearExpectations(&host_status_observer_); | 405 testing::Mock::VerifyAndClearExpectations(&host_status_observer_); |
| 421 } | 406 } |
| 422 | 407 |
| 423 } // namespace remoting | 408 } // namespace remoting |
| OLD | NEW |