15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind_helpers.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/base/auto_thread_task_runner.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/audio_capturer.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/chromoting_host.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/host/chromoting_host_context.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/desktop_environment.h" 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "remoting/host/fake_desktop_capturer.h" 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "remoting/host/fake_mouse_cursor_monitor.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/host_mock_objects.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/video.pb.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/errors.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/protocol_mock_objects.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/session_config.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/signaling/mock_signal_strategy.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock_mutant.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockClientStub; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockConnectionToClient; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockConnectionToClientEventHandler; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockHostStub; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockSession; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockVideoStub; 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing ::remoting::protocol::Session; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::SessionConfig; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtLeast; 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing testing::AtMost; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::CreateFunctor; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DeleteArg; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Expectation; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeArgument; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeWithoutArgs; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ReturnRef; 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing testing::SaveArg; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Sequence; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PostQuitTask(base::MessageLoop* message_loop) { 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Run the task and delete it afterwards. This action is used to deal with 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// done callbacks. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(RunDoneTask) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1.Run(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromotingHostTest : public testing::Test { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromotingHostTest() { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_ = new AutoThreadTaskRunner( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChromotingHostTest::QuitMainMessageLoop, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_environment_factory_.reset(new MockDesktopEnvironmentFactory()); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment_factory_, CreatePtr()) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Invoke(this, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ChromotingHostTest::CreateDesktopEnvironment)); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment_factory_, SupportsAudioCapture()) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(AnyNumber()) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillRepeatedly(Return(false)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_manager_ = new protocol::MockSessionManager(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_.reset(new ChromotingHost( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &signal_strategy_, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_environment_factory_.get(), 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<protocol::SessionManager>(session_manager_), 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Audio 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Input 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Video capture 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Video encode 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Network 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_)); // UI 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->AddStatusObserver(&host_status_observer_); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmpp_login_ = "host@domain"; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session1_ = new MockSession(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session2_ = new MockSession(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned1_.reset(new MockSession()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned2_.reset(new MockSession()); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_config1_ = SessionConfig::ForTest(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_jid1_ = "user@domain/rest-of-jid"; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_config2_ = SessionConfig::ForTest(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_jid2_ = "user2@domain/rest-of-jid"; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned_config1_ = SessionConfig::ForTest(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned_jid1_ = "user3@doman/rest-of-jid"; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned_config2_ = SessionConfig::ForTest(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned_jid2_ = "user4@doman/rest-of-jid"; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session1_, jid()) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_jid1_)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session2_, jid()) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_jid2_)); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, jid()) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_unowned_jid1_)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned2_, jid()) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_unowned_jid2_)); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session1_, SetEventHandler(_)) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session2_, SetEventHandler(_)) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, SetEventHandler(_)) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()) 130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch .WillRepeatedly(SaveArg<0>(&session_unowned1_event_handler_)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned2_, SetEventHandler(_)) 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch .Times(AnyNumber()) 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch .WillRepeatedly(SaveArg<0>(&session_unowned2_event_handler_)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session1_, config()) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_config1_)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session2_, config()) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_config2_)); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owned_connection1_.reset(new MockConnectionToClient(session1_, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &host_stub1_)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection1_ = owned_connection1_.get(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owned_connection2_.reset(new MockConnectionToClient(session2_, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &host_stub2_)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection2_ = owned_connection2_.get(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(video_stub1_, ProcessVideoPacketPtr(_, _)) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(DeleteArg<0>()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(video_stub2_, ProcessVideoPacketPtr(_, _)) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(DeleteArg<0>()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection1_, video_stub()) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(&video_stub1_)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection1_, client_stub()) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(&client_stub1_)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection1_, session()) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(session1_)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection2_, video_stub()) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(&video_stub2_)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection2_, client_stub()) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(&client_stub2_)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection2_, session()) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(session2_)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection1_, video_stub()) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection1_, client_stub()) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection1_, session()) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection2_, video_stub()) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection2_, client_stub()) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection2_, session()) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_candidate_config_ = 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::CandidateSessionConfig::CreateEmpty(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_candidate_config_ = 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::CandidateSessionConfig::CreateDefault(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to pretend a client is connected to ChromotingHost. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateClientConnection(int connection_index, bool authenticate, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reject) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<protocol::ConnectionToClient> connection = 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((connection_index == 0) ? owned_connection1_ : owned_connection2_). 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PassAs<protocol::ConnectionToClient>(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::ConnectionToClient* connection_ptr = connection.get(); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ClientSession> client(new ClientSession( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_.get(), 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Audio 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Input 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Video capture 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Video encode 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Network 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // UI 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection.Pass(), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_environment_factory_.get(), 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::TimeDelta(), 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL, 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<HostExtension*>())); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_ptr->set_host_stub(client.get()); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (authenticate) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_->PostTask( 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&ClientSession::OnConnectionAuthenticated, 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(client.get()), connection_ptr)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!reject) { 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_->PostTask( 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClientSession::OnConnectionChannelsConnected, 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(client.get()), connection_ptr)); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_->PostTask( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&ClientSession::OnConnectionClosed, 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(client.get()), connection_ptr, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::AUTHENTICATION_FAILED)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) get_client(connection_index) = client.get(); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |host| is responsible for deleting |client| from now on. 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_->clients_.push_back(client.release()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that the host has been properly deleted. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(host_.get() == NULL); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the session route for |client1_|. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ChangeSessionRoute(const std::string& channel_name, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const protocol::TransportRoute& route) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnSessionRouteChange(get_client(0), channel_name, route); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Creates a DesktopEnvironment with a fake webrtc::DesktopCapturer, to mock 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DesktopEnvironmentFactory::Create(). 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopEnvironment* CreateDesktopEnvironment() { 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockDesktopEnvironment* desktop_environment = new MockDesktopEnvironment(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr()) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(0); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr()) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)) 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Invoke(this, &ChromotingHostTest::CreateInputInjector)); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment, CreateScreenControlsPtr()) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr()) 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)) 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Invoke(this, &ChromotingHostTest::CreateVideoCapturer)); 2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_CALL(*desktop_environment, CreateMouseCursorMonitorPtr()) 2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Times(AtMost(1)) 2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .WillOnce(Invoke(this, &ChromotingHostTest::CreateMouseCursorMonitor)); 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*desktop_environment, GetCapabilities()) 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)); 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*desktop_environment, SetCapabilities(_)) 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return desktop_environment; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a dummy InputInjector, to mock 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DesktopEnvironment::CreateInputInjector(). 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InputInjector* CreateInputInjector() { 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockInputInjector* input_injector = new MockInputInjector(); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*input_injector, StartPtr(_)); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return input_injector; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Creates a fake webrtc::DesktopCapturer, to mock 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DesktopEnvironment::CreateVideoCapturer(). 2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) webrtc::DesktopCapturer* CreateVideoCapturer() { 2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return new FakeDesktopCapturer(); 2766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Creates a MockMouseCursorMonitor, to mock 2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // DesktopEnvironment::CreateMouseCursorMonitor(). 2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) webrtc::MouseCursorMonitor* CreateMouseCursorMonitor() { 2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return new FakeMouseCursorMonitor(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisconnectAllClients() { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->DisconnectAllClients(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to disconnect client 1 from the host. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisconnectClient1() { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyClientSessionClosed(0); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify |host_| that the authenticating client has been rejected. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RejectAuthenticatingClient() { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->RejectAuthenticatingClient(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify |host_| that a client session has closed. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyClientSessionClosed(int connection_index) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_client(connection_index)->OnConnectionClosed( 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_connection(connection_index), protocol::OK); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void NotifyConnectionClosed1() { 305c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (session_unowned1_event_handler_) { 306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch session_unowned1_event_handler_->OnSessionStateChange(Session::CLOSED); 307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void NotifyConnectionClosed2() { 311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (session_unowned2_event_handler_) { 312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch session_unowned2_event_handler_->OnSessionStateChange(Session::CLOSED); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutdownHost() { 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_->PostTask( 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&ChromotingHostTest::StopAndReleaseTaskRunner, 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void StopAndReleaseTaskRunner() { 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_.reset(); 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_ = NULL; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_environment_factory_.reset(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void QuitMainMessageLoop() { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostQuitTask(&message_loop_); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect the host and session manager to start, and return the expectation 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the session manager has started. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation ExpectHostAndSessionManagerStart() { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnStart(xmpp_login_)); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EXPECT_CALL(*session_manager_, Init(_, host_.get())); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect a client to connect. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return an expectation that a session has started, and that the first 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // video packet has been sent to the client. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do |action| when that happens. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <class A> 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation ExpectClientConnected(int connection_index, A action) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& session_jid = get_session_jid(connection_index); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoStub& video_stub = get_video_stub(connection_index); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_authenticated = 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientAuthenticated(session_jid)); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientConnected(session_jid)) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(client_authenticated); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent = 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(video_stub, ProcessVideoPacketPtr(_, _)) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(client_authenticated) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll( 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunDoneTask())) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(video_stub, ProcessVideoPacketPtr(_, _)) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(video_packet_sent) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(RunDoneTask()); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return video_packet_sent; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return an expectation that a client will disconnect after a given 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expectation. The given action will be done after the event executor is 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notified that the session has finished. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <class A> 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation ExpectClientDisconnected(int connection_index, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expect_host_status_change, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation after, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A action) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClient* connection = get_connection(connection_index); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_disconnected = 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection, Disconnect()) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(after) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs(CreateFunctor( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &ChromotingHostTest::NotifyClientSessionClosed, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection_index))) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnectEffects(connection_index, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_host_status_change, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) after, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return client_disconnected; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect the side-effects of a client disconnection, after a given 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expectation. The given action will be done after the event executor is 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifed that the session has finished. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <class A> 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectClientDisconnectEffects(int connection_index, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expect_host_status_change, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation after, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A action) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& session_jid = get_session_jid(connection_index); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expect_host_status_change) { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientDisconnected(session_jid)) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(after) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(action) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<AutoThreadTaskRunner> task_runner_; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClientEventHandler handler_; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSignalStrategy signal_strategy_; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockDesktopEnvironmentFactory> desktop_environment_factory_; 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ChromotingHost> host_; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostStatusObserver host_status_observer_; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::MockSessionManager* session_manager_; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string xmpp_login_; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClient* connection1_; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockConnectionToClient> owned_connection1_; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSession* client1_; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_jid1_; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSession* session1_; // Owned by |connection_|. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig session_config1_; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoStub video_stub1_; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockClientStub client_stub1_; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostStub host_stub1_; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClient* connection2_; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockConnectionToClient> owned_connection2_; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSession* client2_; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_jid2_; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSession* session2_; // Owned by |connection2_|. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig session_config2_; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoStub video_stub2_; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockClientStub client_stub2_; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostStub host_stub2_; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockSession> session_unowned1_; // Not owned by a connection. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig session_unowned_config1_; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_unowned_jid1_; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockSession> session_unowned2_; // Not owned by a connection. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig session_unowned_config2_; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_unowned_jid2_; 443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protocol::Session::EventHandler* session_unowned1_event_handler_; 444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protocol::Session::EventHandler* session_unowned2_event_handler_; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<protocol::CandidateSessionConfig> empty_candidate_config_; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<protocol::CandidateSessionConfig> default_candidate_config_; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClient*& get_connection(int connection_index) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (connection_index == 0) ? connection1_ : connection2_; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Returns the cached client pointers client1_ or client2_. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSession*& get_client(int connection_index) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (connection_index == 0) ? client1_ : client2_; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Returns the list of clients of the host_. 458c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::list<ClientSession*>& get_clients_from_host() { 459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return host_->clients_; 460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& get_session_jid(int connection_index) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (connection_index == 0) ? session_jid1_ : session_jid2_; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoStub& get_video_stub(int connection_index) { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (connection_index == 0) ? video_stub1_ : video_stub2_; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, StartAndShutdown) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation start = ExpectHostAndSessionManagerStart(); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()).After(start); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, Connect) { 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shut down the host when the first video packet is received. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent = ExpectClientConnected( 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_disconnected = ExpectClientDisconnected( 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, true, video_packet_sent, InvokeWithoutArgs(base::DoNothing)); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()).After(client_disconnected); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, RejectAuthenticatingClient) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation start = ExpectHostAndSessionManagerStart(); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientAuthenticated(session_jid1_)) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs( 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &ChromotingHostTest::RejectAuthenticatingClient)); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnected( 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, true, start, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, true); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, AuthenticationFailed) { 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnAccessDenied(session_jid1_)) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, false, false); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, Reconnect) { 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a video packet is received on the first connection, disconnect it, 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then quit the message loop. 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent1 = ExpectClientConnected(0, DoAll( 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs(this, &ChromotingHostTest::DisconnectClient1), 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs(this, &ChromotingHostTest::QuitMainMessageLoop))); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnectEffects( 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, true, video_packet_sent1, InvokeWithoutArgs(base::DoNothing)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a video packet is received on the second connection, shut down the 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // host. 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent2 = ExpectClientConnected( 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_disconnected2 = ExpectClientDisconnected( 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, true, video_packet_sent2, InvokeWithoutArgs(base::DoNothing)); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()).After(client_disconnected2); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(1, true, false); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, ConnectWhenAnotherClientIsConnected) { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a video packet is received, connect the second connection. 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should disconnect the first connection. 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent1 = ExpectClientConnected( 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs( 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateFunctor( 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ChromotingHostTest::SimulateClientConnection, 1, true, false))); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnected( 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, true, video_packet_sent1, InvokeWithoutArgs(base::DoNothing)); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent2 = ExpectClientConnected( 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_disconnected2 = ExpectClientDisconnected( 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, true, video_packet_sent2, InvokeWithoutArgs(base::DoNothing)); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()).After(client_disconnected2); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, IncomingSessionDeclined) { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::IncomingSessionResponse response = 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::ACCEPT; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session1_, &response); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::DECLINE, response); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, IncomingSessionIncompatible) { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce(Return( 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_candidate_config_.get())); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::IncomingSessionResponse response = 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::ACCEPT; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session_unowned1_.get(), &response); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::INCOMPATIBLE, response); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, IncomingSessionAccepted) { 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce(Return( 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_candidate_config_.get())); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, set_config(_)); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, Close()).WillOnce(InvokeWithoutArgs( 604c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this, &ChromotingHostTest::NotifyConnectionClosed1)); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnAccessDenied(_)); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::IncomingSessionResponse response = 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::DECLINE; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session_unowned1_.release(), &response); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::ACCEPT, response); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(ChromotingHostTest, LoginBackOffUponConnection) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce( 622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Return(default_candidate_config_.get())); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, set_config(_)); 624c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*session_unowned1_, Close()).WillOnce( 625c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed1)); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnAccessDenied(_)); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::IncomingSessionResponse response = 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::DECLINE; 633c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session_unowned1_.release(), &response); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::ACCEPT, response); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 637c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch host_->OnSessionAuthenticating(get_clients_from_host().front()); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session_unowned2_.get(), &response); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::OVERLOAD, response); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(ChromotingHostTest, LoginBackOffUponAuthenticating) { 646c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Expectation start = ExpectHostAndSessionManagerStart(); 647c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce( 648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Return(default_candidate_config_.get())); 649c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*session_unowned1_, set_config(_)); 650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*session_unowned1_, Close()).WillOnce( 651c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed1)); 652c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 653c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*session_unowned2_, candidate_config()).WillOnce( 654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Return(default_candidate_config_.get())); 655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*session_unowned2_, set_config(_)); 656c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(*session_unowned2_, Close()).WillOnce( 657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InvokeWithoutArgs(this, &ChromotingHostTest::NotifyConnectionClosed2)); 658c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 659c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_CALL(host_status_observer_, OnShutdown()); 660c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 661c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch host_->Start(xmpp_login_); 662c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 663c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protocol::SessionManager::IncomingSessionResponse response = 664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protocol::SessionManager::DECLINE; 665c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 666c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch host_->OnIncomingSession(session_unowned1_.release(), &response); 667c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(protocol::SessionManager::ACCEPT, response); 668c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 669c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch host_->OnIncomingSession(session_unowned2_.release(), &response); 670c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(protocol::SessionManager::ACCEPT, response); 671c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 672c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This will set the backoff. 673c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch host_->OnSessionAuthenticating(get_clients_from_host().front()); 674c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 675c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This should disconnect client2. 676c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch host_->OnSessionAuthenticating(get_clients_from_host().back()); 677c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 678c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Verify that the host only has 1 client at this point. 679c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(get_clients_from_host().size(), 1U); 680c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 681c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ShutdownHost(); 682c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message_loop_.Run(); 683c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 684c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, OnSessionRouteChange) { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string channel_name("ChannelName"); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::TransportRoute route; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent = ExpectClientConnected( 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, InvokeWithoutArgs(CreateFunctor( 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &ChromotingHostTest::ChangeSessionRoute, channel_name, route))); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation route_change = 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientRouteChange( 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_jid1_, channel_name, _)) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(video_packet_sent) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectClientDisconnected(0, true, route_change, 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvokeWithoutArgs(base::DoNothing)); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, DisconnectAllClients) { 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent = ExpectClientConnected( 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, InvokeWithoutArgs(this, &ChromotingHostTest::DisconnectAllClients)); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnected(0, true, video_packet_sent, 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 721