OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/service_process/service_process_control.h" | 5 #include "chrome/browser/service_process/service_process_control.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
11 #include "base/process/kill.h" | 11 #include "base/process/kill.h" |
12 #include "base/process/process_handle.h" | 12 #include "base/process/process.h" |
13 #include "base/process/process_iterator.h" | 13 #include "base/process/process_iterator.h" |
14 #include "base/test/test_timeouts.h" | 14 #include "base/test/test_timeouts.h" |
15 #include "chrome/browser/ui/browser.h" | 15 #include "chrome/browser/ui/browser.h" |
16 #include "chrome/common/chrome_constants.h" | 16 #include "chrome/common/chrome_constants.h" |
17 #include "chrome/common/chrome_version_info.h" | 17 #include "chrome/common/chrome_version_info.h" |
18 #include "chrome/common/service_process_util.h" | 18 #include "chrome/common/service_process_util.h" |
19 #include "chrome/test/base/in_process_browser_test.h" | 19 #include "chrome/test/base/in_process_browser_test.h" |
20 #include "content/public/common/content_paths.h" | 20 #include "content/public/common/content_paths.h" |
21 #include "content/public/common/content_switches.h" | 21 #include "content/public/common/content_switches.h" |
22 #include "content/public/test/test_utils.h" | 22 #include "content/public/test/test_utils.h" |
23 #include "testing/gmock/include/gmock/gmock.h" | 23 #include "testing/gmock/include/gmock/gmock.h" |
24 | 24 |
25 class ServiceProcessControlBrowserTest | 25 class ServiceProcessControlBrowserTest |
26 : public InProcessBrowserTest { | 26 : public InProcessBrowserTest { |
27 public: | 27 public: |
28 ServiceProcessControlBrowserTest() | 28 ServiceProcessControlBrowserTest() { |
29 : service_process_handle_(base::kNullProcessHandle) { | |
30 } | 29 } |
31 virtual ~ServiceProcessControlBrowserTest() { | 30 virtual ~ServiceProcessControlBrowserTest() { |
32 base::CloseProcessHandle(service_process_handle_); | |
33 service_process_handle_ = base::kNullProcessHandle; | |
34 } | 31 } |
35 | 32 |
36 void HistogramsCallback() { | 33 void HistogramsCallback() { |
37 MockHistogramsCallback(); | 34 MockHistogramsCallback(); |
38 QuitMessageLoop(); | 35 QuitMessageLoop(); |
39 } | 36 } |
40 | 37 |
41 MOCK_METHOD0(MockHistogramsCallback, void()); | 38 MOCK_METHOD0(MockHistogramsCallback, void()); |
42 | 39 |
43 protected: | 40 protected: |
(...skipping 18 matching lines...) Expand all Loading... |
62 const cloud_print::CloudPrintProxyInfo& proxy_info) { | 59 const cloud_print::CloudPrintProxyInfo& proxy_info) { |
63 QuitMessageLoop(); | 60 QuitMessageLoop(); |
64 } | 61 } |
65 | 62 |
66 void Disconnect() { | 63 void Disconnect() { |
67 // This will close the IPC connection. | 64 // This will close the IPC connection. |
68 ServiceProcessControl::GetInstance()->Disconnect(); | 65 ServiceProcessControl::GetInstance()->Disconnect(); |
69 } | 66 } |
70 | 67 |
71 virtual void SetUp() override { | 68 virtual void SetUp() override { |
72 service_process_handle_ = base::kNullProcessHandle; | 69 // This should not be needed because TearDown() ends with a closed |
| 70 // service_process_, but HistogramsTimeout and Histograms fail without this |
| 71 // on Mac. |
| 72 service_process_.Close(); |
73 } | 73 } |
74 | 74 |
75 virtual void TearDown() override { | 75 virtual void TearDown() override { |
76 if (ServiceProcessControl::GetInstance()->IsConnected()) | 76 if (ServiceProcessControl::GetInstance()->IsConnected()) |
77 EXPECT_TRUE(ServiceProcessControl::GetInstance()->Shutdown()); | 77 EXPECT_TRUE(ServiceProcessControl::GetInstance()->Shutdown()); |
78 #if defined(OS_MACOSX) | 78 #if defined(OS_MACOSX) |
79 // ForceServiceProcessShutdown removes the process from launched on Mac. | 79 // ForceServiceProcessShutdown removes the process from launched on Mac. |
80 ForceServiceProcessShutdown("", 0); | 80 ForceServiceProcessShutdown("", 0); |
81 #endif // OS_MACOSX | 81 #endif // OS_MACOSX |
82 if (service_process_handle_ != base::kNullProcessHandle) { | 82 if (service_process_.IsValid()) { |
83 EXPECT_TRUE(base::WaitForSingleProcess( | 83 EXPECT_TRUE(base::WaitForSingleProcess( |
84 service_process_handle_, | 84 service_process_.Handle(), |
85 TestTimeouts::action_max_timeout())); | 85 TestTimeouts::action_max_timeout())); |
86 service_process_handle_ = base::kNullProcessHandle; | 86 service_process_.Close(); |
87 } | 87 } |
88 } | 88 } |
89 | 89 |
90 void ProcessControlLaunched() { | 90 void ProcessControlLaunched() { |
91 base::ProcessId service_pid; | 91 base::ProcessId service_pid; |
92 EXPECT_TRUE(GetServiceProcessData(NULL, &service_pid)); | 92 EXPECT_TRUE(GetServiceProcessData(NULL, &service_pid)); |
93 EXPECT_NE(static_cast<base::ProcessId>(0), service_pid); | 93 EXPECT_NE(static_cast<base::ProcessId>(0), service_pid); |
94 EXPECT_TRUE(base::OpenProcessHandleWithAccess( | 94 #if defined(OS_WIN) |
95 service_pid, | 95 service_process_ = |
96 base::kProcessAccessWaitForTermination | | 96 base::Process::OpenWithAccess(service_pid, |
97 // we need query permission to get exit code | 97 SYNCHRONIZE | PROCESS_QUERY_INFORMATION); |
98 base::kProcessAccessQueryInformation, | 98 EXPECT_TRUE(service_process_.IsValid()); |
99 &service_process_handle_)); | 99 #else |
| 100 base::ProcessHandle service_process_handle; |
| 101 EXPECT_TRUE(base::OpenProcessHandle(service_pid, &service_process_handle)); |
| 102 service_process_ = base::Process(service_process_handle); |
| 103 #endif |
100 // Quit the current message. Post a QuitTask instead of just calling Quit() | 104 // Quit the current message. Post a QuitTask instead of just calling Quit() |
101 // because this can get invoked in the context of a Launch() call and we | 105 // because this can get invoked in the context of a Launch() call and we |
102 // may not be in Run() yet. | 106 // may not be in Run() yet. |
103 base::MessageLoop::current()->PostTask(FROM_HERE, | 107 base::MessageLoop::current()->PostTask(FROM_HERE, |
104 base::MessageLoop::QuitClosure()); | 108 base::MessageLoop::QuitClosure()); |
105 } | 109 } |
106 | 110 |
107 void ProcessControlLaunchFailed() { | 111 void ProcessControlLaunchFailed() { |
108 ADD_FAILURE(); | 112 ADD_FAILURE(); |
109 // Quit the current message. | 113 // Quit the current message. |
110 base::MessageLoop::current()->PostTask(FROM_HERE, | 114 base::MessageLoop::current()->PostTask(FROM_HERE, |
111 base::MessageLoop::QuitClosure()); | 115 base::MessageLoop::QuitClosure()); |
112 } | 116 } |
113 | 117 |
114 private: | 118 private: |
115 base::ProcessHandle service_process_handle_; | 119 base::Process service_process_; |
116 }; | 120 }; |
117 | 121 |
118 class RealServiceProcessControlBrowserTest | 122 class RealServiceProcessControlBrowserTest |
119 : public ServiceProcessControlBrowserTest { | 123 : public ServiceProcessControlBrowserTest { |
120 public: | 124 public: |
121 void SetUpCommandLine(base::CommandLine* command_line) override { | 125 void SetUpCommandLine(base::CommandLine* command_line) override { |
122 ServiceProcessControlBrowserTest::SetUpCommandLine(command_line); | 126 ServiceProcessControlBrowserTest::SetUpCommandLine(command_line); |
123 base::FilePath exe; | 127 base::FilePath exe; |
124 PathService::Get(base::DIR_EXE, &exe); | 128 PathService::Get(base::DIR_EXE, &exe); |
125 #if defined(OS_MACOSX) | 129 #if defined(OS_MACOSX) |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 // Callback should not be called during GetHistograms call. | 283 // Callback should not be called during GetHistograms call. |
280 EXPECT_CALL(*this, MockHistogramsCallback()).Times(0); | 284 EXPECT_CALL(*this, MockHistogramsCallback()).Times(0); |
281 // Wait for real callback by providing large timeout value. | 285 // Wait for real callback by providing large timeout value. |
282 EXPECT_TRUE(ServiceProcessControl::GetInstance()->GetHistograms( | 286 EXPECT_TRUE(ServiceProcessControl::GetInstance()->GetHistograms( |
283 base::Bind(&ServiceProcessControlBrowserTest::HistogramsCallback, | 287 base::Bind(&ServiceProcessControlBrowserTest::HistogramsCallback, |
284 base::Unretained(this)), | 288 base::Unretained(this)), |
285 base::TimeDelta::FromHours(1))); | 289 base::TimeDelta::FromHours(1))); |
286 EXPECT_CALL(*this, MockHistogramsCallback()).Times(1); | 290 EXPECT_CALL(*this, MockHistogramsCallback()).Times(1); |
287 content::RunMessageLoop(); | 291 content::RunMessageLoop(); |
288 } | 292 } |
OLD | NEW |