| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/process_singleton.h" | 5 #include "chrome/browser/process_singleton.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 ASSERT_NO_FATAL_FAILURE(base::MultiProcessTest::SetUp()); | 154 ASSERT_NO_FATAL_FAILURE(base::MultiProcessTest::SetUp()); |
| 155 | 155 |
| 156 // Drop the process finder notification timeout to one second for testing. | 156 // Drop the process finder notification timeout to one second for testing. |
| 157 old_notification_timeout_ = chrome::SetNotificationTimeoutForTesting( | 157 old_notification_timeout_ = chrome::SetNotificationTimeoutForTesting( |
| 158 base::TimeDelta::FromSeconds(1)); | 158 base::TimeDelta::FromSeconds(1)); |
| 159 } | 159 } |
| 160 | 160 |
| 161 void TearDown() override { | 161 void TearDown() override { |
| 162 chrome::SetNotificationTimeoutForTesting(old_notification_timeout_); | 162 chrome::SetNotificationTimeoutForTesting(old_notification_timeout_); |
| 163 | 163 |
| 164 if (browser_victim_.IsValid()) { | 164 if (browser_victim_.process.IsValid()) { |
| 165 EXPECT_TRUE(::SetEvent(continue_event_.Get())); | 165 EXPECT_TRUE(::SetEvent(continue_event_.Get())); |
| 166 EXPECT_TRUE(browser_victim_.WaitForExit(nullptr)); | 166 EXPECT_TRUE(browser_victim_.process.WaitForExit(nullptr)); |
| 167 } | 167 } |
| 168 | 168 |
| 169 base::MultiProcessTest::TearDown(); | 169 base::MultiProcessTest::TearDown(); |
| 170 } | 170 } |
| 171 | 171 |
| 172 void LaunchHungBrowserProcess(WindowOption window_option) { | 172 void LaunchHungBrowserProcess(WindowOption window_option) { |
| 173 // Create a unique user data dir to rendezvous on. | 173 // Create a unique user data dir to rendezvous on. |
| 174 ASSERT_TRUE(user_data_dir_.CreateUniqueTempDir()); | 174 ASSERT_TRUE(user_data_dir_.CreateUniqueTempDir()); |
| 175 | 175 |
| 176 // Create the named "ready" event, this is unique to our process. | 176 // Create the named "ready" event, this is unique to our process. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 188 ASSERT_TRUE(continue_event_.IsValid()); | 188 ASSERT_TRUE(continue_event_.IsValid()); |
| 189 | 189 |
| 190 window_option_ = window_option; | 190 window_option_ = window_option; |
| 191 | 191 |
| 192 base::LaunchOptions options; | 192 base::LaunchOptions options; |
| 193 options.start_hidden = true; | 193 options.start_hidden = true; |
| 194 browser_victim_ = | 194 browser_victim_ = |
| 195 SpawnChildWithOptions("ProcessSingletonTestProcessMain", options); | 195 SpawnChildWithOptions("ProcessSingletonTestProcessMain", options); |
| 196 | 196 |
| 197 // Wait for the ready event (or process exit). | 197 // Wait for the ready event (or process exit). |
| 198 HANDLE handles[] = {ready_event.Get(), browser_victim_.Handle()}; | 198 HANDLE handles[] = {ready_event.Get(), browser_victim_.process.Handle()}; |
| 199 // The wait should always return because either |ready_event| is signaled or | 199 // The wait should always return because either |ready_event| is signaled or |
| 200 // |browser_victim_| died unexpectedly or exited on error. | 200 // |browser_victim_| died unexpectedly or exited on error. |
| 201 DWORD result = | 201 DWORD result = |
| 202 ::WaitForMultipleObjects(arraysize(handles), handles, FALSE, INFINITE); | 202 ::WaitForMultipleObjects(arraysize(handles), handles, FALSE, INFINITE); |
| 203 ASSERT_EQ(WAIT_OBJECT_0, result); | 203 ASSERT_EQ(WAIT_OBJECT_0, result); |
| 204 } | 204 } |
| 205 | 205 |
| 206 base::CommandLine MakeCmdLine(const std::string& procname) override { | 206 base::CommandLine MakeCmdLine(const std::string& procname) override { |
| 207 base::CommandLine cmd_line = base::MultiProcessTest::MakeCmdLine(procname); | 207 base::CommandLine cmd_line = base::MultiProcessTest::MakeCmdLine(procname); |
| 208 | 208 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 221 // The ready event has been signalled - the process singleton is held by | 221 // The ready event has been signalled - the process singleton is held by |
| 222 // the hung sub process. | 222 // the hung sub process. |
| 223 test_singleton_.reset(new ProcessSingleton( | 223 test_singleton_.reset(new ProcessSingleton( |
| 224 user_data_dir(), base::Bind(&NotificationCallback))); | 224 user_data_dir(), base::Bind(&NotificationCallback))); |
| 225 | 225 |
| 226 test_singleton_->OverrideShouldKillRemoteProcessCallbackForTesting( | 226 test_singleton_->OverrideShouldKillRemoteProcessCallbackForTesting( |
| 227 base::Bind(&ProcessSingletonTest::MockShouldKillRemoteProcess, | 227 base::Bind(&ProcessSingletonTest::MockShouldKillRemoteProcess, |
| 228 base::Unretained(this), allow_kill)); | 228 base::Unretained(this), allow_kill)); |
| 229 } | 229 } |
| 230 | 230 |
| 231 base::Process* browser_victim() { return &browser_victim_; } | 231 base::Process* browser_victim() { return &(browser_victim_.process); } |
| 232 const base::FilePath& user_data_dir() const { | 232 const base::FilePath& user_data_dir() const { |
| 233 return user_data_dir_.GetPath(); | 233 return user_data_dir_.GetPath(); |
| 234 } | 234 } |
| 235 ProcessSingleton* test_singleton() const { return test_singleton_.get(); } | 235 ProcessSingleton* test_singleton() const { return test_singleton_.get(); } |
| 236 bool should_kill_called() const { return should_kill_called_; } | 236 bool should_kill_called() const { return should_kill_called_; } |
| 237 | 237 |
| 238 private: | 238 private: |
| 239 bool MockShouldKillRemoteProcess(bool allow_kill) { | 239 bool MockShouldKillRemoteProcess(bool allow_kill) { |
| 240 should_kill_called_ = true; | 240 should_kill_called_ = true; |
| 241 return allow_kill; | 241 return allow_kill; |
| 242 } | 242 } |
| 243 | 243 |
| 244 base::string16 ready_event_name_; | 244 base::string16 ready_event_name_; |
| 245 base::string16 continue_event_name_; | 245 base::string16 continue_event_name_; |
| 246 | 246 |
| 247 WindowOption window_option_; | 247 WindowOption window_option_; |
| 248 base::ScopedTempDir user_data_dir_; | 248 base::ScopedTempDir user_data_dir_; |
| 249 base::Process browser_victim_; | 249 base::SpawnChildResult browser_victim_; |
| 250 base::win::ScopedHandle continue_event_; | 250 base::win::ScopedHandle continue_event_; |
| 251 | 251 |
| 252 std::unique_ptr<ProcessSingleton> test_singleton_; | 252 std::unique_ptr<ProcessSingleton> test_singleton_; |
| 253 | 253 |
| 254 base::TimeDelta old_notification_timeout_; | 254 base::TimeDelta old_notification_timeout_; |
| 255 bool should_kill_called_; | 255 bool should_kill_called_; |
| 256 | 256 |
| 257 DISALLOW_COPY_AND_ASSIGN(ProcessSingletonTest); | 257 DISALLOW_COPY_AND_ASSIGN(ProcessSingletonTest); |
| 258 }; | 258 }; |
| 259 | 259 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 // visible window. | 318 // visible window. |
| 319 EXPECT_TRUE(should_kill_called()); | 319 EXPECT_TRUE(should_kill_called()); |
| 320 | 320 |
| 321 // Verify that the hung browser has been terminated with the | 321 // Verify that the hung browser has been terminated with the |
| 322 // RESULT_CODE_HUNG exit code. | 322 // RESULT_CODE_HUNG exit code. |
| 323 int exit_code = 0; | 323 int exit_code = 0; |
| 324 EXPECT_TRUE( | 324 EXPECT_TRUE( |
| 325 browser_victim()->WaitForExitWithTimeout(base::TimeDelta(), &exit_code)); | 325 browser_victim()->WaitForExitWithTimeout(base::TimeDelta(), &exit_code)); |
| 326 EXPECT_EQ(content::RESULT_CODE_HUNG, exit_code); | 326 EXPECT_EQ(content::RESULT_CODE_HUNG, exit_code); |
| 327 } | 327 } |
| OLD | NEW |