| Index: chrome/browser/service/service_process_control_browsertest.cc
|
| diff --git a/chrome/browser/service/service_process_control_browsertest.cc b/chrome/browser/service/service_process_control_browsertest.cc
|
| deleted file mode 100644
|
| index 7ea8cc5931cd84d4942051ef7e9c7c1543b6b98e..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/service/service_process_control_browsertest.cc
|
| +++ /dev/null
|
| @@ -1,294 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/service/service_process_control.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/command_line.h"
|
| -#include "base/path_service.h"
|
| -#include "base/process/kill.h"
|
| -#include "base/process/process_handle.h"
|
| -#include "base/process/process_iterator.h"
|
| -#include "base/test/test_timeouts.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/common/chrome_constants.h"
|
| -#include "chrome/common/chrome_version_info.h"
|
| -#include "chrome/common/service_process_util.h"
|
| -#include "chrome/test/base/in_process_browser_test.h"
|
| -#include "chrome/test/base/ui_test_utils.h"
|
| -#include "content/public/common/content_paths.h"
|
| -#include "content/public/common/content_switches.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -
|
| -class ServiceProcessControlBrowserTest
|
| - : public InProcessBrowserTest {
|
| - public:
|
| - ServiceProcessControlBrowserTest()
|
| - : service_process_handle_(base::kNullProcessHandle) {
|
| - }
|
| - virtual ~ServiceProcessControlBrowserTest() {
|
| - base::CloseProcessHandle(service_process_handle_);
|
| - service_process_handle_ = base::kNullProcessHandle;
|
| - }
|
| -
|
| - void HistogramsCallback() {
|
| - MockHistogramsCallback();
|
| - QuitMessageLoop();
|
| - }
|
| -
|
| - MOCK_METHOD0(MockHistogramsCallback, void());
|
| -
|
| - protected:
|
| - void LaunchServiceProcessControl() {
|
| - // Launch the process asynchronously.
|
| - ServiceProcessControl::GetInstance()->Launch(
|
| - base::Bind(&ServiceProcessControlBrowserTest::ProcessControlLaunched,
|
| - this),
|
| - base::Bind(
|
| - &ServiceProcessControlBrowserTest::ProcessControlLaunchFailed,
|
| - this));
|
| -
|
| - // Then run the message loop to keep things running.
|
| - content::RunMessageLoop();
|
| - }
|
| -
|
| - static void QuitMessageLoop() {
|
| - base::MessageLoop::current()->Quit();
|
| - }
|
| -
|
| - static void CloudPrintInfoCallback(
|
| - const cloud_print::CloudPrintProxyInfo& proxy_info) {
|
| - QuitMessageLoop();
|
| - }
|
| -
|
| - void Disconnect() {
|
| - // This will close the IPC connection.
|
| - ServiceProcessControl::GetInstance()->Disconnect();
|
| - }
|
| -
|
| - virtual void SetUp() OVERRIDE {
|
| - service_process_handle_ = base::kNullProcessHandle;
|
| - }
|
| -
|
| - virtual void TearDown() OVERRIDE {
|
| - if (ServiceProcessControl::GetInstance()->IsConnected())
|
| - EXPECT_TRUE(ServiceProcessControl::GetInstance()->Shutdown());
|
| -#if defined(OS_MACOSX)
|
| - // ForceServiceProcessShutdown removes the process from launched on Mac.
|
| - ForceServiceProcessShutdown("", 0);
|
| -#endif // OS_MACOSX
|
| - if (service_process_handle_ != base::kNullProcessHandle) {
|
| - EXPECT_TRUE(base::WaitForSingleProcess(
|
| - service_process_handle_,
|
| - TestTimeouts::action_max_timeout()));
|
| - service_process_handle_ = base::kNullProcessHandle;
|
| - }
|
| - }
|
| -
|
| - void ProcessControlLaunched() {
|
| - base::ProcessId service_pid;
|
| - EXPECT_TRUE(GetServiceProcessData(NULL, &service_pid));
|
| - EXPECT_NE(static_cast<base::ProcessId>(0), service_pid);
|
| - EXPECT_TRUE(base::OpenProcessHandleWithAccess(
|
| - service_pid,
|
| - base::kProcessAccessWaitForTermination |
|
| - // we need query permission to get exit code
|
| - base::kProcessAccessQueryInformation,
|
| - &service_process_handle_));
|
| - // Quit the current message. Post a QuitTask instead of just calling Quit()
|
| - // because this can get invoked in the context of a Launch() call and we
|
| - // may not be in Run() yet.
|
| - base::MessageLoop::current()->PostTask(FROM_HERE,
|
| - base::MessageLoop::QuitClosure());
|
| - }
|
| -
|
| - void ProcessControlLaunchFailed() {
|
| - ADD_FAILURE();
|
| - // Quit the current message.
|
| - base::MessageLoop::current()->PostTask(FROM_HERE,
|
| - base::MessageLoop::QuitClosure());
|
| - }
|
| -
|
| - private:
|
| - base::ProcessHandle service_process_handle_;
|
| -};
|
| -
|
| -class RealServiceProcessControlBrowserTest
|
| - : public ServiceProcessControlBrowserTest {
|
| - public:
|
| - virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
|
| - ServiceProcessControlBrowserTest::SetUpCommandLine(command_line);
|
| - base::FilePath exe;
|
| - PathService::Get(base::DIR_EXE, &exe);
|
| -#if defined(OS_MACOSX)
|
| - exe = exe.DirName().DirName().DirName();
|
| -#endif
|
| - exe = exe.Append(chrome::kHelperProcessExecutablePath);
|
| - // Run chrome instead of browser_tests.exe.
|
| - EXPECT_TRUE(base::PathExists(exe));
|
| - command_line->AppendSwitchPath(switches::kBrowserSubprocessPath, exe);
|
| - }
|
| -};
|
| -
|
| -#if defined(OS_MACOSX)
|
| -// Does not work on MACOSX.
|
| -#define MAYBE_LaunchAndIPC DISABLED_LaunchAndIPC
|
| -#else
|
| -#define MAYBE_LaunchAndIPC LaunchAndIPC
|
| -#endif
|
| -
|
| -IN_PROC_BROWSER_TEST_F(RealServiceProcessControlBrowserTest,
|
| - MAYBE_LaunchAndIPC) {
|
| - LaunchServiceProcessControl();
|
| -
|
| - // Make sure we are connected to the service process.
|
| - ASSERT_TRUE(ServiceProcessControl::GetInstance()->IsConnected());
|
| - ServiceProcessControl::GetInstance()->GetCloudPrintProxyInfo(
|
| - base::Bind(&ServiceProcessControlBrowserTest::CloudPrintInfoCallback));
|
| - content::RunMessageLoop();
|
| -
|
| - // And then shutdown the service process.
|
| - EXPECT_TRUE(ServiceProcessControl::GetInstance()->Shutdown());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest, LaunchAndIPC) {
|
| - LaunchServiceProcessControl();
|
| -
|
| - // Make sure we are connected to the service process.
|
| - ASSERT_TRUE(ServiceProcessControl::GetInstance()->IsConnected());
|
| - ServiceProcessControl::GetInstance()->GetCloudPrintProxyInfo(
|
| - base::Bind(&ServiceProcessControlBrowserTest::CloudPrintInfoCallback));
|
| - content::RunMessageLoop();
|
| -
|
| - // And then shutdown the service process.
|
| - EXPECT_TRUE(ServiceProcessControl::GetInstance()->Shutdown());
|
| -}
|
| -
|
| -// This tests the case when a service process is launched when the browser
|
| -// starts but we try to launch it again while setting up Cloud Print.
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest, LaunchTwice) {
|
| - // Launch the service process the first time.
|
| - LaunchServiceProcessControl();
|
| -
|
| - // Make sure we are connected to the service process.
|
| - ASSERT_TRUE(ServiceProcessControl::GetInstance()->IsConnected());
|
| - EXPECT_TRUE(ServiceProcessControl::GetInstance()->GetCloudPrintProxyInfo(
|
| - base::Bind(&ServiceProcessControlBrowserTest::CloudPrintInfoCallback)));
|
| - content::RunMessageLoop();
|
| -
|
| - // Launch the service process again.
|
| - LaunchServiceProcessControl();
|
| - ASSERT_TRUE(ServiceProcessControl::GetInstance()->IsConnected());
|
| - EXPECT_TRUE(ServiceProcessControl::GetInstance()->GetCloudPrintProxyInfo(
|
| - base::Bind(&ServiceProcessControlBrowserTest::CloudPrintInfoCallback)));
|
| - content::RunMessageLoop();
|
| -}
|
| -
|
| -static void DecrementUntilZero(int* count) {
|
| - (*count)--;
|
| - if (!(*count))
|
| - base::MessageLoop::current()->PostTask(FROM_HERE,
|
| - base::MessageLoop::QuitClosure());
|
| -}
|
| -
|
| -// Invoke multiple Launch calls in succession and ensure that all the tasks
|
| -// get invoked.
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest,
|
| - MultipleLaunchTasks) {
|
| - ServiceProcessControl* process = ServiceProcessControl::GetInstance();
|
| - int launch_count = 5;
|
| - for (int i = 0; i < launch_count; i++) {
|
| - // Launch the process asynchronously.
|
| - process->Launch(base::Bind(&DecrementUntilZero, &launch_count),
|
| - base::MessageLoop::QuitClosure());
|
| - }
|
| - // Then run the message loop to keep things running.
|
| - content::RunMessageLoop();
|
| - EXPECT_EQ(0, launch_count);
|
| -}
|
| -
|
| -// Make sure using the same task for success and failure tasks works.
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest, SameLaunchTask) {
|
| - ServiceProcessControl* process = ServiceProcessControl::GetInstance();
|
| - int launch_count = 5;
|
| - for (int i = 0; i < launch_count; i++) {
|
| - // Launch the process asynchronously.
|
| - base::Closure task = base::Bind(&DecrementUntilZero, &launch_count);
|
| - process->Launch(task, task);
|
| - }
|
| - // Then run the message loop to keep things running.
|
| - content::RunMessageLoop();
|
| - EXPECT_EQ(0, launch_count);
|
| -}
|
| -
|
| -// Tests whether disconnecting from the service IPC causes the service process
|
| -// to die.
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest, DieOnDisconnect) {
|
| - // Launch the service process.
|
| - LaunchServiceProcessControl();
|
| - // Make sure we are connected to the service process.
|
| - ASSERT_TRUE(ServiceProcessControl::GetInstance()->IsConnected());
|
| - Disconnect();
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest, ForceShutdown) {
|
| - // Launch the service process.
|
| - LaunchServiceProcessControl();
|
| - // Make sure we are connected to the service process.
|
| - ASSERT_TRUE(ServiceProcessControl::GetInstance()->IsConnected());
|
| - base::ProcessId service_pid;
|
| - EXPECT_TRUE(GetServiceProcessData(NULL, &service_pid));
|
| - EXPECT_NE(static_cast<base::ProcessId>(0), service_pid);
|
| - chrome::VersionInfo version_info;
|
| - ForceServiceProcessShutdown(version_info.Version(), service_pid);
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest, CheckPid) {
|
| - base::ProcessId service_pid;
|
| - EXPECT_FALSE(GetServiceProcessData(NULL, &service_pid));
|
| - // Launch the service process.
|
| - LaunchServiceProcessControl();
|
| - EXPECT_TRUE(GetServiceProcessData(NULL, &service_pid));
|
| - EXPECT_NE(static_cast<base::ProcessId>(0), service_pid);
|
| - // Disconnect from service process.
|
| - Disconnect();
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest, HistogramsNoService) {
|
| - ASSERT_FALSE(ServiceProcessControl::GetInstance()->IsConnected());
|
| - EXPECT_CALL(*this, MockHistogramsCallback()).Times(0);
|
| - EXPECT_FALSE(ServiceProcessControl::GetInstance()->GetHistograms(
|
| - base::Bind(&ServiceProcessControlBrowserTest::HistogramsCallback,
|
| - base::Unretained(this)),
|
| - base::TimeDelta()));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest, HistogramsTimeout) {
|
| - LaunchServiceProcessControl();
|
| - ASSERT_TRUE(ServiceProcessControl::GetInstance()->IsConnected());
|
| - // Callback should not be called during GetHistograms call.
|
| - EXPECT_CALL(*this, MockHistogramsCallback()).Times(0);
|
| - EXPECT_TRUE(ServiceProcessControl::GetInstance()->GetHistograms(
|
| - base::Bind(&ServiceProcessControlBrowserTest::HistogramsCallback,
|
| - base::Unretained(this)),
|
| - base::TimeDelta::FromMilliseconds(100)));
|
| - EXPECT_CALL(*this, MockHistogramsCallback()).Times(1);
|
| - EXPECT_TRUE(ServiceProcessControl::GetInstance()->Shutdown());
|
| - content::RunMessageLoop();
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(ServiceProcessControlBrowserTest, Histograms) {
|
| - LaunchServiceProcessControl();
|
| - ASSERT_TRUE(ServiceProcessControl::GetInstance()->IsConnected());
|
| - // Callback should not be called during GetHistograms call.
|
| - EXPECT_CALL(*this, MockHistogramsCallback()).Times(0);
|
| - // Wait for real callback by providing large timeout value.
|
| - EXPECT_TRUE(ServiceProcessControl::GetInstance()->GetHistograms(
|
| - base::Bind(&ServiceProcessControlBrowserTest::HistogramsCallback,
|
| - base::Unretained(this)),
|
| - base::TimeDelta::FromHours(1)));
|
| - EXPECT_CALL(*this, MockHistogramsCallback()).Times(1);
|
| - content::RunMessageLoop();
|
| -}
|
|
|