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" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/host_mock_objects.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "remoting/host/screen_capturer_fake.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/jingle_glue/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" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock_mutant.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockClientStub; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockConnectionToClient; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockConnectionToClientEventHandler; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockHostStub; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockSession; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::MockVideoStub; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::remoting::protocol::SessionConfig; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::AtMost; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtLeast; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::CreateFunctor; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DeleteArg; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Expectation; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeArgument; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InvokeWithoutArgs; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ReturnRef; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Sequence; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PostQuitTask(base::MessageLoop* message_loop) { 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Run the task and delete it afterwards. This action is used to deal with 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// done callbacks. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(RunDoneTask) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg1.Run(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromotingHostTest : public testing::Test { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromotingHostTest() { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_ = new AutoThreadTaskRunner( 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChromotingHostTest::QuitMainMessageLoop, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_environment_factory_.reset(new MockDesktopEnvironmentFactory()); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment_factory_, CreatePtr()) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Invoke(this, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ChromotingHostTest::CreateDesktopEnvironment)); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment_factory_, SupportsAudioCapture()) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(AnyNumber()) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillRepeatedly(Return(false)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_manager_ = new protocol::MockSessionManager(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_.reset(new ChromotingHost( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &signal_strategy_, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_environment_factory_.get(), 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<protocol::SessionManager>(session_manager_), 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Audio 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Input 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Video capture 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Video encode 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Network 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_)); // UI 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->AddStatusObserver(&host_status_observer_); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmpp_login_ = "host@domain"; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session1_ = new MockSession(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session2_ = new MockSession(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned1_.reset(new MockSession()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned2_.reset(new MockSession()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_config1_ = SessionConfig::ForTest(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_jid1_ = "user@domain/rest-of-jid"; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_config2_ = SessionConfig::ForTest(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_jid2_ = "user2@domain/rest-of-jid"; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned_config1_ = SessionConfig::ForTest(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned_jid1_ = "user3@doman/rest-of-jid"; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned_config2_ = SessionConfig::ForTest(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_unowned_jid2_ = "user4@doman/rest-of-jid"; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session1_, jid()) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_jid1_)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session2_, jid()) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_jid2_)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, jid()) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_unowned_jid1_)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned2_, jid()) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_unowned_jid2_)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session1_, SetEventHandler(_)) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session2_, SetEventHandler(_)) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, SetEventHandler(_)) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Invoke(this, &ChromotingHostTest::SetEventHandler)); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned2_, SetEventHandler(_)) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session1_, config()) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_config1_)); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session2_, config()) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(ReturnRef(session_config2_)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owned_connection1_.reset(new MockConnectionToClient(session1_, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &host_stub1_)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection1_ = owned_connection1_.get(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owned_connection2_.reset(new MockConnectionToClient(session2_, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &host_stub2_)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection2_ = owned_connection2_.get(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(video_stub1_, ProcessVideoPacketPtr(_, _)) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(DeleteArg<0>()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(video_stub2_, ProcessVideoPacketPtr(_, _)) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(DeleteArg<0>()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection1_, video_stub()) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(&video_stub1_)); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection1_, client_stub()) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(&client_stub1_)); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection1_, session()) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(session1_)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection2_, video_stub()) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(&video_stub2_)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection2_, client_stub()) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(&client_stub2_)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*connection2_, session()) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(session2_)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection1_, video_stub()) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection1_, client_stub()) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection1_, session()) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection2_, video_stub()) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection2_, client_stub()) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection2_, session()) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_candidate_config_ = 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::CandidateSessionConfig::CreateEmpty(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_candidate_config_ = 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::CandidateSessionConfig::CreateDefault(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to pretend a client is connected to ChromotingHost. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateClientConnection(int connection_index, bool authenticate, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reject) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<protocol::ConnectionToClient> connection = 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((connection_index == 0) ? owned_connection1_ : owned_connection2_). 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PassAs<protocol::ConnectionToClient>(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::ConnectionToClient* connection_ptr = connection.get(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ClientSession> client(new ClientSession( 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_.get(), 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Audio 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Input 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Video capture 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Video encode 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // Network 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_, // UI 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection.Pass(), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_environment_factory_.get(), 194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::TimeDelta(), 195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NULL)); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_ptr->set_host_stub(client.get()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (authenticate) { 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_->PostTask( 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&ClientSession::OnConnectionAuthenticated, 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(client.get()), connection_ptr)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!reject) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_->PostTask( 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClientSession::OnConnectionChannelsConnected, 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(client.get()), connection_ptr)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_->PostTask( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&ClientSession::OnConnectionClosed, 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(client.get()), connection_ptr, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::AUTHENTICATION_FAILED)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) get_client(connection_index) = client.get(); 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |host| is responsible for deleting |client| from now on. 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_->clients_.push_back(client.release()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that the host has been properly deleted. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(host_.get() == NULL); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the session route for |client1_|. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ChangeSessionRoute(const std::string& channel_name, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const protocol::TransportRoute& route) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnSessionRouteChange(get_client(0), channel_name, route); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Creates a DesktopEnvironment with a fake webrtc::ScreenCapturer, to mock 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DesktopEnvironmentFactory::Create(). 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopEnvironment* CreateDesktopEnvironment() { 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockDesktopEnvironment* desktop_environment = new MockDesktopEnvironment(); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr()) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(0); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr()) 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)) 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Invoke(this, &ChromotingHostTest::CreateInputInjector)); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment, CreateScreenControlsPtr()) 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr()) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)) 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Invoke(this, &ChromotingHostTest::CreateVideoCapturer)); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*desktop_environment, GetCapabilities()) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)); 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*desktop_environment, SetCapabilities(_)) 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(AtMost(1)); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return desktop_environment; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a dummy InputInjector, to mock 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DesktopEnvironment::CreateInputInjector(). 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InputInjector* CreateInputInjector() { 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockInputInjector* input_injector = new MockInputInjector(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*input_injector, StartPtr(_)); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return input_injector; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Creates a fake webrtc::ScreenCapturer, to mock 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DesktopEnvironment::CreateVideoCapturer(). 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) webrtc::ScreenCapturer* CreateVideoCapturer() { 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return new ScreenCapturerFake(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisconnectAllClients() { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->DisconnectAllClients(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to disconnect client 1 from the host. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisconnectClient1() { 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyClientSessionClosed(0); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify |host_| that the authenticating client has been rejected. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RejectAuthenticatingClient() { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->RejectAuthenticatingClient(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify |host_| that a client session has closed. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyClientSessionClosed(int connection_index) { 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_client(connection_index)->OnConnectionClosed( 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_connection(connection_index), protocol::OK); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetEventHandler(protocol::Session::EventHandler* event_handler) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_event_handler_ = event_handler; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyConnectionClosed() { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_event_handler_) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_event_handler_->OnSessionStateChange(protocol::Session::CLOSED); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutdownHost() { 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_->PostTask( 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&ChromotingHostTest::StopAndReleaseTaskRunner, 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void StopAndReleaseTaskRunner() { 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_.reset(); 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) task_runner_ = NULL; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_environment_factory_.reset(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void QuitMainMessageLoop() { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostQuitTask(&message_loop_); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect the host and session manager to start, and return the expectation 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the session manager has started. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation ExpectHostAndSessionManagerStart() { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnStart(xmpp_login_)); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EXPECT_CALL(*session_manager_, Init(_, host_.get())); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect a client to connect. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return an expectation that a session has started, and that the first 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // video packet has been sent to the client. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do |action| when that happens. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <class A> 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation ExpectClientConnected(int connection_index, A action) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& session_jid = get_session_jid(connection_index); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoStub& video_stub = get_video_stub(connection_index); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_authenticated = 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientAuthenticated(session_jid)); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientConnected(session_jid)) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(client_authenticated); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent = 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(video_stub, ProcessVideoPacketPtr(_, _)) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(client_authenticated) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll( 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunDoneTask())) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(video_stub, ProcessVideoPacketPtr(_, _)) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(video_packet_sent) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(RunDoneTask()); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return video_packet_sent; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return an expectation that a client will disconnect after a given 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expectation. The given action will be done after the event executor is 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notified that the session has finished. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <class A> 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation ExpectClientDisconnected(int connection_index, 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expect_host_status_change, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation after, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A action) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClient* connection = get_connection(connection_index); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_disconnected = 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection, Disconnect()) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(after) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs(CreateFunctor( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &ChromotingHostTest::NotifyClientSessionClosed, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connection_index))) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnectEffects(connection_index, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_host_status_change, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) after, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return client_disconnected; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect the side-effects of a client disconnection, after a given 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expectation. The given action will be done after the event executor is 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifed that the session has finished. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <class A> 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectClientDisconnectEffects(int connection_index, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expect_host_status_change, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation after, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A action) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& session_jid = get_session_jid(connection_index); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expect_host_status_change) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientDisconnected(session_jid)) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(after) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(action) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<AutoThreadTaskRunner> task_runner_; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClientEventHandler handler_; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSignalStrategy signal_strategy_; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockDesktopEnvironmentFactory> desktop_environment_factory_; 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ChromotingHost> host_; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostStatusObserver host_status_observer_; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::MockSessionManager* session_manager_; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string xmpp_login_; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClient* connection1_; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockConnectionToClient> owned_connection1_; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSession* client1_; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_jid1_; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSession* session1_; // Owned by |connection_|. 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig session_config1_; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoStub video_stub1_; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockClientStub client_stub1_; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostStub host_stub1_; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClient* connection2_; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockConnectionToClient> owned_connection2_; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSession* client2_; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_jid2_; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSession* session2_; // Owned by |connection2_|. 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig session_config2_; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoStub video_stub2_; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockClientStub client_stub2_; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostStub host_stub2_; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockSession> session_unowned1_; // Not owned by a connection. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig session_unowned_config1_; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_unowned_jid1_; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockSession> session_unowned2_; // Not owned by a connection. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig session_unowned_config2_; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_unowned_jid2_; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::Session::EventHandler* session_event_handler_; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<protocol::CandidateSessionConfig> empty_candidate_config_; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<protocol::CandidateSessionConfig> default_candidate_config_; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnectionToClient*& get_connection(int connection_index) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (connection_index == 0) ? connection1_ : connection2_; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSession*& get_client(int connection_index) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (connection_index == 0) ? client1_ : client2_; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& get_session_jid(int connection_index) { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (connection_index == 0) ? session_jid1_ : session_jid2_; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoStub& get_video_stub(int connection_index) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (connection_index == 0) ? video_stub1_ : video_stub2_; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, StartAndShutdown) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation start = ExpectHostAndSessionManagerStart(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()).After(start); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, Connect) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shut down the host when the first video packet is received. 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent = ExpectClientConnected( 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_disconnected = ExpectClientDisconnected( 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, true, video_packet_sent, InvokeWithoutArgs(base::DoNothing)); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()).After(client_disconnected); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, RejectAuthenticatingClient) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation start = ExpectHostAndSessionManagerStart(); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientAuthenticated(session_jid1_)) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs( 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &ChromotingHostTest::RejectAuthenticatingClient)); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnected( 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, true, start, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, true); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, AuthenticationFailed) { 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnAccessDenied(session_jid1_)) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, false, false); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, Reconnect) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a video packet is received on the first connection, disconnect it, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then quit the message loop. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent1 = ExpectClientConnected(0, DoAll( 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs(this, &ChromotingHostTest::DisconnectClient1), 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs(this, &ChromotingHostTest::QuitMainMessageLoop))); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnectEffects( 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, true, video_packet_sent1, InvokeWithoutArgs(base::DoNothing)); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a video packet is received on the second connection, shut down the 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // host. 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent2 = ExpectClientConnected( 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_disconnected2 = ExpectClientDisconnected( 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, true, video_packet_sent2, InvokeWithoutArgs(base::DoNothing)); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()).After(client_disconnected2); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(1, true, false); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, ConnectWhenAnotherClientIsConnected) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a video packet is received, connect the second connection. 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should disconnect the first connection. 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent1 = ExpectClientConnected( 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs( 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateFunctor( 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ChromotingHostTest::SimulateClientConnection, 1, true, false))); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnected( 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, true, video_packet_sent1, InvokeWithoutArgs(base::DoNothing)); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent2 = ExpectClientConnected( 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation client_disconnected2 = ExpectClientDisconnected( 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, true, video_packet_sent2, InvokeWithoutArgs(base::DoNothing)); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()).After(client_disconnected2); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, IncomingSessionDeclined) { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::IncomingSessionResponse response = 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::ACCEPT; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session1_, &response); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::DECLINE, response); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, IncomingSessionIncompatible) { 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce(Return( 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_candidate_config_.get())); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::IncomingSessionResponse response = 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::ACCEPT; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session_unowned1_.get(), &response); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::INCOMPATIBLE, response); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, IncomingSessionAccepted) { 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce(Return( 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_candidate_config_.get())); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, set_config(_)); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, Close()).WillOnce(InvokeWithoutArgs( 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &ChromotingHostTest::NotifyConnectionClosed)); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnAccessDenied(_)); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::IncomingSessionResponse response = 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::DECLINE; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session_unowned1_.release(), &response); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::ACCEPT, response); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, IncomingSessionOverload) { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, candidate_config()).WillOnce(Return( 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_candidate_config_.get())); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, set_config(_)); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*session_unowned1_, Close()).WillOnce(InvokeWithoutArgs( 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &ChromotingHostTest::NotifyConnectionClosed)); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnAccessDenied(_)); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::IncomingSessionResponse response = 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::SessionManager::DECLINE; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session_unowned1_.release(), &response); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::ACCEPT, response); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->OnIncomingSession(session_unowned2_.get(), &response); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(protocol::SessionManager::OVERLOAD, response); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownHost(); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, OnSessionRouteChange) { 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string channel_name("ChannelName"); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::TransportRoute route; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent = ExpectClientConnected( 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, InvokeWithoutArgs(CreateFunctor( 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &ChromotingHostTest::ChangeSessionRoute, channel_name, route))); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation route_change = 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnClientRouteChange( 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_jid1_, channel_name, _)) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .After(video_packet_sent) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectClientDisconnected(0, true, route_change, 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvokeWithoutArgs(base::DoNothing)); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromotingHostTest, DisconnectAllClients) { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectHostAndSessionManagerStart(); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expectation video_packet_sent = ExpectClientConnected( 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, InvokeWithoutArgs(this, &ChromotingHostTest::DisconnectAllClients)); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectClientDisconnected(0, true, video_packet_sent, 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs(this, &ChromotingHostTest::ShutdownHost)); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(host_status_observer_, OnShutdown()); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Start(xmpp_login_); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateClientConnection(0, true, false); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 656