OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/test/ui/ui_test.h" | 5 #include "chrome/test/ui/ui_test.h" |
6 | 6 |
7 #if defined(OS_POSIX) | 7 #if defined(OS_POSIX) |
8 #include <signal.h> | 8 #include <signal.h> |
9 #include <sys/types.h> | 9 #include <sys/types.h> |
10 #endif | 10 #endif |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 | 54 |
55 #if defined(OS_WIN) | 55 #if defined(OS_WIN) |
56 #include "base/win/windows_version.h" | 56 #include "base/win/windows_version.h" |
57 #endif | 57 #endif |
58 | 58 |
59 | 59 |
60 using base::Time; | 60 using base::Time; |
61 using base::TimeDelta; | 61 using base::TimeDelta; |
62 using base::TimeTicks; | 62 using base::TimeTicks; |
63 | 63 |
64 // Passed as value of kTestType. | |
65 static const char kUITestType[] = "ui"; | |
66 | |
67 const wchar_t UITestBase::kFailedNoCrashService[] = | 64 const wchar_t UITestBase::kFailedNoCrashService[] = |
68 #if defined(OS_WIN) | 65 #if defined(OS_WIN) |
69 L"NOTE: This test is expected to fail if crash_service.exe is not " | 66 L"NOTE: This test is expected to fail if crash_service.exe is not " |
70 L"running. Start it manually before running this test (see the build " | 67 L"running. Start it manually before running this test (see the build " |
71 L"output directory)."; | 68 L"output directory)."; |
72 #elif defined(OS_LINUX) | 69 #elif defined(OS_LINUX) |
73 L"NOTE: This test is expected to fail if breakpad is not built in " | 70 L"NOTE: This test is expected to fail if breakpad is not built in " |
74 L"or if chromium is not running headless (try CHROME_HEADLESS=1)."; | 71 L"or if chromium is not running headless (try CHROME_HEADLESS=1)."; |
75 #else | 72 #else |
76 L"NOTE: Crash service not ported to this platform!"; | 73 L"NOTE: Crash service not ported to this platform!"; |
77 #endif | 74 #endif |
78 bool UITestBase::in_process_renderer_ = false; | |
79 bool UITestBase::no_sandbox_ = false; | |
80 bool UITestBase::full_memory_dump_ = false; | |
81 bool UITestBase::safe_plugins_ = false; | |
82 bool UITestBase::show_error_dialogs_ = true; | |
83 bool UITestBase::dump_histograms_on_exit_ = false; | |
84 bool UITestBase::enable_dcheck_ = false; | |
85 bool UITestBase::silent_dump_on_dcheck_ = false; | |
86 bool UITestBase::disable_breakpad_ = false; | |
87 std::string UITestBase::js_flags_ = ""; | |
88 std::string UITestBase::log_level_ = ""; | |
89 | 75 |
90 // Uncomment this line to have the spawned process wait for the debugger to | 76 // Uncomment this line to have the spawned process wait for the debugger to |
91 // attach. This only works on Windows. On posix systems, you can set the | 77 // attach. This only works on Windows. On posix systems, you can set the |
92 // BROWSER_WRAPPER env variable to wrap the browser process. | 78 // BROWSER_WRAPPER env variable to wrap the browser process. |
93 // #define WAIT_FOR_DEBUGGER_ON_OPEN 1 | 79 // #define WAIT_FOR_DEBUGGER_ON_OPEN 1 |
94 | 80 |
95 UITestBase::UITestBase() | 81 UITestBase::UITestBase() |
96 : launch_arguments_(CommandLine::NO_PROGRAM), | 82 : launch_arguments_(CommandLine::NO_PROGRAM), |
97 expected_errors_(0), | 83 expected_errors_(0), |
98 expected_crashes_(0), | 84 expected_crashes_(0), |
99 homepage_(chrome::kAboutBlankURL), | 85 homepage_(chrome::kAboutBlankURL), |
100 wait_for_initial_loads_(true), | 86 wait_for_initial_loads_(true), |
101 dom_automation_enabled_(false), | 87 dom_automation_enabled_(false), |
102 process_(base::kNullProcessHandle), | |
103 process_id_(-1), | |
104 show_window_(false), | 88 show_window_(false), |
105 clear_profile_(true), | 89 clear_profile_(true), |
106 include_testing_id_(true), | 90 include_testing_id_(true), |
107 enable_file_cookies_(true), | 91 enable_file_cookies_(true), |
108 profile_type_(UITestBase::DEFAULT_THEME), | 92 profile_type_(ProxyLauncher::DEFAULT_THEME), |
109 shutdown_type_(UITestBase::WINDOW_CLOSE), | 93 shutdown_type_(ProxyLauncher::WINDOW_CLOSE) { |
110 temp_profile_dir_(new ScopedTempDir()) { | |
111 PathService::Get(chrome::DIR_APP, &browser_directory_); | 94 PathService::Get(chrome::DIR_APP, &browser_directory_); |
112 PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_); | 95 PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_); |
| 96 launcher_.reset(CreateProxyLauncher()); |
113 } | 97 } |
114 | 98 |
115 UITestBase::UITestBase(MessageLoop::Type msg_loop_type) | 99 UITestBase::UITestBase(MessageLoop::Type msg_loop_type) |
116 : launch_arguments_(CommandLine::NO_PROGRAM), | 100 : launch_arguments_(CommandLine::NO_PROGRAM), |
117 expected_errors_(0), | 101 expected_errors_(0), |
118 expected_crashes_(0), | 102 expected_crashes_(0), |
119 homepage_(chrome::kAboutBlankURL), | |
120 wait_for_initial_loads_(true), | 103 wait_for_initial_loads_(true), |
121 dom_automation_enabled_(false), | 104 dom_automation_enabled_(false), |
122 process_(base::kNullProcessHandle), | |
123 process_id_(-1), | |
124 show_window_(false), | 105 show_window_(false), |
125 clear_profile_(true), | 106 clear_profile_(true), |
126 include_testing_id_(true), | 107 include_testing_id_(true), |
127 enable_file_cookies_(true), | 108 enable_file_cookies_(true), |
128 profile_type_(UITestBase::DEFAULT_THEME), | 109 profile_type_(ProxyLauncher::DEFAULT_THEME), |
129 shutdown_type_(UITestBase::WINDOW_CLOSE) { | 110 shutdown_type_(ProxyLauncher::WINDOW_CLOSE) { |
130 PathService::Get(chrome::DIR_APP, &browser_directory_); | 111 PathService::Get(chrome::DIR_APP, &browser_directory_); |
131 PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_); | 112 PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_); |
| 113 launcher_.reset(CreateProxyLauncher()); |
132 } | 114 } |
133 | 115 |
134 UITestBase::~UITestBase() { | 116 UITestBase::~UITestBase() {} |
135 } | |
136 | 117 |
137 void UITestBase::SetUp() { | 118 void UITestBase::SetUp() { |
138 AssertAppNotRunning(L"Please close any other instances " | 119 launcher_->AssertAppNotRunning(L"Please close any other instances " |
139 L"of the app before testing."); | 120 L"of the app before testing."); |
140 | 121 |
141 JavaScriptExecutionController::set_timeout( | 122 JavaScriptExecutionController::set_timeout( |
142 TestTimeouts::action_max_timeout_ms()); | 123 TestTimeouts::action_max_timeout_ms()); |
143 test_start_time_ = Time::NowFromSystemTime(); | 124 test_start_time_ = Time::NowFromSystemTime(); |
144 | 125 |
145 launcher_.reset(CreateProxyLauncher()); | 126 SetLaunchSwitches(); |
146 launcher_->InitializeConnection(this); | 127 launcher_->InitializeConnection(DefaultLaunchState(), |
| 128 wait_for_initial_loads_); |
147 } | 129 } |
148 | 130 |
149 void UITestBase::TearDown() { | 131 void UITestBase::TearDown() { |
150 CloseBrowserAndServer(); | 132 CloseBrowserAndServer(); |
151 | 133 |
152 // Make sure that we didn't encounter any assertion failures | 134 // Make sure that we didn't encounter any assertion failures |
153 logging::AssertionList assertions; | 135 logging::AssertionList assertions; |
154 logging::GetFatalAssertions(&assertions); | 136 logging::GetFatalAssertions(&assertions); |
155 | 137 |
156 // If there were errors, get all the error strings for display. | 138 // If there were errors, get all the error strings for display. |
(...skipping 14 matching lines...) Expand all Loading... |
171 L"Encountered an unexpected crash in the program during this test."; | 153 L"Encountered an unexpected crash in the program during this test."; |
172 if (expected_crashes_ > 0 && actual_crashes == 0) { | 154 if (expected_crashes_ > 0 && actual_crashes == 0) { |
173 error_msg += L" "; | 155 error_msg += L" "; |
174 error_msg += kFailedNoCrashService; | 156 error_msg += kFailedNoCrashService; |
175 } | 157 } |
176 EXPECT_EQ(expected_crashes_, actual_crashes) << error_msg; | 158 EXPECT_EQ(expected_crashes_, actual_crashes) << error_msg; |
177 } | 159 } |
178 | 160 |
179 // TODO(phajdan.jr): get rid of set_command_execution_timeout_ms. | 161 // TODO(phajdan.jr): get rid of set_command_execution_timeout_ms. |
180 void UITestBase::set_command_execution_timeout_ms(int timeout) { | 162 void UITestBase::set_command_execution_timeout_ms(int timeout) { |
181 automation_proxy_->set_command_execution_timeout_ms(timeout); | 163 automation()->set_command_execution_timeout_ms(timeout); |
182 VLOG(1) << "Automation command execution timeout set to " << timeout << " ms"; | 164 VLOG(1) << "Automation command execution timeout set to " << timeout << " ms"; |
183 } | 165 } |
184 | 166 |
185 ProxyLauncher* UITestBase::CreateProxyLauncher() { | 167 ProxyLauncher* UITestBase::CreateProxyLauncher() { |
186 return new AnonymousProxyLauncher(false); | 168 return new AnonymousProxyLauncher(false); |
187 } | 169 } |
188 | 170 |
| 171 void UITestBase::SetLaunchSwitches() { |
| 172 // We need cookies on file:// for things like the page cycler. |
| 173 if (enable_file_cookies_) |
| 174 launch_arguments_.AppendSwitch(switches::kEnableFileCookies); |
| 175 if (dom_automation_enabled_) |
| 176 launch_arguments_.AppendSwitch(switches::kDomAutomationController); |
| 177 if (!homepage_.empty()) |
| 178 launch_arguments_.AppendSwitchASCII(switches::kHomePage, homepage_); |
| 179 if (!test_name_.empty()) |
| 180 launch_arguments_.AppendSwitchASCII(switches::kTestName, test_name_); |
| 181 } |
| 182 |
189 void UITestBase::LaunchBrowser() { | 183 void UITestBase::LaunchBrowser() { |
190 LaunchBrowser(launch_arguments_, clear_profile_); | 184 LaunchBrowser(launch_arguments_, clear_profile_); |
191 } | 185 } |
192 | 186 |
193 void UITestBase::LaunchBrowserAndServer() { | 187 void UITestBase::LaunchBrowserAndServer() { |
194 // Set up IPC testing interface as a server. | 188 launcher_->LaunchBrowserAndServer(DefaultLaunchState(), |
195 automation_proxy_.reset(launcher_->CreateAutomationProxy( | 189 wait_for_initial_loads_); |
196 TestTimeouts::command_execution_timeout_ms())); | |
197 | |
198 LaunchBrowser(launch_arguments_, clear_profile_); | |
199 WaitForBrowserLaunch(); | |
200 } | 190 } |
201 | 191 |
202 void UITestBase::ConnectToRunningBrowser() { | 192 void UITestBase::ConnectToRunningBrowser() { |
203 // Set up IPC testing interface as a client. | 193 launcher_->ConnectToRunningBrowser(wait_for_initial_loads_); |
204 automation_proxy_.reset(launcher_->CreateAutomationProxy( | |
205 TestTimeouts::command_execution_timeout_ms())); | |
206 WaitForBrowserLaunch(); | |
207 } | |
208 | |
209 void UITestBase::WaitForBrowserLaunch() { | |
210 ASSERT_EQ(AUTOMATION_SUCCESS, automation_proxy_->WaitForAppLaunch()) | |
211 << "Error while awaiting automation ping from browser process"; | |
212 if (wait_for_initial_loads_) | |
213 ASSERT_TRUE(automation_proxy_->WaitForInitialLoads()); | |
214 else | |
215 base::PlatformThread::Sleep(sleep_timeout_ms()); | |
216 | |
217 EXPECT_TRUE(automation()->SetFilteredInet(ShouldFilterInet())); | |
218 } | 194 } |
219 | 195 |
220 void UITestBase::CloseBrowserAndServer() { | 196 void UITestBase::CloseBrowserAndServer() { |
221 QuitBrowser(); | 197 launcher_->CloseBrowserAndServer(shutdown_type_); |
222 CleanupAppProcesses(); | |
223 | |
224 // Suppress spammy failures that seem to be occurring when running | |
225 // the UI tests in single-process mode. | |
226 // TODO(jhughes): figure out why this is necessary at all, and fix it | |
227 if (!in_process_renderer_) | |
228 AssertAppNotRunning(StringPrintf( | |
229 L"Unable to quit all browser processes. Original PID %d", process_id_)); | |
230 | |
231 automation_proxy_.reset(); // Shut down IPC testing interface. | |
232 } | 198 } |
233 | 199 |
234 void UITestBase::LaunchBrowser(const CommandLine& arguments, | 200 void UITestBase::LaunchBrowser(const CommandLine& arguments, |
235 bool clear_profile) { | 201 bool clear_profile) { |
236 if (clear_profile || !temp_profile_dir_->IsValid()) { | 202 ProxyLauncher::LaunchState state = DefaultLaunchState(); |
237 temp_profile_dir_.reset(new ScopedTempDir()); | 203 state.clear_profile = clear_profile; |
238 ASSERT_TRUE(temp_profile_dir_->CreateUniqueTempDir()); | 204 launcher_->LaunchBrowser(state); |
239 | |
240 ASSERT_TRUE( | |
241 test_launcher_utils::OverrideUserDataDir(temp_profile_dir_->path())); | |
242 } | |
243 | |
244 if (!template_user_data_.empty()) { | |
245 // Recursively copy the template directory to the user_data_dir. | |
246 ASSERT_TRUE(file_util::CopyRecursiveDirNoCache( | |
247 template_user_data_, | |
248 user_data_dir())); | |
249 // If we're using the complex theme data, we need to write the | |
250 // user_data_dir_ to our preferences file. | |
251 if (profile_type_ == UITestBase::COMPLEX_THEME) { | |
252 RewritePreferencesFile(user_data_dir()); | |
253 } | |
254 | |
255 // Update the history file to include recent dates. | |
256 UpdateHistoryDates(); | |
257 } | |
258 | |
259 ASSERT_TRUE(LaunchBrowserHelper(arguments, false, &process_)); | |
260 process_id_ = base::GetProcId(process_); | |
261 } | 205 } |
262 | 206 |
263 #if !defined(OS_MACOSX) | 207 #if !defined(OS_MACOSX) |
264 bool UITestBase::LaunchAnotherBrowserBlockUntilClosed( | 208 bool UITestBase::LaunchAnotherBrowserBlockUntilClosed( |
265 const CommandLine& cmdline) { | 209 const CommandLine& cmdline) { |
266 return LaunchBrowserHelper(cmdline, true, NULL); | 210 ProxyLauncher::LaunchState state = DefaultLaunchState(); |
| 211 state.arguments = cmdline; |
| 212 return launcher_->LaunchAnotherBrowserBlockUntilClosed(state); |
267 } | 213 } |
268 #endif | 214 #endif |
269 | 215 |
270 void UITestBase::QuitBrowser() { | 216 void UITestBase::QuitBrowser() { |
271 if (SESSION_ENDING == shutdown_type_) { | 217 launcher_->QuitBrowser(shutdown_type_); |
272 TerminateBrowser(); | |
273 return; | |
274 } | |
275 | |
276 // There's nothing to do here if the browser is not running. | |
277 // WARNING: There is a race condition here where the browser may shut down | |
278 // after this check but before some later automation call. Your test should | |
279 // use WaitForBrowserProcessToQuit() if it intentionally | |
280 // causes the browser to shut down. | |
281 if (IsBrowserRunning()) { | |
282 TimeTicks quit_start = TimeTicks::Now(); | |
283 EXPECT_TRUE(automation()->SetFilteredInet(false)); | |
284 | |
285 if (WINDOW_CLOSE == shutdown_type_) { | |
286 int window_count = 0; | |
287 EXPECT_TRUE(automation()->GetBrowserWindowCount(&window_count)); | |
288 | |
289 // Synchronously close all but the last browser window. Closing them | |
290 // one-by-one may help with stability. | |
291 while (window_count > 1) { | |
292 scoped_refptr<BrowserProxy> browser_proxy = | |
293 automation()->GetBrowserWindow(0); | |
294 EXPECT_TRUE(browser_proxy.get()); | |
295 if (browser_proxy.get()) { | |
296 EXPECT_TRUE(browser_proxy->RunCommand(IDC_CLOSE_WINDOW)); | |
297 EXPECT_TRUE(automation()->GetBrowserWindowCount(&window_count)); | |
298 } else { | |
299 break; | |
300 } | |
301 } | |
302 | |
303 // Close the last window asynchronously, because the browser may | |
304 // shutdown faster than it will be able to send a synchronous response | |
305 // to our message. | |
306 scoped_refptr<BrowserProxy> browser_proxy = | |
307 automation()->GetBrowserWindow(0); | |
308 EXPECT_TRUE(browser_proxy.get()); | |
309 if (browser_proxy.get()) { | |
310 EXPECT_TRUE(browser_proxy->ApplyAccelerator(IDC_CLOSE_WINDOW)); | |
311 browser_proxy = NULL; | |
312 } | |
313 } else if (USER_QUIT == shutdown_type_) { | |
314 scoped_refptr<BrowserProxy> browser_proxy = | |
315 automation()->GetBrowserWindow(0); | |
316 EXPECT_TRUE(browser_proxy.get()); | |
317 if (browser_proxy.get()) { | |
318 EXPECT_TRUE(browser_proxy->RunCommandAsync(IDC_EXIT)); | |
319 } | |
320 } else { | |
321 NOTREACHED() << "Invalid shutdown type " << shutdown_type_; | |
322 } | |
323 | |
324 // Now, drop the automation IPC channel so that the automation provider in | |
325 // the browser notices and drops its reference to the browser process. | |
326 automation()->Disconnect(); | |
327 | |
328 // Wait for the browser process to quit. It should quit once all tabs have | |
329 // been closed. | |
330 if (!WaitForBrowserProcessToQuit()) { | |
331 // We need to force the browser to quit because it didn't quit fast | |
332 // enough. Take no chance and kill every chrome processes. | |
333 CleanupAppProcesses(); | |
334 } | |
335 browser_quit_time_ = TimeTicks::Now() - quit_start; | |
336 } | |
337 | |
338 // Don't forget to close the handle | |
339 base::CloseProcessHandle(process_); | |
340 process_ = base::kNullProcessHandle; | |
341 process_id_ = -1; | |
342 } | 218 } |
343 | 219 |
344 void UITestBase::TerminateBrowser() { | 220 void UITestBase::TerminateBrowser() { |
345 if (IsBrowserRunning()) { | 221 launcher_->TerminateBrowser(); |
346 TimeTicks quit_start = TimeTicks::Now(); | |
347 EXPECT_TRUE(automation()->SetFilteredInet(false)); | |
348 #if defined(OS_WIN) | |
349 scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); | |
350 ASSERT_TRUE(browser.get()); | |
351 ASSERT_TRUE(browser->TerminateSession()); | |
352 #endif // defined(OS_WIN) | |
353 | |
354 // Now, drop the automation IPC channel so that the automation provider in | |
355 // the browser notices and drops its reference to the browser process. | |
356 automation()->Disconnect(); | |
357 | |
358 #if defined(OS_POSIX) | |
359 EXPECT_EQ(kill(process_, SIGTERM), 0); | |
360 #endif // OS_POSIX | |
361 | |
362 if (!WaitForBrowserProcessToQuit()) { | |
363 // We need to force the browser to quit because it didn't quit fast | |
364 // enough. Take no chance and kill every chrome processes. | |
365 CleanupAppProcesses(); | |
366 } | |
367 browser_quit_time_ = TimeTicks::Now() - quit_start; | |
368 } | |
369 | |
370 // Don't forget to close the handle | |
371 base::CloseProcessHandle(process_); | |
372 process_ = base::kNullProcessHandle; | |
373 process_id_ = -1; | |
374 } | |
375 | |
376 void UITestBase::AssertAppNotRunning(const std::wstring& error_message) { | |
377 std::wstring final_error_message(error_message); | |
378 | |
379 ChromeProcessList processes = GetRunningChromeProcesses(process_id_); | |
380 if (!processes.empty()) { | |
381 final_error_message += L" Leftover PIDs: ["; | |
382 for (ChromeProcessList::const_iterator it = processes.begin(); | |
383 it != processes.end(); ++it) { | |
384 final_error_message += StringPrintf(L" %d", *it); | |
385 } | |
386 final_error_message += L" ]"; | |
387 } | |
388 ASSERT_TRUE(processes.empty()) << final_error_message; | |
389 } | 222 } |
390 | 223 |
391 void UITestBase::CleanupAppProcesses() { | 224 void UITestBase::CleanupAppProcesses() { |
392 TerminateAllChromeProcesses(process_id_); | 225 TerminateAllChromeProcesses(browser_process_id()); |
393 } | 226 } |
394 | 227 |
395 scoped_refptr<TabProxy> UITestBase::GetActiveTab(int window_index) { | 228 scoped_refptr<TabProxy> UITestBase::GetActiveTab(int window_index) { |
396 EXPECT_GE(window_index, 0); | 229 EXPECT_GE(window_index, 0); |
397 int window_count = -1; | 230 int window_count = -1; |
398 // We have to use EXPECT rather than ASSERT here because ASSERT_* only works | 231 // We have to use EXPECT rather than ASSERT here because ASSERT_* only works |
399 // in functions that return void. | 232 // in functions that return void. |
400 EXPECT_TRUE(automation()->GetBrowserWindowCount(&window_count)); | 233 EXPECT_TRUE(automation()->GetBrowserWindowCount(&window_count)); |
401 if (window_count == -1) | 234 if (window_count == -1) |
402 return NULL; | 235 return NULL; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 scoped_refptr<BrowserProxy> window = | 290 scoped_refptr<BrowserProxy> window = |
458 automation()->GetBrowserWindow(window_index); | 291 automation()->GetBrowserWindow(window_index); |
459 ASSERT_TRUE(window.get()); | 292 ASSERT_TRUE(window.get()); |
460 scoped_refptr<TabProxy> tab_proxy(window->GetTab(tab_index)); | 293 scoped_refptr<TabProxy> tab_proxy(window->GetTab(tab_index)); |
461 ASSERT_TRUE(tab_proxy.get()); | 294 ASSERT_TRUE(tab_proxy.get()); |
462 EXPECT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, | 295 EXPECT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, |
463 tab_proxy->NavigateToURLBlockUntilNavigationsComplete( | 296 tab_proxy->NavigateToURLBlockUntilNavigationsComplete( |
464 url, number_of_navigations)) << url.spec(); | 297 url, number_of_navigations)) << url.spec(); |
465 } | 298 } |
466 | 299 |
467 bool UITestBase::WaitForBrowserProcessToQuit() { | 300 bool UITestBase::WaitForBrowserProcessToQuit(int timeout) { |
468 // Wait for the browser process to quit. | 301 return launcher_->WaitForBrowserProcessToQuit(timeout); |
469 int timeout = TestTimeouts::wait_for_terminate_timeout_ms(); | |
470 #ifdef WAIT_FOR_DEBUGGER_ON_OPEN | |
471 timeout = 500000; | |
472 #endif | |
473 return base::WaitForSingleProcess(process_, timeout); | |
474 } | 302 } |
475 | 303 |
476 bool UITestBase::WaitForBookmarkBarVisibilityChange(BrowserProxy* browser, | 304 bool UITestBase::WaitForBookmarkBarVisibilityChange(BrowserProxy* browser, |
477 bool wait_for_open) { | 305 bool wait_for_open) { |
478 const int kCycles = 10; | 306 const int kCycles = 10; |
479 for (int i = 0; i < kCycles; i++) { | 307 for (int i = 0; i < kCycles; i++) { |
480 bool visible = false; | 308 bool visible = false; |
481 bool animating = true; | 309 bool animating = true; |
482 if (!browser->GetBookmarkBarVisibility(&visible, &animating)) | 310 if (!browser->GetBookmarkBarVisibility(&visible, &animating)) |
483 return false; // Some error. | 311 return false; // Some error. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 EXPECT_TRUE(window_proxy.get()); | 354 EXPECT_TRUE(window_proxy.get()); |
527 if (!window_proxy.get()) | 355 if (!window_proxy.get()) |
528 return -1; | 356 return -1; |
529 | 357 |
530 int active_tab_index = -1; | 358 int active_tab_index = -1; |
531 EXPECT_TRUE(window_proxy->GetActiveTabIndex(&active_tab_index)); | 359 EXPECT_TRUE(window_proxy->GetActiveTabIndex(&active_tab_index)); |
532 return active_tab_index; | 360 return active_tab_index; |
533 } | 361 } |
534 | 362 |
535 bool UITestBase::IsBrowserRunning() { | 363 bool UITestBase::IsBrowserRunning() { |
536 return CrashAwareSleep(0); | 364 return launcher_->IsBrowserRunning(); |
537 } | 365 } |
538 | 366 |
539 bool UITestBase::CrashAwareSleep(int time_out_ms) { | 367 bool UITestBase::CrashAwareSleep(int timeout_ms) { |
540 return base::CrashAwareSleep(process_, time_out_ms); | 368 return launcher_->CrashAwareSleep(timeout_ms); |
541 } | 369 } |
542 | 370 |
543 int UITestBase::GetTabCount() { | 371 int UITestBase::GetTabCount() { |
544 return GetTabCount(0); | 372 return GetTabCount(0); |
545 } | 373 } |
546 | 374 |
547 int UITestBase::GetTabCount(int window_index) { | 375 int UITestBase::GetTabCount(int window_index) { |
548 scoped_refptr<BrowserProxy> window( | 376 scoped_refptr<BrowserProxy> window( |
549 automation()->GetBrowserWindow(window_index)); | 377 automation()->GetBrowserWindow(window_index)); |
550 EXPECT_TRUE(window.get()); | 378 EXPECT_TRUE(window.get()); |
(...skipping 27 matching lines...) Expand all Loading... |
578 EXPECT_TRUE(tab_proxy.get()); | 406 EXPECT_TRUE(tab_proxy.get()); |
579 if (!tab_proxy.get()) | 407 if (!tab_proxy.get()) |
580 return FilePath(); | 408 return FilePath(); |
581 | 409 |
582 FilePath download_directory; | 410 FilePath download_directory; |
583 EXPECT_TRUE(tab_proxy->GetDownloadDirectory(&download_directory)); | 411 EXPECT_TRUE(tab_proxy->GetDownloadDirectory(&download_directory)); |
584 return download_directory; | 412 return download_directory; |
585 } | 413 } |
586 | 414 |
587 void UITestBase::CloseBrowserAsync(BrowserProxy* browser) const { | 415 void UITestBase::CloseBrowserAsync(BrowserProxy* browser) const { |
588 ASSERT_TRUE(automation_proxy_->Send( | 416 ASSERT_TRUE(automation()->Send( |
589 new AutomationMsg_CloseBrowserRequestAsync(browser->handle()))); | 417 new AutomationMsg_CloseBrowserRequestAsync(browser->handle()))); |
590 } | 418 } |
591 | 419 |
592 bool UITestBase::CloseBrowser(BrowserProxy* browser, | 420 bool UITestBase::CloseBrowser(BrowserProxy* browser, |
593 bool* application_closed) const { | 421 bool* application_closed) const { |
594 DCHECK(application_closed); | 422 DCHECK(application_closed); |
595 if (!browser->is_valid() || !browser->handle()) | 423 if (!browser->is_valid() || !browser->handle()) |
596 return false; | 424 return false; |
597 | 425 |
598 bool result = true; | 426 bool result = true; |
599 | 427 |
600 bool succeeded = automation_proxy_->Send(new AutomationMsg_CloseBrowser( | 428 bool succeeded = automation()->Send(new AutomationMsg_CloseBrowser( |
601 browser->handle(), &result, application_closed)); | 429 browser->handle(), &result, application_closed)); |
602 | 430 |
603 if (!succeeded) | 431 if (!succeeded) |
604 return false; | 432 return false; |
605 | 433 |
606 if (*application_closed) { | 434 if (*application_closed) { |
607 // Let's wait until the process dies (if it is not gone already). | 435 // Let's wait until the process dies (if it is not gone already). |
608 bool success = base::WaitForSingleProcess(process_, base::kNoTimeout); | 436 bool success = base::WaitForSingleProcess(process(), base::kNoTimeout); |
609 EXPECT_TRUE(success); | 437 EXPECT_TRUE(success); |
610 } | 438 } |
611 | 439 |
612 return result; | 440 return result; |
613 } | 441 } |
614 | 442 |
615 // static | 443 // static |
616 void UITestBase::RewritePreferencesFile(const FilePath& user_data_dir) { | 444 FilePath UITestBase::ComputeTypicalUserDataSource( |
617 const FilePath pref_template_path( | 445 ProxyLauncher::ProfileType profile_type) { |
618 user_data_dir.AppendASCII("Default").AppendASCII("PreferencesTemplate")); | |
619 const FilePath pref_path( | |
620 user_data_dir.AppendASCII("Default").AppendASCII("Preferences")); | |
621 | |
622 // Read in preferences template. | |
623 std::string pref_string; | |
624 EXPECT_TRUE(file_util::ReadFileToString(pref_template_path, &pref_string)); | |
625 string16 format_string = ASCIIToUTF16(pref_string); | |
626 | |
627 // Make sure temp directory has the proper format for writing to prefs file. | |
628 #if defined(OS_POSIX) | |
629 std::wstring user_data_dir_w(ASCIIToWide(user_data_dir.value())); | |
630 #elif defined(OS_WIN) | |
631 std::wstring user_data_dir_w(user_data_dir.value()); | |
632 // In Windows, the FilePath will write '\' for the path separators; change | |
633 // these to a separator that won't trigger escapes. | |
634 std::replace(user_data_dir_w.begin(), | |
635 user_data_dir_w.end(), '\\', '/'); | |
636 #endif | |
637 | |
638 // Rewrite prefs file. | |
639 std::vector<string16> subst; | |
640 subst.push_back(WideToUTF16(user_data_dir_w)); | |
641 const std::string prefs_string = | |
642 UTF16ToASCII(ReplaceStringPlaceholders(format_string, subst, NULL)); | |
643 EXPECT_TRUE(file_util::WriteFile(pref_path, prefs_string.c_str(), | |
644 prefs_string.size())); | |
645 file_util::EvictFileFromSystemCache(pref_path); | |
646 } | |
647 | |
648 FilePath UITestBase::user_data_dir() const { | |
649 EXPECT_TRUE(temp_profile_dir_->IsValid()); | |
650 return temp_profile_dir_->path(); | |
651 } | |
652 | |
653 // static | |
654 FilePath UITestBase::ComputeTypicalUserDataSource(ProfileType profile_type) { | |
655 FilePath source_history_file; | 446 FilePath source_history_file; |
656 EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, | 447 EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, |
657 &source_history_file)); | 448 &source_history_file)); |
658 source_history_file = source_history_file.AppendASCII("profiles"); | 449 source_history_file = source_history_file.AppendASCII("profiles"); |
659 switch (profile_type) { | 450 switch (profile_type) { |
660 case UITestBase::DEFAULT_THEME: | 451 case ProxyLauncher::DEFAULT_THEME: |
661 source_history_file = source_history_file.AppendASCII("typical_history"); | 452 source_history_file = source_history_file.AppendASCII("typical_history"); |
662 break; | 453 break; |
663 case UITestBase::COMPLEX_THEME: | 454 case ProxyLauncher::COMPLEX_THEME: |
664 source_history_file = source_history_file.AppendASCII("complex_theme"); | 455 source_history_file = source_history_file.AppendASCII("complex_theme"); |
665 break; | 456 break; |
666 case UITestBase::NATIVE_THEME: | 457 case ProxyLauncher::NATIVE_THEME: |
667 source_history_file = source_history_file.AppendASCII("gtk_theme"); | 458 source_history_file = source_history_file.AppendASCII("gtk_theme"); |
668 break; | 459 break; |
669 case UITestBase::CUSTOM_FRAME: | 460 case ProxyLauncher::CUSTOM_FRAME: |
670 source_history_file = source_history_file.AppendASCII("custom_frame"); | 461 source_history_file = source_history_file.AppendASCII("custom_frame"); |
671 break; | 462 break; |
672 case UITestBase::CUSTOM_FRAME_NATIVE_THEME: | 463 case ProxyLauncher::CUSTOM_FRAME_NATIVE_THEME: |
673 source_history_file = | 464 source_history_file = |
674 source_history_file.AppendASCII("custom_frame_gtk_theme"); | 465 source_history_file.AppendASCII("custom_frame_gtk_theme"); |
675 break; | 466 break; |
676 default: | 467 default: |
677 NOTREACHED(); | 468 NOTREACHED(); |
678 } | 469 } |
679 return source_history_file; | 470 return source_history_file; |
680 } | 471 } |
681 | 472 |
682 void UITestBase::PrepareTestCommandline(CommandLine* command_line) { | |
683 // Propagate commandline settings from test_launcher_utils. | |
684 test_launcher_utils::PrepareBrowserCommandLineForTests(command_line); | |
685 | |
686 // Add any explicit command line flags passed to the process. | |
687 CommandLine::StringType extra_chrome_flags = | |
688 CommandLine::ForCurrentProcess()->GetSwitchValueNative( | |
689 switches::kExtraChromeFlags); | |
690 if (!extra_chrome_flags.empty()) { | |
691 // Split by spaces and append to command line | |
692 std::vector<CommandLine::StringType> flags; | |
693 base::SplitString(extra_chrome_flags, ' ', &flags); | |
694 for (size_t i = 0; i < flags.size(); ++i) | |
695 command_line->AppendArgNative(flags[i]); | |
696 } | |
697 | |
698 // No default browser check, it would create an info-bar (if we are not the | |
699 // default browser) that could conflicts with some tests expectations. | |
700 command_line->AppendSwitch(switches::kNoDefaultBrowserCheck); | |
701 | |
702 // This is a UI test. | |
703 command_line->AppendSwitchASCII(switches::kTestType, kUITestType); | |
704 | |
705 // Tell the browser to use a temporary directory just for this test. | |
706 command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir()); | |
707 | |
708 // We need cookies on file:// for things like the page cycler. | |
709 if (enable_file_cookies_) | |
710 command_line->AppendSwitch(switches::kEnableFileCookies); | |
711 | |
712 if (dom_automation_enabled_) | |
713 command_line->AppendSwitch(switches::kDomAutomationController); | |
714 | |
715 if (include_testing_id_) | |
716 command_line->AppendSwitchASCII(switches::kTestingChannelID, | |
717 launcher_->PrefixedChannelID()); | |
718 | |
719 if (!show_error_dialogs_ && | |
720 !CommandLine::ForCurrentProcess()->HasSwitch( | |
721 switches::kEnableErrorDialogs)) { | |
722 command_line->AppendSwitch(switches::kNoErrorDialogs); | |
723 } | |
724 if (in_process_renderer_) | |
725 command_line->AppendSwitch(switches::kSingleProcess); | |
726 if (no_sandbox_) | |
727 command_line->AppendSwitch(switches::kNoSandbox); | |
728 if (full_memory_dump_) | |
729 command_line->AppendSwitch(switches::kFullMemoryCrashReport); | |
730 if (safe_plugins_) | |
731 command_line->AppendSwitch(switches::kSafePlugins); | |
732 if (enable_dcheck_) | |
733 command_line->AppendSwitch(switches::kEnableDCHECK); | |
734 if (silent_dump_on_dcheck_) | |
735 command_line->AppendSwitch(switches::kSilentDumpOnDCHECK); | |
736 if (disable_breakpad_) | |
737 command_line->AppendSwitch(switches::kDisableBreakpad); | |
738 if (!homepage_.empty()) | |
739 command_line->AppendSwitchASCII(switches::kHomePage, homepage_); | |
740 | |
741 if (!js_flags_.empty()) | |
742 command_line->AppendSwitchASCII(switches::kJavaScriptFlags, js_flags_); | |
743 if (!log_level_.empty()) | |
744 command_line->AppendSwitchASCII(switches::kLoggingLevel, log_level_); | |
745 | |
746 command_line->AppendSwitch(switches::kMetricsRecordingOnly); | |
747 | |
748 if (!CommandLine::ForCurrentProcess()->HasSwitch( | |
749 switches::kEnableErrorDialogs)) | |
750 command_line->AppendSwitch(switches::kEnableLogging); | |
751 | |
752 if (dump_histograms_on_exit_) | |
753 command_line->AppendSwitch(switches::kDumpHistogramsOnExit); | |
754 | |
755 #ifdef WAIT_FOR_DEBUGGER_ON_OPEN | |
756 command_line->AppendSwitch(switches::kDebugOnStart); | |
757 #endif | |
758 | |
759 if (!ui_test_name_.empty()) | |
760 command_line->AppendSwitchASCII(switches::kTestName, ui_test_name_); | |
761 | |
762 // The tests assume that file:// URIs can freely access other file:// URIs. | |
763 command_line->AppendSwitch(switches::kAllowFileAccessFromFiles); | |
764 | |
765 // Disable TabCloseableStateWatcher for tests. | |
766 command_line->AppendSwitch(switches::kDisableTabCloseableStateWatcher); | |
767 | |
768 // Allow file:// access on ChromeOS. | |
769 command_line->AppendSwitch(switches::kAllowFileAccess); | |
770 } | |
771 | |
772 bool UITestBase::LaunchBrowserHelper(const CommandLine& arguments, | |
773 bool wait, | |
774 base::ProcessHandle* process) { | |
775 FilePath command = browser_directory_.Append( | |
776 chrome::kBrowserProcessExecutablePath); | |
777 | |
778 CommandLine command_line(command); | |
779 | |
780 // Add command line arguments that should be applied to all UI tests. | |
781 PrepareTestCommandline(&command_line); | |
782 DebugFlags::ProcessDebugFlags( | |
783 &command_line, ChildProcessInfo::UNKNOWN_PROCESS, false); | |
784 command_line.AppendArguments(arguments, false); | |
785 | |
786 // TODO(phajdan.jr): Only run it for "main" browser launch. | |
787 browser_launch_time_ = TimeTicks::Now(); | |
788 | |
789 #if defined(OS_WIN) | |
790 bool started = base::LaunchApp(command_line, | |
791 wait, | |
792 !show_window_, | |
793 process); | |
794 #elif defined(OS_POSIX) | |
795 // Sometimes one needs to run the browser under a special environment | |
796 // (e.g. valgrind) without also running the test harness (e.g. python) | |
797 // under the special environment. Provide a way to wrap the browser | |
798 // commandline with a special prefix to invoke the special environment. | |
799 const char* browser_wrapper = getenv("BROWSER_WRAPPER"); | |
800 if (browser_wrapper) { | |
801 command_line.PrependWrapper(browser_wrapper); | |
802 VLOG(1) << "BROWSER_WRAPPER was set, prefixing command_line with " | |
803 << browser_wrapper; | |
804 } | |
805 | |
806 base::file_handle_mapping_vector fds; | |
807 if (automation_proxy_.get()) | |
808 fds = automation_proxy_->fds_to_map(); | |
809 | |
810 bool started = base::LaunchApp(command_line.argv(), fds, wait, process); | |
811 #endif | |
812 | |
813 return started; | |
814 } | |
815 | |
816 void UITestBase::UpdateHistoryDates() { | |
817 // Migrate the times in the segment_usage table to yesterday so we get | |
818 // actual thumbnails on the NTP. | |
819 sql::Connection db; | |
820 FilePath history = | |
821 user_data_dir().AppendASCII("Default").AppendASCII("History"); | |
822 // Not all test profiles have a history file. | |
823 if (!file_util::PathExists(history)) | |
824 return; | |
825 | |
826 ASSERT_TRUE(db.Open(history)); | |
827 Time yesterday = Time::Now() - TimeDelta::FromDays(1); | |
828 std::string yesterday_str = base::Int64ToString(yesterday.ToInternalValue()); | |
829 std::string query = StringPrintf( | |
830 "UPDATE segment_usage " | |
831 "SET time_slot = %s " | |
832 "WHERE id IN (SELECT id FROM segment_usage WHERE time_slot > 0);", | |
833 yesterday_str.c_str()); | |
834 ASSERT_TRUE(db.Execute(query.c_str())); | |
835 db.Close(); | |
836 file_util::EvictFileFromSystemCache(history); | |
837 } | |
838 | |
839 int UITestBase::GetCrashCount() { | 473 int UITestBase::GetCrashCount() { |
840 FilePath crash_dump_path; | 474 FilePath crash_dump_path; |
841 PathService::Get(chrome::DIR_CRASH_DUMPS, &crash_dump_path); | 475 PathService::Get(chrome::DIR_CRASH_DUMPS, &crash_dump_path); |
842 int actual_crashes = file_util::CountFilesCreatedAfter( | 476 int actual_crashes = file_util::CountFilesCreatedAfter( |
843 crash_dump_path, test_start_time_); | 477 crash_dump_path, test_start_time_); |
844 | 478 |
845 #if defined(OS_WIN) | 479 #if defined(OS_WIN) |
846 // Each crash creates two dump files, so we divide by two here. | 480 // Each crash creates two dump files, so we divide by two here. |
847 actual_crashes /= 2; | 481 actual_crashes /= 2; |
848 #endif | 482 #endif |
849 | 483 |
850 return actual_crashes; | 484 return actual_crashes; |
851 } | 485 } |
852 | 486 |
853 void UITestBase::SetBrowserDirectory(const FilePath& dir) { | 487 void UITestBase::SetBrowserDirectory(const FilePath& dir) { |
854 browser_directory_ = dir; | 488 browser_directory_ = dir; |
855 } | 489 } |
856 | 490 |
857 // UITest methods | 491 // UITest methods |
858 | 492 |
859 void UITest::SetUp() { | 493 void UITest::SetUp() { |
860 // Pass the test case name to chrome.exe on the command line to help with | 494 // Pass the test case name to chrome.exe on the command line to help with |
861 // parsing Purify output. | 495 // parsing Purify output. |
862 const testing::TestInfo* const test_info = | 496 const testing::TestInfo* const test_info = |
863 testing::UnitTest::GetInstance()->current_test_info(); | 497 testing::UnitTest::GetInstance()->current_test_info(); |
864 if (test_info) { | 498 if (test_info) { |
865 set_ui_test_name(test_info->test_case_name() + std::string(".") + | 499 set_test_name(test_info->test_case_name() + std::string(".") + |
866 test_info->name()); | 500 test_info->name()); |
867 } | 501 } |
868 | 502 |
869 // Force tests to use OSMesa if they launch the GPU process. This is in | 503 // Force tests to use OSMesa if they launch the GPU process. This is in |
870 // UITest::SetUp so that it does not affect pyautolib, which runs tests that | 504 // UITest::SetUp so that it does not affect pyautolib, which runs tests that |
871 // do not work with OSMesa. | 505 // do not work with OSMesa. |
872 launch_arguments_.AppendSwitchASCII(switches::kUseGL, | 506 launch_arguments_.AppendSwitchASCII(switches::kUseGL, |
873 gfx::kGLImplementationOSMesaName); | 507 gfx::kGLImplementationOSMesaName); |
874 | 508 |
875 // Mac does not support accelerated compositing with OSMesa. Disable on all | 509 // Mac does not support accelerated compositing with OSMesa. Disable on all |
876 // platforms so it is consistent. http://crbug.com/58343 | 510 // platforms so it is consistent. http://crbug.com/58343 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
957 base::LaunchAppWithHandleInheritance(cmd_line->command_line_string(), | 591 base::LaunchAppWithHandleInheritance(cmd_line->command_line_string(), |
958 true, | 592 true, |
959 false, | 593 false, |
960 NULL); | 594 NULL); |
961 #else | 595 #else |
962 base::LaunchApp(*cmd_line.get(), true, false, NULL); | 596 base::LaunchApp(*cmd_line.get(), true, false, NULL); |
963 #endif | 597 #endif |
964 } | 598 } |
965 | 599 |
966 int UITest::GetBrowserProcessCount() { | 600 int UITest::GetBrowserProcessCount() { |
967 return GetRunningChromeProcesses(process_id_).size(); | 601 return GetRunningChromeProcesses(browser_process_id()).size(); |
968 } | 602 } |
969 | 603 |
970 static DictionaryValue* LoadDictionaryValueFromPath(const FilePath& path) { | 604 static DictionaryValue* LoadDictionaryValueFromPath(const FilePath& path) { |
971 if (path.empty()) | 605 if (path.empty()) |
972 return NULL; | 606 return NULL; |
973 | 607 |
974 JSONFileValueSerializer serializer(path); | 608 JSONFileValueSerializer serializer(path); |
975 scoped_ptr<Value> root_value(serializer.Deserialize(NULL, NULL)); | 609 scoped_ptr<Value> root_value(serializer.Deserialize(NULL, NULL)); |
976 if (!root_value.get() || root_value->GetType() != Value::TYPE_DICTIONARY) | 610 if (!root_value.get() || root_value->GetType() != Value::TYPE_DICTIONARY) |
977 return NULL; | 611 return NULL; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1066 EXPECT_FALSE(file_util::ContentsEqual(generated_file, original_file)); | 700 EXPECT_FALSE(file_util::ContentsEqual(generated_file, original_file)); |
1067 } | 701 } |
1068 } | 702 } |
1069 if (delete_generated_file) | 703 if (delete_generated_file) |
1070 EXPECT_TRUE(file_util::DieFileDie(generated_file, false)); | 704 EXPECT_TRUE(file_util::DieFileDie(generated_file, false)); |
1071 } | 705 } |
1072 | 706 |
1073 bool UITest::WaitUntilJavaScriptCondition(TabProxy* tab, | 707 bool UITest::WaitUntilJavaScriptCondition(TabProxy* tab, |
1074 const std::wstring& frame_xpath, | 708 const std::wstring& frame_xpath, |
1075 const std::wstring& jscript, | 709 const std::wstring& jscript, |
1076 int time_out_ms) { | 710 int timeout_ms) { |
1077 const int kIntervalMs = 250; | 711 const int kIntervalMs = 250; |
1078 const int kMaxIntervals = time_out_ms / kIntervalMs; | 712 const int kMaxIntervals = timeout_ms / kIntervalMs; |
1079 | 713 |
1080 // Wait until the test signals it has completed. | 714 // Wait until the test signals it has completed. |
1081 for (int i = 0; i < kMaxIntervals; ++i) { | 715 for (int i = 0; i < kMaxIntervals; ++i) { |
1082 bool browser_survived = CrashAwareSleep(kIntervalMs); | 716 bool browser_survived = CrashAwareSleep(kIntervalMs); |
1083 EXPECT_TRUE(browser_survived); | 717 EXPECT_TRUE(browser_survived); |
1084 if (!browser_survived) | 718 if (!browser_survived) |
1085 return false; | 719 return false; |
1086 | 720 |
1087 bool done_value = false; | 721 bool done_value = false; |
1088 bool success = tab->ExecuteAndExtractBool(frame_xpath, jscript, | 722 bool success = tab->ExecuteAndExtractBool(frame_xpath, jscript, |
1089 &done_value); | 723 &done_value); |
1090 EXPECT_TRUE(success); | 724 EXPECT_TRUE(success); |
1091 if (!success) | 725 if (!success) |
1092 return false; | 726 return false; |
1093 if (done_value) | 727 if (done_value) |
1094 return true; | 728 return true; |
1095 } | 729 } |
1096 | 730 |
1097 ADD_FAILURE() << "Timeout reached in WaitUntilJavaScriptCondition"; | 731 ADD_FAILURE() << "Timeout reached in WaitUntilJavaScriptCondition"; |
1098 return false; | 732 return false; |
1099 } | 733 } |
1100 | 734 |
1101 bool UITest::WaitUntilCookieValue(TabProxy* tab, | 735 bool UITest::WaitUntilCookieValue(TabProxy* tab, |
1102 const GURL& url, | 736 const GURL& url, |
1103 const char* cookie_name, | 737 const char* cookie_name, |
1104 int time_out_ms, | 738 int timeout_ms, |
1105 const char* expected_value) { | 739 const char* expected_value) { |
1106 const int kIntervalMs = 250; | 740 const int kIntervalMs = 250; |
1107 const int kMaxIntervals = time_out_ms / kIntervalMs; | 741 const int kMaxIntervals = timeout_ms / kIntervalMs; |
1108 | 742 |
1109 std::string cookie_value; | 743 std::string cookie_value; |
1110 for (int i = 0; i < kMaxIntervals; ++i) { | 744 for (int i = 0; i < kMaxIntervals; ++i) { |
1111 bool browser_survived = CrashAwareSleep(kIntervalMs); | 745 bool browser_survived = CrashAwareSleep(kIntervalMs); |
1112 EXPECT_TRUE(browser_survived); | 746 EXPECT_TRUE(browser_survived); |
1113 if (!browser_survived) | 747 if (!browser_survived) |
1114 return false; | 748 return false; |
1115 | 749 |
1116 EXPECT_TRUE(tab->GetCookieByName(url, cookie_name, &cookie_value)); | 750 EXPECT_TRUE(tab->GetCookieByName(url, cookie_name, &cookie_value)); |
1117 if (cookie_value == expected_value) | 751 if (cookie_value == expected_value) |
1118 return true; | 752 return true; |
1119 } | 753 } |
1120 | 754 |
1121 ADD_FAILURE() << "Timeout reached in WaitUntilCookieValue"; | 755 ADD_FAILURE() << "Timeout reached in WaitUntilCookieValue"; |
1122 return false; | 756 return false; |
1123 } | 757 } |
1124 | 758 |
1125 std::string UITest::WaitUntilCookieNonEmpty(TabProxy* tab, | 759 std::string UITest::WaitUntilCookieNonEmpty(TabProxy* tab, |
1126 const GURL& url, | 760 const GURL& url, |
1127 const char* cookie_name, | 761 const char* cookie_name, |
1128 int time_out_ms) { | 762 int timeout_ms) { |
1129 const int kIntervalMs = 250; | 763 const int kIntervalMs = 250; |
1130 const int kMaxIntervals = time_out_ms / kIntervalMs; | 764 const int kMaxIntervals = timeout_ms / kIntervalMs; |
1131 | 765 |
1132 for (int i = 0; i < kMaxIntervals; ++i) { | 766 for (int i = 0; i < kMaxIntervals; ++i) { |
1133 bool browser_survived = CrashAwareSleep(kIntervalMs); | 767 bool browser_survived = CrashAwareSleep(kIntervalMs); |
1134 EXPECT_TRUE(browser_survived); | 768 EXPECT_TRUE(browser_survived); |
1135 if (!browser_survived) | 769 if (!browser_survived) |
1136 return std::string(); | 770 return std::string(); |
1137 | 771 |
1138 std::string cookie_value; | 772 std::string cookie_value; |
1139 EXPECT_TRUE(tab->GetCookieByName(url, cookie_name, &cookie_value)); | 773 EXPECT_TRUE(tab->GetCookieByName(url, cookie_name, &cookie_value)); |
1140 if (!cookie_value.empty()) | 774 if (!cookie_value.empty()) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1208 incorrect_state_count++; | 842 incorrect_state_count++; |
1209 } | 843 } |
1210 | 844 |
1211 LOG(INFO) << "Elapsed time: " << (base::Time::Now() - start).InSecondsF() | 845 LOG(INFO) << "Elapsed time: " << (base::Time::Now() - start).InSecondsF() |
1212 << " seconds" | 846 << " seconds" |
1213 << " call failed " << fail_count << " times" | 847 << " call failed " << fail_count << " times" |
1214 << " state was incorrect " << incorrect_state_count << " times"; | 848 << " state was incorrect " << incorrect_state_count << " times"; |
1215 ADD_FAILURE() << "Timeout reached in " << __FUNCTION__; | 849 ADD_FAILURE() << "Timeout reached in " << __FUNCTION__; |
1216 return false; | 850 return false; |
1217 } | 851 } |
OLD | NEW |