| 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 "base/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" |
| 9 #include "remoting/base/auto_thread_task_runner.h" | 9 #include "remoting/base/auto_thread_task_runner.h" |
| 10 #include "remoting/host/audio_capturer.h" | 10 #include "remoting/host/audio_capturer.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "testing/gmock/include/gmock/gmock.h" | 21 #include "testing/gmock/include/gmock/gmock.h" |
| 22 #include "testing/gmock_mutant.h" | 22 #include "testing/gmock_mutant.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 24 |
| 25 using ::remoting::protocol::MockClientStub; | 25 using ::remoting::protocol::MockClientStub; |
| 26 using ::remoting::protocol::MockConnectionToClient; | 26 using ::remoting::protocol::MockConnectionToClient; |
| 27 using ::remoting::protocol::MockConnectionToClientEventHandler; | 27 using ::remoting::protocol::MockConnectionToClientEventHandler; |
| 28 using ::remoting::protocol::MockHostStub; | 28 using ::remoting::protocol::MockHostStub; |
| 29 using ::remoting::protocol::MockSession; | 29 using ::remoting::protocol::MockSession; |
| 30 using ::remoting::protocol::MockVideoStub; | 30 using ::remoting::protocol::MockVideoStub; |
| 31 using ::remoting::protocol::Session; |
| 31 using ::remoting::protocol::SessionConfig; | 32 using ::remoting::protocol::SessionConfig; |
| 32 | 33 |
| 33 using testing::_; | 34 using testing::_; |
| 34 using testing::AnyNumber; | 35 using testing::AnyNumber; |
| 36 using testing::AtLeast; |
| 35 using testing::AtMost; | 37 using testing::AtMost; |
| 36 using testing::AtLeast; | |
| 37 using testing::CreateFunctor; | 38 using testing::CreateFunctor; |
| 38 using testing::DeleteArg; | 39 using testing::DeleteArg; |
| 39 using testing::DoAll; | 40 using testing::DoAll; |
| 40 using testing::Expectation; | 41 using testing::Expectation; |
| 41 using testing::InSequence; | 42 using testing::InSequence; |
| 42 using testing::Invoke; | 43 using testing::Invoke; |
| 43 using testing::InvokeArgument; | 44 using testing::InvokeArgument; |
| 44 using testing::InvokeWithoutArgs; | 45 using testing::InvokeWithoutArgs; |
| 45 using testing::Return; | 46 using testing::Return; |
| 46 using testing::ReturnRef; | 47 using testing::ReturnRef; |
| 48 using testing::SaveArg; |
| 47 using testing::Sequence; | 49 using testing::Sequence; |
| 48 | 50 |
| 49 namespace remoting { | 51 namespace remoting { |
| 50 | 52 |
| 51 namespace { | 53 namespace { |
| 52 | 54 |
| 53 void PostQuitTask(base::MessageLoop* message_loop) { | 55 void PostQuitTask(base::MessageLoop* message_loop) { |
| 54 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); | 56 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); |
| 55 } | 57 } |
| 56 | 58 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 EXPECT_CALL(*session_unowned1_, jid()) | 119 EXPECT_CALL(*session_unowned1_, jid()) |
| 118 .WillRepeatedly(ReturnRef(session_unowned_jid1_)); | 120 .WillRepeatedly(ReturnRef(session_unowned_jid1_)); |
| 119 EXPECT_CALL(*session_unowned2_, jid()) | 121 EXPECT_CALL(*session_unowned2_, jid()) |
| 120 .WillRepeatedly(ReturnRef(session_unowned_jid2_)); | 122 .WillRepeatedly(ReturnRef(session_unowned_jid2_)); |
| 121 EXPECT_CALL(*session1_, SetEventHandler(_)) | 123 EXPECT_CALL(*session1_, SetEventHandler(_)) |
| 122 .Times(AnyNumber()); | 124 .Times(AnyNumber()); |
| 123 EXPECT_CALL(*session2_, SetEventHandler(_)) | 125 EXPECT_CALL(*session2_, SetEventHandler(_)) |
| 124 .Times(AnyNumber()); | 126 .Times(AnyNumber()); |
| 125 EXPECT_CALL(*session_unowned1_, SetEventHandler(_)) | 127 EXPECT_CALL(*session_unowned1_, SetEventHandler(_)) |
| 126 .Times(AnyNumber()) | 128 .Times(AnyNumber()) |
| 127 .WillRepeatedly(Invoke(this, &ChromotingHostTest::SetEventHandler)); | 129 .WillRepeatedly(SaveArg<0>(&session_unowned1_event_handler_)); |
| 128 EXPECT_CALL(*session_unowned2_, SetEventHandler(_)) | 130 EXPECT_CALL(*session_unowned2_, SetEventHandler(_)) |
| 129 .Times(AnyNumber()); | 131 .Times(AnyNumber()) |
| 132 .WillRepeatedly(SaveArg<0>(&session_unowned2_event_handler_)); |
| 130 EXPECT_CALL(*session1_, config()) | 133 EXPECT_CALL(*session1_, config()) |
| 131 .WillRepeatedly(ReturnRef(session_config1_)); | 134 .WillRepeatedly(ReturnRef(session_config1_)); |
| 132 EXPECT_CALL(*session2_, config()) | 135 EXPECT_CALL(*session2_, config()) |
| 133 .WillRepeatedly(ReturnRef(session_config2_)); | 136 .WillRepeatedly(ReturnRef(session_config2_)); |
| 134 | 137 |
| 135 owned_connection1_.reset(new MockConnectionToClient(session1_, | 138 owned_connection1_.reset(new MockConnectionToClient(session1_, |
| 136 &host_stub1_)); | 139 &host_stub1_)); |
| 137 connection1_ = owned_connection1_.get(); | 140 connection1_ = owned_connection1_.get(); |
| 138 owned_connection2_.reset(new MockConnectionToClient(session2_, | 141 owned_connection2_.reset(new MockConnectionToClient(session2_, |
| 139 &host_stub2_)); | 142 &host_stub2_)); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 void RejectAuthenticatingClient() { | 283 void RejectAuthenticatingClient() { |
| 281 host_->RejectAuthenticatingClient(); | 284 host_->RejectAuthenticatingClient(); |
| 282 } | 285 } |
| 283 | 286 |
| 284 // Notify |host_| that a client session has closed. | 287 // Notify |host_| that a client session has closed. |
| 285 void NotifyClientSessionClosed(int connection_index) { | 288 void NotifyClientSessionClosed(int connection_index) { |
| 286 get_client(connection_index)->OnConnectionClosed( | 289 get_client(connection_index)->OnConnectionClosed( |
| 287 get_connection(connection_index), protocol::OK); | 290 get_connection(connection_index), protocol::OK); |
| 288 } | 291 } |
| 289 | 292 |
| 290 void SetEventHandler(protocol::Session::EventHandler* event_handler) { | 293 void NotifyConnectionClosed1() { |
| 291 session_event_handler_ = event_handler; | 294 if (session_unowned1_event_handler_) { |
| 292 } | 295 session_unowned1_event_handler_->OnSessionStateChange(Session::CLOSED); |
| 293 | |
| 294 void NotifyConnectionClosed() { | |
| 295 if (session_event_handler_) { | |
| 296 session_event_handler_->OnSessionStateChange(protocol::Session::CLOSED); | |
| 297 } | 296 } |
| 298 } | 297 } |
| 299 | 298 |
| 299 void NotifyConnectionClosed2() { |
| 300 if (session_unowned2_event_handler_) { |
| 301 session_unowned2_event_handler_->OnSessionStateChange(Session::CLOSED); |
| 302 } |
| 303 } |
| 304 |
| 300 void ShutdownHost() { | 305 void ShutdownHost() { |
| 301 task_runner_->PostTask( | 306 task_runner_->PostTask( |
| 302 FROM_HERE, | 307 FROM_HERE, |
| 303 base::Bind(&ChromotingHostTest::StopAndReleaseTaskRunner, | 308 base::Bind(&ChromotingHostTest::StopAndReleaseTaskRunner, |
| 304 base::Unretained(this))); | 309 base::Unretained(this))); |
| 305 } | 310 } |
| 306 | 311 |
| 307 void StopAndReleaseTaskRunner() { | 312 void StopAndReleaseTaskRunner() { |
| 308 host_.reset(); | 313 host_.reset(); |
| 309 task_runner_ = NULL; | 314 task_runner_ = NULL; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 SessionConfig session_config2_; | 422 SessionConfig session_config2_; |
| 418 MockVideoStub video_stub2_; | 423 MockVideoStub video_stub2_; |
| 419 MockClientStub client_stub2_; | 424 MockClientStub client_stub2_; |
| 420 MockHostStub host_stub2_; | 425 MockHostStub host_stub2_; |
| 421 scoped_ptr<MockSession> session_unowned1_; // Not owned by a connection. | 426 scoped_ptr<MockSession> session_unowned1_; // Not owned by a connection. |
| 422 SessionConfig session_unowned_config1_; | 427 SessionConfig session_unowned_config1_; |
| 423 std::string session_unowned_jid1_; | 428 std::string session_unowned_jid1_; |
| 424 scoped_ptr<MockSession> session_unowned2_; // Not owned by a connection. | 429 scoped_ptr<MockSession> session_unowned2_; // Not owned by a connection. |
| 425 SessionConfig session_unowned_config2_; | 430 SessionConfig session_unowned_config2_; |
| 426 std::string session_unowned_jid2_; | 431 std::string session_unowned_jid2_; |
| 427 protocol::Session::EventHandler* session_event_handler_; | 432 protocol::Session::EventHandler* session_unowned1_event_handler_; |
| 433 protocol::Session::EventHandler* session_unowned2_event_handler_; |
| 428 scoped_ptr<protocol::CandidateSessionConfig> empty_candidate_config_; | 434 scoped_ptr<protocol::CandidateSessionConfig> empty_candidate_config_; |
| 429 scoped_ptr<protocol::CandidateSessionConfig> default_candidate_config_; | 435 scoped_ptr<protocol::CandidateSessionConfig> default_candidate_config_; |
| 430 | 436 |
| 431 MockConnectionToClient*& get_connection(int connection_index) { | 437 MockConnectionToClient*& get_connection(int connection_index) { |
| 432 return (connection_index == 0) ? connection1_ : connection2_; | 438 return (connection_index == 0) ? connection1_ : connection2_; |
| 433 } | 439 } |
| 434 | 440 |
| 441 // Returns the cached client pointers client1_ or client2_. |
| 435 ClientSession*& get_client(int connection_index) { | 442 ClientSession*& get_client(int connection_index) { |
| 436 return (connection_index == 0) ? client1_ : client2_; | 443 return (connection_index == 0) ? client1_ : client2_; |
| 437 } | 444 } |
| 438 | 445 |
| 446 // Returns the list of clients of the host_. |
| 447 std::list<ClientSession*>& get_clients_from_host() { |
| 448 return host_->clients_; |
| 449 } |
| 450 |
| 439 const std::string& get_session_jid(int connection_index) { | 451 const std::string& get_session_jid(int connection_index) { |
| 440 return (connection_index == 0) ? session_jid1_ : session_jid2_; | 452 return (connection_index == 0) ? session_jid1_ : session_jid2_; |
| 441 } | 453 } |
| 442 | 454 |
| 443 MockVideoStub& get_video_stub(int connection_index) { | 455 MockVideoStub& get_video_stub(int connection_index) { |
| 444 return (connection_index == 0) ? video_stub1_ : video_stub2_; | 456 return (connection_index == 0) ? video_stub1_ : video_stub2_; |
| 445 } | 457 } |
| 446 }; | 458 }; |
| 447 | 459 |
| 448 TEST_F(ChromotingHostTest, StartAndShutdown) { | 460 TEST_F(ChromotingHostTest, StartAndShutdown) { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 ShutdownHost(); | 583 ShutdownHost(); |
| 572 message_loop_.Run(); | 584 message_loop_.Run(); |
| 573 } | 585 } |
| 574 | 586 |
| 575 TEST_F(ChromotingHostTest, IncomingSessionAccepted) { | 587 TEST_F(ChromotingHostTest, IncomingSessionAccepted) { |
| 576 ExpectHostAndSessionManagerStart(); | 588 ExpectHostAndSessionManagerStart(); |
| 577 EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce(Return( | 589 EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce(Return( |
| 578 default_candidate_config_.get())); | 590 default_candidate_config_.get())); |
| 579 EXPECT_CALL(*session_unowned1_, set_config(_)); | 591 EXPECT_CALL(*session_unowned1_, set_config(_)); |
| 580 EXPECT_CALL(*session_unowned1_, Close()).WillOnce(InvokeWithoutArgs( | 592 EXPECT_CALL(*session_unowned1_, Close()).WillOnce(InvokeWithoutArgs( |
| 581 this, &ChromotingHostTest::NotifyConnectionClosed)); | 593 this, &ChromotingHostTest::NotifyConnectionClosed1)); |
| 582 EXPECT_CALL(host_status_observer_, OnAccessDenied(_)); | 594 EXPECT_CALL(host_status_observer_, OnAccessDenied(_)); |
| 583 EXPECT_CALL(host_status_observer_, OnShutdown()); | 595 EXPECT_CALL(host_status_observer_, OnShutdown()); |
| 584 | 596 |
| 585 host_->Start(xmpp_login_); | 597 host_->Start(xmpp_login_); |
| 586 | 598 |
| 587 protocol::SessionManager::IncomingSessionResponse response = | 599 protocol::SessionManager::IncomingSessionResponse response = |
| 588 protocol::SessionManager::DECLINE; | 600 protocol::SessionManager::DECLINE; |
| 589 host_->OnIncomingSession(session_unowned1_.release(), &response); | 601 host_->OnIncomingSession(session_unowned1_.release(), &response); |
| 590 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); | 602 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); |
| 591 | 603 |
| 592 ShutdownHost(); | 604 ShutdownHost(); |
| 593 message_loop_.Run(); | 605 message_loop_.Run(); |
| 594 } | 606 } |
| 595 | 607 |
| 596 TEST_F(ChromotingHostTest, IncomingSessionOverload) { | 608 TEST_F(ChromotingHostTest, LoginBackOffUponConnection) { |
| 597 ExpectHostAndSessionManagerStart(); | 609 ExpectHostAndSessionManagerStart(); |
| 598 EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce(Return( | 610 EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce( |
| 599 default_candidate_config_.get())); | 611 Return(default_candidate_config_.get())); |
| 600 EXPECT_CALL(*session_unowned1_, set_config(_)); | 612 EXPECT_CALL(*session_unowned1_, set_config(_)); |
| 601 EXPECT_CALL(*session_unowned1_, Close()).WillOnce(InvokeWithoutArgs( | 613 EXPECT_CALL(*session_unowned1_, Close()).WillOnce( |
| 602 this, &ChromotingHostTest::NotifyConnectionClosed)); | 614 InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed1)); |
| 603 EXPECT_CALL(host_status_observer_, OnAccessDenied(_)); | 615 EXPECT_CALL(host_status_observer_, OnAccessDenied(_)); |
| 604 EXPECT_CALL(host_status_observer_, OnShutdown()); | 616 EXPECT_CALL(host_status_observer_, OnShutdown()); |
| 605 | 617 |
| 606 host_->Start(xmpp_login_); | 618 host_->Start(xmpp_login_); |
| 607 | 619 |
| 608 protocol::SessionManager::IncomingSessionResponse response = | 620 protocol::SessionManager::IncomingSessionResponse response = |
| 609 protocol::SessionManager::DECLINE; | 621 protocol::SessionManager::DECLINE; |
| 622 |
| 610 host_->OnIncomingSession(session_unowned1_.release(), &response); | 623 host_->OnIncomingSession(session_unowned1_.release(), &response); |
| 611 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); | 624 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); |
| 612 | 625 |
| 626 host_->OnSessionAuthenticating(get_clients_from_host().front()); |
| 613 host_->OnIncomingSession(session_unowned2_.get(), &response); | 627 host_->OnIncomingSession(session_unowned2_.get(), &response); |
| 614 EXPECT_EQ(protocol::SessionManager::OVERLOAD, response); | 628 EXPECT_EQ(protocol::SessionManager::OVERLOAD, response); |
| 615 | 629 |
| 616 ShutdownHost(); | 630 ShutdownHost(); |
| 617 message_loop_.Run(); | 631 message_loop_.Run(); |
| 618 } | 632 } |
| 619 | 633 |
| 634 TEST_F(ChromotingHostTest, LoginBackOffUponAuthenticating) { |
| 635 Expectation start = ExpectHostAndSessionManagerStart(); |
| 636 EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce( |
| 637 Return(default_candidate_config_.get())); |
| 638 EXPECT_CALL(*session_unowned1_, set_config(_)); |
| 639 EXPECT_CALL(*session_unowned1_, Close()).WillOnce( |
| 640 InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed1)); |
| 641 |
| 642 EXPECT_CALL(*session_unowned2_, candidate_config()).WillOnce( |
| 643 Return(default_candidate_config_.get())); |
| 644 EXPECT_CALL(*session_unowned2_, set_config(_)); |
| 645 EXPECT_CALL(*session_unowned2_, Close()).WillOnce( |
| 646 InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed2)); |
| 647 |
| 648 EXPECT_CALL(host_status_observer_, OnShutdown()); |
| 649 |
| 650 host_->Start(xmpp_login_); |
| 651 |
| 652 protocol::SessionManager::IncomingSessionResponse response = |
| 653 protocol::SessionManager::DECLINE; |
| 654 |
| 655 host_->OnIncomingSession(session_unowned1_.release(), &response); |
| 656 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); |
| 657 |
| 658 host_->OnIncomingSession(session_unowned2_.release(), &response); |
| 659 EXPECT_EQ(protocol::SessionManager::ACCEPT, response); |
| 660 |
| 661 // This will set the backoff. |
| 662 host_->OnSessionAuthenticating(get_clients_from_host().front()); |
| 663 |
| 664 // This should disconnect client2 |
| 665 host_->OnSessionAuthenticating(get_clients_from_host().back()); |
| 666 |
| 667 // Verify that the host only has 1 client at this point |
| 668 EXPECT_EQ(get_clients_from_host().size(), 1U); |
| 669 |
| 670 ShutdownHost(); |
| 671 message_loop_.Run(); |
| 672 } |
| 673 |
| 620 TEST_F(ChromotingHostTest, OnSessionRouteChange) { | 674 TEST_F(ChromotingHostTest, OnSessionRouteChange) { |
| 621 std::string channel_name("ChannelName"); | 675 std::string channel_name("ChannelName"); |
| 622 protocol::TransportRoute route; | 676 protocol::TransportRoute route; |
| 623 | 677 |
| 624 ExpectHostAndSessionManagerStart(); | 678 ExpectHostAndSessionManagerStart(); |
| 625 Expectation video_packet_sent = ExpectClientConnected( | 679 Expectation video_packet_sent = ExpectClientConnected( |
| 626 0, InvokeWithoutArgs(CreateFunctor( | 680 0, InvokeWithoutArgs(CreateFunctor( |
| 627 this, &ChromotingHostTest::ChangeSessionRoute, channel_name, route))); | 681 this, &ChromotingHostTest::ChangeSessionRoute, channel_name, route))); |
| 628 Expectation route_change = | 682 Expectation route_change = |
| 629 EXPECT_CALL(host_status_observer_, OnClientRouteChange( | 683 EXPECT_CALL(host_status_observer_, OnClientRouteChange( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 646 ExpectClientDisconnected(0, true, video_packet_sent, | 700 ExpectClientDisconnected(0, true, video_packet_sent, |
| 647 InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); | 701 InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); |
| 648 EXPECT_CALL(host_status_observer_, OnShutdown()); | 702 EXPECT_CALL(host_status_observer_, OnShutdown()); |
| 649 | 703 |
| 650 host_->Start(xmpp_login_); | 704 host_->Start(xmpp_login_); |
| 651 SimulateClientConnection(0, true, false); | 705 SimulateClientConnection(0, true, false); |
| 652 message_loop_.Run(); | 706 message_loop_.Run(); |
| 653 } | 707 } |
| 654 | 708 |
| 655 } // namespace remoting | 709 } // namespace remoting |
| OLD | NEW |