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