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