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" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 9a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/process.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_macros.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_platform_file.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/base/auto_thread_task_runner.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/chromoting_messages.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/daemon_process.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/desktop_session.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock_mutant.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Messages { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kMessageCrash = ChromotingDaemonMsg_Crash::ID, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMessageConfiguration = ChromotingDaemonNetworkMsg_Configuration::ID, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMessageConnectTerminal = ChromotingNetworkHostMsg_ConnectTerminal::ID, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMessageDisconnectTerminal = ChromotingNetworkHostMsg_DisconnectTerminal::ID, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMessageTerminalDisconnected = 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromotingDaemonNetworkMsg_TerminalDisconnected::ID 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides a public constructor allowing the test to create instances of 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopSession directly. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDesktopSession : public DesktopSession { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDesktopSession(DaemonProcess* daemon_process, int id); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeDesktopSession(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetScreenResolution( 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ScreenResolution& resolution) OVERRIDE {} 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeDesktopSession); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDaemonProcess : public DaemonProcess { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockDaemonProcess( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<AutoThreadTaskRunner> caller_task_runner, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<AutoThreadTaskRunner> io_task_runner, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& stopped_callback); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockDaemonProcess(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual scoped_ptr<DesktopSession> DoCreateDesktopSession( 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int terminal_id, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ScreenResolution& resolution, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool virtual_terminal) OVERRIDE; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendToNetwork(IPC::Message* message) OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(Received, void(const IPC::Message&)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(Sent, void(const IPC::Message&)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(OnDesktopSessionAgentAttached, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool(int, base::ProcessHandle, IPC::PlatformFileForTransit)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(DoCreateDesktopSessionPtr, DesktopSession*(int)); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(DoCrashNetworkProcess, void(const tracked_objects::Location&)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(LaunchNetworkProcess, void()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockDaemonProcess); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeDesktopSession::FakeDesktopSession(DaemonProcess* daemon_process, int id) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : DesktopSession(daemon_process, id) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeDesktopSession::~FakeDesktopSession() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDaemonProcess::MockDaemonProcess( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<AutoThreadTaskRunner> caller_task_runner, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<AutoThreadTaskRunner> io_task_runner, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& stopped_callback) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : DaemonProcess(caller_task_runner, io_task_runner, stopped_callback) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDaemonProcess::~MockDaemonProcess() { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<DesktopSession> MockDaemonProcess::DoCreateDesktopSession( 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int terminal_id, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ScreenResolution& resolution, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool virtual_terminal) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoped_ptr<DesktopSession>(DoCreateDesktopSessionPtr(terminal_id)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockDaemonProcess::OnMessageReceived(const IPC::Message& message) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the mock method. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Received(message); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call the actual handler. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DaemonProcess::OnMessageReceived(message); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockDaemonProcess::SendToNetwork(IPC::Message* message) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the mock method. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Sent(*message); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DaemonProcessTest : public testing::Test { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DaemonProcessTest(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DaemonProcessTest(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DaemonProcess mocks 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopSession* DoCreateDesktopSession(int terminal_id); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DoCrashNetworkProcess(const tracked_objects::Location& location); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LaunchNetworkProcess(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes |daemon_process_|. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteDaemonProcess(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Quits |message_loop_|. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void QuitMessageLoop(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartDaemonProcess(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DaemonProcess::DesktopSessionList& desktop_sessions() const { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return daemon_process_->desktop_sessions(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopForIO message_loop_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockDaemonProcess> daemon_process_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int terminal_id_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DaemonProcessTest::DaemonProcessTest() : terminal_id_(0) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DaemonProcessTest::~DaemonProcessTest() { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DaemonProcessTest::SetUp() { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<AutoThreadTaskRunner> task_runner = new AutoThreadTaskRunner( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DaemonProcessTest::QuitMessageLoop, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) daemon_process_.reset( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockDaemonProcess(task_runner, task_runner, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DaemonProcessTest::DeleteDaemonProcess, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)))); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up daemon process mocks. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, DoCreateDesktopSessionPtr(_)) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Invoke(this, &DaemonProcessTest::DoCreateDesktopSession)); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*daemon_process_, DoCrashNetworkProcess(_)) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(AnyNumber()) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillRepeatedly(Invoke(this, &DaemonProcessTest::DoCrashNetworkProcess)); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, LaunchNetworkProcess()) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AnyNumber()) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Invoke(this, &DaemonProcessTest::LaunchNetworkProcess)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DaemonProcessTest::TearDown() { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) daemon_process_->Stop(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopSession* DaemonProcessTest::DoCreateDesktopSession(int terminal_id) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FakeDesktopSession(daemon_process_.get(), terminal_id); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DaemonProcessTest::DoCrashNetworkProcess( 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const tracked_objects::Location& location) { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) daemon_process_->SendToNetwork( 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ChromotingDaemonMsg_Crash(location.function_name(), 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) location.file_name(), 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) location.line_number())); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DaemonProcessTest::LaunchNetworkProcess() { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) terminal_id_ = 0; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) daemon_process_->OnChannelConnected(0); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DaemonProcessTest::DeleteDaemonProcess() { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) daemon_process_.reset(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DaemonProcessTest::QuitMessageLoop() { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_.PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DaemonProcessTest::StartDaemonProcess() { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DaemonProcess::Initialize() sets up the config watcher that this test does 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not support. Launch the process directly. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) daemon_process_->LaunchNetworkProcess(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(Message, type, "") { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg.type() == static_cast<uint32>(type); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DaemonProcessTest, OpenClose) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageConfiguration))); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Received(Message(kMessageConnectTerminal))); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Received(Message(kMessageDisconnectTerminal))); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageTerminalDisconnected))); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartDaemonProcess(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = terminal_id_++; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenResolution resolution; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(daemon_process_->OnMessageReceived( 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromotingNetworkHostMsg_ConnectTerminal(id, resolution, false))); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, desktop_sessions().size()); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id, desktop_sessions().front()->id()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(daemon_process_->OnMessageReceived( 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromotingNetworkHostMsg_DisconnectTerminal(id))); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(desktop_sessions().empty()); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DaemonProcessTest, CallCloseDesktopSession) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageConfiguration))); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Received(Message(kMessageConnectTerminal))); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageTerminalDisconnected))); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartDaemonProcess(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = terminal_id_++; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenResolution resolution; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(daemon_process_->OnMessageReceived( 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromotingNetworkHostMsg_ConnectTerminal(id, resolution, false))); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, desktop_sessions().size()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id, desktop_sessions().front()->id()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) daemon_process_->CloseDesktopSession(id); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(desktop_sessions().empty()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends two CloseDesktopSession messages and expects the second one to be 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ignored. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DaemonProcessTest, DoubleDisconnectTerminal) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageConfiguration))); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Received(Message(kMessageConnectTerminal))); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Received(Message(kMessageDisconnectTerminal))); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageTerminalDisconnected))); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Received(Message(kMessageDisconnectTerminal))); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartDaemonProcess(); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = terminal_id_++; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenResolution resolution; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(daemon_process_->OnMessageReceived( 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromotingNetworkHostMsg_ConnectTerminal(id, resolution, false))); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, desktop_sessions().size()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id, desktop_sessions().front()->id()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(daemon_process_->OnMessageReceived( 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromotingNetworkHostMsg_DisconnectTerminal(id))); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(desktop_sessions().empty()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(daemon_process_->OnMessageReceived( 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromotingNetworkHostMsg_DisconnectTerminal(id))); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(desktop_sessions().empty()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tries to close an invalid terminal ID and expects the network process to be 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// restarted. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DaemonProcessTest, InvalidDisconnectTerminal) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageConfiguration))); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Received(Message(kMessageDisconnectTerminal))); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageCrash))) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs(this, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DaemonProcessTest::LaunchNetworkProcess)); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageConfiguration))); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartDaemonProcess(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = terminal_id_++; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(daemon_process_->OnMessageReceived( 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromotingNetworkHostMsg_DisconnectTerminal(id))); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(desktop_sessions().empty()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, terminal_id_); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tries to open an invalid terminal ID and expects the network process to be 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// restarted. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DaemonProcessTest, InvalidConnectTerminal) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageConfiguration))); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Received(Message(kMessageConnectTerminal))); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Received(Message(kMessageConnectTerminal))); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageCrash))) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InvokeWithoutArgs(this, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DaemonProcessTest::LaunchNetworkProcess)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*daemon_process_, Sent(Message(kMessageConfiguration))); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartDaemonProcess(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = terminal_id_++; 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenResolution resolution; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(daemon_process_->OnMessageReceived( 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromotingNetworkHostMsg_ConnectTerminal(id, resolution, false))); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, desktop_sessions().size()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id, desktop_sessions().front()->id()); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(daemon_process_->OnMessageReceived( 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromotingNetworkHostMsg_ConnectTerminal(id, resolution, false))); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(desktop_sessions().empty()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, terminal_id_); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 343