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)// Create a service process that uses a Mock to respond to the browser in order
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to test launching the browser using the cloud print policy check command
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// line switch.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
12bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/kill.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/rand_util.h"
14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/synchronization/waitable_event.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/multiprocess_test.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h"
17a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/time/default_tick_clock.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h"
20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/browser/prefs/browser_prefs.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/service_process/service_process_control.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/chrome_content_client.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/service_messages.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/service_process_util.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/service_ipc_server.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/service_process.h"
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/test/base/chrome_unit_test_suite.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/test_launcher_utils.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
35a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/test/base/testing_io_thread_state.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/common/content_paths.h"
43a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_descriptors.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_multiprocess_test.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_switches.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/multiprocess_func_list.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/mac/mock_launchd.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/posix/global_descriptors.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AnyNumber;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Assign;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AtLeast;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Mock;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Property;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::WithoutArgs;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
68a3f7b4e666c476898878fa745f637129375cd889Ben Murdochusing content::BrowserThread;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum MockServiceProcessExitCodes {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kMissingSwitch = 1,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInitializationFailure,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kExpectationsNotMet,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kShutdownNotGood
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestExecutablePath[] = "test-executable-path";
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool g_good_shutdown = false;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShutdownTask() {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_good_shutdown = true;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_service_process->Shutdown();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestStartupClientChannelListener : public IPC::Listener {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestServiceProcess : public ServiceProcess {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestServiceProcess() { }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestServiceProcess() { }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool Initialize(base::MessageLoopForUI* message_loop,
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                  ServiceProcessState* state);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MessageLoopProxy* IOMessageLoopProxy() {
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return io_thread_->message_loop_proxy().get();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool TestServiceProcess::Initialize(base::MessageLoopForUI* message_loop,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ServiceProcessState* state) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  main_message_loop_ = message_loop;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_process_state_.reset(state);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::Thread::Options options(base::MessageLoop::TYPE_IO, 0);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_thread_.reset(new base::Thread("TestServiceProcess_IO"));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io_thread_->StartWithOptions(options);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This mocks the service side IPC message handler, allowing us to have a
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// minimal service process.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockServiceIPCServer : public ServiceIPCServer {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string EnabledUserId();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MockServiceIPCServer(const IPC::ChannelHandle& handle)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ServiceIPCServer(handle),
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enabled_(true) { }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnMessageReceived, bool(const IPC::Message& message));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnChannelConnected, void(int32 peer_pid));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OnChannelError, void());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetServiceEnabledExpectations();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetWillBeDisabledExpectations();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CallServiceOnChannelConnected(int32 peer_pid) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ServiceIPCServer::OnChannelConnected(peer_pid);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SendInfo();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cloud_print::CloudPrintProxyInfo info_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enabled_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string MockServiceIPCServer::EnabledUserId() {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string("kitteh@canhazcheezburger.cat");
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockServiceIPCServer::SetServiceEnabledExpectations() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnChannelConnected(_)).Times(1)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Invoke(this, &MockServiceIPCServer::CallServiceOnChannelConnected));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnChannelError()).Times(0);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnMessageReceived(_)).Times(0);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnMessageReceived(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Property(&IPC::Message::type,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   static_cast<int32>(ServiceMsg_GetCloudPrintProxyInfo::ID))))
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(AnyNumber()).WillRepeatedly(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WithoutArgs(Invoke(this, &MockServiceIPCServer::SendInfo)));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              OnMessageReceived(
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Property(&IPC::Message::type,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           static_cast<int32>(ServiceMsg_Shutdown::ID))))
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          DoAll(Assign(&g_good_shutdown, true),
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                WithoutArgs(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Invoke(g_service_process, &ServiceProcess::Shutdown)),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Return(true)));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockServiceIPCServer::SetWillBeDisabledExpectations() {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetServiceEnabledExpectations();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              OnMessageReceived(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Property(&IPC::Message::type,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           static_cast<int32>(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ServiceMsg_DisableCloudPrintProxy::ID))))
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(AtLeast(1))
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(DoAll(Assign(&enabled_, false), Return(true)));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockServiceIPCServer::SendInfo() {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enabled_) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info_.enabled = true;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info_.email = EnabledUserId();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(Send(new ServiceHostMsg_CloudPrintProxy_Info(info_)));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info_.enabled = false;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info_.email = std::string();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(Send(new ServiceHostMsg_CloudPrintProxy_Info(info_)));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef base::Callback<void(MockServiceIPCServer* server)>
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetExpectationsCallback;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The return value from this routine is used as the exit code for the mock
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// service process. Any non-zero return value will be printed out and can help
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determine the failure.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CloudPrintMockService_Main(SetExpectationsCallback set_expectations) {
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI main_message_loop;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  main_message_loop.set_thread_name("Main Thread");
217a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  CommandLine* command_line = CommandLine::ForCurrentProcess();
21823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  content::RegisterPathProvider();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
221a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (!command_line->HasSwitch(kTestExecutablePath))
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kMissingSwitch;
223a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::FilePath executable_path =
224a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      command_line->GetSwitchValuePath(kTestExecutablePath);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(executable_path.empty());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockLaunchd mock_launchd(executable_path, &main_message_loop, true, true);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Launchd::ScopedInstance use_mock(&mock_launchd);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::FilePath user_data_dir =
231a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      command_line->GetSwitchValuePath(switches::kUserDataDir);
232a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  CHECK(!user_data_dir.empty());
233a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  CHECK(test_launcher_utils::OverrideUserDataDir(user_data_dir));
234a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceProcessState* state(new ServiceProcessState);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool service_process_state_initialized = state->Initialize();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service_process_state_initialized);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service_process_state_initialized)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kInitializationFailure;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestServiceProcess service_process;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(&service_process, g_service_process);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of the pointer, but we can use it since we have the same
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // lifetime.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(service_process.Initialize(&main_message_loop, state));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockServiceIPCServer server(state->GetServiceProcessChannel());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Here is where the expectations/mock responses need to be set up.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_expectations.Run(&server);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(server.Init());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(state->SignalReady(service_process.IOMessageLoopProxy(),
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::Bind(&ShutdownTask)));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_launchd.SignalReady();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connect up the parent/child IPC channel to signal that the test can
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // continue.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestStartupClientChannelListener listener;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CommandLine::ForCurrentProcess()->HasSwitch(
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kProcessChannelID));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string startup_channel_name =
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          switches::kProcessChannelID);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<IPC::ChannelProxy> startup_channel;
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  startup_channel =
27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      IPC::ChannelProxy::Create(startup_channel_name,
27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                IPC::Channel::MODE_CLIENT,
27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                &listener,
27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                service_process.IOMessageLoopProxy());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  main_message_loop.Run();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!Mock::VerifyAndClearExpectations(&server))
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kExpectationsNotMet;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!g_good_shutdown)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kShutdownNotGood;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetServiceEnabledExpectations(MockServiceIPCServer* server) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server->SetServiceEnabledExpectations();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MULTIPROCESS_IPC_TEST_MAIN(CloudPrintMockService_StartEnabledWaitForQuit) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintMockService_Main(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SetServiceEnabledExpectations));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetServiceWillBeDisabledExpectations(MockServiceIPCServer* server) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server->SetWillBeDisabledExpectations();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MULTIPROCESS_IPC_TEST_MAIN(CloudPrintMockService_StartEnabledExpectDisabled) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintMockService_Main(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SetServiceWillBeDisabledExpectations));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintProxyPolicyStartupTest : public base::MultiProcessTest,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         public IPC::Listener {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintProxyPolicyStartupTest();
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CloudPrintProxyPolicyStartupTest();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
310a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  scoped_refptr<base::MessageLoopProxy> IOMessageLoopProxy() {
311a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle Launch(const std::string& name);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForConnect();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Send(IPC::Message* message);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutdownAndWaitForExitWithTimeout(base::ProcessHandle handle);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Listener implementation
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MultiProcessTest implementation.
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual CommandLine MakeCmdLine(const std::string& procname) OVERRIDE;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LaunchBrowser(const CommandLine& command_line, Profile* profile) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int return_code = 0;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StartupBrowserCreator browser_creator;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return StartupBrowserCreator::ProcessCmdLineImpl(
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        command_line, base::FilePath(), false, profile,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StartupBrowserCreator::Profiles(), &return_code, &browser_creator);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
336a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
337a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::ScopedTempDir temp_user_data_dir_;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string startup_channel_id_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<IPC::ChannelProxy> startup_channel_;
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<ChromeContentClient> content_client_;
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<chrome::ChromeContentBrowserClient> browser_content_client_;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath executable_path_, bundle_path_;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockLaunchd> mock_launchd_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Launchd::ScopedInstance> scoped_launchd_instance_;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class WindowedChannelConnectionObserver {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WindowedChannelConnectionObserver()
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : seen_(false),
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          running_(false) { }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Wait() {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (seen_)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      running_ = true;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Notify() {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seen_ = true;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (running_)
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::MessageLoopForUI::current()->Quit();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool seen_;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool running_;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedChannelConnectionObserver observer_;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintProxyPolicyStartupTest::CloudPrintProxyPolicyStartupTest()
380a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    : thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD) {
38123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Although is really a unit test which runs in the browser_tests binary, it
38223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // doesn't get the unit setup which normally happens in the unit test binary.
38323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ChromeUnitTestSuite::InitializeProviders();
38423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ChromeUnitTestSuite::InitializeResourceBundle();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintProxyPolicyStartupTest::~CloudPrintProxyPolicyStartupTest() {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintProxyPolicyStartupTest::SetUp() {
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content_client_.reset(new ChromeContentClient);
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::SetContentClient(content_client_.get());
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  browser_content_client_.reset(new chrome::ChromeContentBrowserClient());
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::SetBrowserClientForTesting(browser_content_client_.get());
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestingBrowserProcess::CreateInstance();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(MockLaunchd::MakeABundle(temp_dir_.path(),
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       "CloudPrintProxyTest",
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &bundle_path_,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &executable_path_));
403a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  mock_launchd_.reset(new MockLaunchd(executable_path_,
404a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                                      base::MessageLoopForUI::current(),
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      true, false));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_launchd_instance_.reset(
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new Launchd::ScopedInstance(mock_launchd_.get()));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
409a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
410a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Ensure test does not use the standard profile directory. This is copied
411a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // from InProcessBrowserTest::SetUp(). These tests require a more complex
412a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // process startup so they are unable to just inherit from
413a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // InProcessBrowserTest.
414a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  CommandLine* command_line = CommandLine::ForCurrentProcess();
415a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::FilePath user_data_dir =
416a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      command_line->GetSwitchValuePath(switches::kUserDataDir);
417a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (user_data_dir.empty()) {
418a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ASSERT_TRUE(temp_user_data_dir_.CreateUniqueTempDir() &&
419a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                temp_user_data_dir_.IsValid())
420a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        << "Could not create temporary user data directory \""
421a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        << temp_user_data_dir_.path().value() << "\".";
422a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
423a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    user_data_dir = temp_user_data_dir_.path();
424a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir);
425a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
426a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_TRUE(test_launcher_utils::OverrideUserDataDir(user_data_dir));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CloudPrintProxyPolicyStartupTest::TearDown() {
430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  browser_content_client_.reset();
431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content_client_.reset();
432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::SetContentClient(NULL);
433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestingBrowserProcess::DeleteInstance();
435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::ProcessHandle CloudPrintProxyPolicyStartupTest::Launch(
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(CheckServiceProcessReady());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  startup_channel_id_ =
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("%d.%p.%d",
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         base::GetCurrentProcId(), this,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         base::RandInt(0, std::numeric_limits<int>::max()));
44546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  startup_channel_ = IPC::ChannelProxy::Create(startup_channel_id_,
44646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               IPC::Channel::MODE_SERVER,
44746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               this,
44846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               IOMessageLoopProxy());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FileHandleMappingVector ipc_file_list;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ipc_file_list.push_back(std::make_pair(
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      startup_channel_->TakeClientFileDescriptor(),
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kPrimaryIPCChannel + base::GlobalDescriptors::kBaseDescriptor));
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::LaunchOptions options;
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  options.fds_to_remap = &ipc_file_list;
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::ProcessHandle handle = SpawnChildWithOptions(name, options);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::ProcessHandle handle = SpawnChild(name);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(handle);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handle;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintProxyPolicyStartupTest::WaitForConnect() {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_.Wait();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CheckServiceProcessReady());
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(base::MessageLoopProxy::current().get());
4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ServiceProcessControl::GetInstance()->SetChannel(
47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      IPC::ChannelProxy::Create(GetServiceProcessChannel(),
47146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                IPC::Channel::MODE_NAMED_CLIENT,
47246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                ServiceProcessControl::GetInstance(),
47346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                IOMessageLoopProxy()));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CloudPrintProxyPolicyStartupTest::Send(IPC::Message* message) {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ServiceProcessControl::GetInstance()->Send(message);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintProxyPolicyStartupTest::ShutdownAndWaitForExitWithTimeout(
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ProcessHandle handle) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(Send(new ServiceMsg_Shutdown()));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int exit_code = -100;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exited =
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WaitForExitCodeWithTimeout(handle, &exit_code,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       TestTimeouts::action_timeout());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(exited);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(exit_code, 0);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::CloseProcessHandle(handle);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintProxyPolicyStartupTest::OnChannelConnected(int32 peer_pid) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_.Notify();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandLine CloudPrintProxyPolicyStartupTest::MakeCmdLine(
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& procname) {
499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CommandLine cl = MultiProcessTest::MakeCmdLine(procname);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cl.AppendSwitchASCII(switches::kProcessChannelID, startup_channel_id_);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cl.AppendSwitchASCII(kTestExecutablePath, executable_path_.value());
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cl;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintProxyPolicyStartupTest, StartAndShutdown) {
508a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  TestingBrowserProcess* browser_process =
509a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      TestingBrowserProcess::GetGlobal();
510a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  TestingProfileManager profile_manager(browser_process);
511a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_TRUE(profile_manager.SetUp());
512a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
513a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Must be created after the TestingProfileManager since that creates the
514a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // LocalState for the BrowserProcess.  Must be created before profiles are
515a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // constructed.
516a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  chrome::TestingIOThreadState testing_io_thread_state;
517a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle handle =
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Launch("CloudPrintMockService_StartEnabledWaitForQuit");
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForConnect();
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShutdownAndWaitForExitWithTimeout(handle);
522a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::RunAllPendingInMessageLoop();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* CloudPrintProxyServiceFactoryForPolicyTest(
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* profile) {
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CloudPrintProxyService* service =
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new CloudPrintProxyService(static_cast<Profile*>(profile));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->Initialize();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return service;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintProxyPolicyStartupTest, StartBrowserWithoutPolicy) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle handle =
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Launch("CloudPrintMockService_StartEnabledWaitForQuit");
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
537a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Setup the Browser Process with a full IOThread::Globals.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingBrowserProcess* browser_process =
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestingBrowserProcess::GetGlobal();
540a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfileManager profile_manager(browser_process);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile_manager.SetUp());
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
544a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Must be created after the TestingProfileManager since that creates the
545a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // LocalState for the BrowserProcess.  Must be created before profiles are
546a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // constructed.
547a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  chrome::TestingIOThreadState testing_io_thread_state;
548a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile =
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_manager.CreateTestingProfile("StartBrowserWithoutPolicy");
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintProxyServiceFactory::GetInstance()->
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetTestingFactory(profile, CloudPrintProxyServiceFactoryForPolicyTest);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable* prefs = profile->GetTestingPrefService();
5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  prefs->SetUserPref(
5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      prefs::kCloudPrintEmail,
5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new base::StringValue(MockServiceIPCServer::EnabledUserId()));
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(CommandLine::NO_PROGRAM);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.AppendSwitch(switches::kCheckCloudPrintConnectorPolicy);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_launcher_utils::PrepareBrowserCommandLineForTests(&command_line);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForConnect();
564a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop run_loop;
56590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FROM_HERE,
567a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      run_loop.QuitClosure(),
56890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TestTimeouts::action_timeout());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
570a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  bool should_run_loop = LaunchBrowser(command_line, profile);
571a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_FALSE(should_run_loop);
572a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (should_run_loop)
573a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    run_loop.Run();
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(MockServiceIPCServer::EnabledUserId(),
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prefs->GetString(prefs::kCloudPrintEmail));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShutdownAndWaitForExitWithTimeout(handle);
579a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::RunAllPendingInMessageLoop();
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager.DeleteTestingProfile("StartBrowserWithoutPolicy");
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintProxyPolicyStartupTest, StartBrowserWithPolicy) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle handle =
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Launch("CloudPrintMockService_StartEnabledExpectDisabled");
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingBrowserProcess* browser_process =
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestingBrowserProcess::GetGlobal();
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfileManager profile_manager(browser_process);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile_manager.SetUp());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Must be created after the TestingProfileManager since that creates the
593a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // LocalState for the BrowserProcess.  Must be created before profiles are
594a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // constructed.
595a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  chrome::TestingIOThreadState testing_io_thread_state;
596a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile =
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_manager.CreateTestingProfile("StartBrowserWithPolicy");
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintProxyServiceFactory::GetInstance()->
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetTestingFactory(profile, CloudPrintProxyServiceFactoryForPolicyTest);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable* prefs = profile->GetTestingPrefService();
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  prefs->SetUserPref(
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      prefs::kCloudPrintEmail,
6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new base::StringValue(MockServiceIPCServer::EnabledUserId()));
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs->SetManagedPref(prefs::kCloudPrintProxyEnabled,
607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        new base::FundamentalValue(false));
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(CommandLine::NO_PROGRAM);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.AppendSwitch(switches::kCheckCloudPrintConnectorPolicy);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_launcher_utils::PrepareBrowserCommandLineForTests(&command_line);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForConnect();
614a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop run_loop;
61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FROM_HERE,
617a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      run_loop.QuitClosure(),
61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TestTimeouts::action_timeout());
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
620a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  bool should_run_loop = LaunchBrowser(command_line, profile);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No expectations on run_loop being true here; that would be a race
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // condition.
624a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (should_run_loop)
625a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    run_loop.Run();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", prefs->GetString(prefs::kCloudPrintEmail));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShutdownAndWaitForExitWithTimeout(handle);
630a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::RunAllPendingInMessageLoop();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_manager.DeleteTestingProfile("StartBrowserWithPolicy");
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
633