| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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" |
| 6 |
| 5 #include <set> | 7 #include <set> |
| 6 #include <vector> | 8 #include <vector> |
| 7 | 9 |
| 8 #include "chrome/test/ui/ui_test.h" | |
| 9 | |
| 10 #include "base/base_switches.h" | 10 #include "base/base_switches.h" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/file_util.h" | 12 #include "base/file_util.h" |
| 13 #include "base/platform_thread.h" | 13 #include "base/platform_thread.h" |
| 14 #include "base/process_util.h" | 14 #include "base/process_util.h" |
| 15 #include "base/scoped_ptr.h" | 15 #include "base/scoped_ptr.h" |
| 16 #include "base/string_util.h" | 16 #include "base/string_util.h" |
| 17 #include "base/test_file_util.h" | 17 #include "base/test_file_util.h" |
| 18 #include "base/time.h" | 18 #include "base/time.h" |
| 19 #include "chrome/app/chrome_dll_resource.h" | 19 #include "chrome/app/chrome_dll_resource.h" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 for (int i = 0; i < 10; ++i) { | 85 for (int i = 0; i < 10; ++i) { |
| 86 if (file_util::Delete(file, recurse)) | 86 if (file_util::Delete(file, recurse)) |
| 87 return true; | 87 return true; |
| 88 PlatformThread::Sleep(action_max_timeout_ms() / 10); | 88 PlatformThread::Sleep(action_max_timeout_ms() / 10); |
| 89 } | 89 } |
| 90 return false; | 90 return false; |
| 91 } | 91 } |
| 92 | 92 |
| 93 UITest::UITest() | 93 UITest::UITest() |
| 94 : testing::Test(), | 94 : testing::Test(), |
| 95 launch_arguments_(L""), |
| 95 expected_errors_(0), | 96 expected_errors_(0), |
| 96 expected_crashes_(0), | 97 expected_crashes_(0), |
| 97 homepage_(L"about:blank"), | 98 homepage_(L"about:blank"), |
| 98 wait_for_initial_loads_(true), | 99 wait_for_initial_loads_(true), |
| 99 dom_automation_enabled_(false), | 100 dom_automation_enabled_(false), |
| 100 process_(0), // NULL on Windows, 0 PID on POSIX. | 101 process_(0), // NULL on Windows, 0 PID on POSIX. |
| 101 show_window_(false), | 102 show_window_(false), |
| 102 clear_profile_(true), | 103 clear_profile_(true), |
| 103 include_testing_id_(true), | 104 include_testing_id_(true), |
| 104 use_existing_browser_(default_use_existing_browser_), | 105 use_existing_browser_(default_use_existing_browser_), |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 } | 171 } |
| 171 EXPECT_EQ(expected_crashes_, actual_crashes) << error_msg; | 172 EXPECT_EQ(expected_crashes_, actual_crashes) << error_msg; |
| 172 #else | 173 #else |
| 173 // TODO(port): we don't catch crashes, nor have CountFilesCreatedAfter. | 174 // TODO(port): we don't catch crashes, nor have CountFilesCreatedAfter. |
| 174 NOTIMPLEMENTED(); | 175 NOTIMPLEMENTED(); |
| 175 #endif | 176 #endif |
| 176 } | 177 } |
| 177 | 178 |
| 178 // Pick up the various test time out values from the command line. | 179 // Pick up the various test time out values from the command line. |
| 179 void UITest::InitializeTimeouts() { | 180 void UITest::InitializeTimeouts() { |
| 180 if (CommandLine().HasSwitch(kUiTestTimeout)) { | 181 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
| 181 std::wstring timeout_str = CommandLine().GetSwitchValue(kUiTestTimeout); | 182 if (command_line.HasSwitch(kUiTestTimeout)) { |
| 183 std::wstring timeout_str = command_line.GetSwitchValue(kUiTestTimeout); |
| 182 int timeout = StringToInt(timeout_str); | 184 int timeout = StringToInt(timeout_str); |
| 183 command_execution_timeout_ms_ = std::max(kMaxTestExecutionTime, timeout); | 185 command_execution_timeout_ms_ = std::max(kMaxTestExecutionTime, timeout); |
| 184 } | 186 } |
| 185 | 187 |
| 186 if (CommandLine().HasSwitch(kUiTestActionTimeout)) { | 188 if (command_line.HasSwitch(kUiTestActionTimeout)) { |
| 187 std::wstring act_str = CommandLine().GetSwitchValue(kUiTestActionTimeout); | 189 std::wstring act_str = command_line.GetSwitchValue(kUiTestActionTimeout); |
| 188 int act_timeout = StringToInt(act_str); | 190 int act_timeout = StringToInt(act_str); |
| 189 action_timeout_ms_ = std::max(kWaitForActionMsec, act_timeout); | 191 action_timeout_ms_ = std::max(kWaitForActionMsec, act_timeout); |
| 190 } | 192 } |
| 191 | 193 |
| 192 if (CommandLine().HasSwitch(kUiTestActionMaxTimeout)) { | 194 if (command_line.HasSwitch(kUiTestActionMaxTimeout)) { |
| 193 std::wstring action_max_str = | 195 std::wstring action_max_str = |
| 194 CommandLine().GetSwitchValue(kUiTestActionMaxTimeout); | 196 command_line.GetSwitchValue(kUiTestActionMaxTimeout); |
| 195 int max_timeout = StringToInt(action_max_str); | 197 int max_timeout = StringToInt(action_max_str); |
| 196 action_max_timeout_ms_ = std::max(kWaitForActionMaxMsec, max_timeout); | 198 action_max_timeout_ms_ = std::max(kWaitForActionMaxMsec, max_timeout); |
| 197 } | 199 } |
| 198 | 200 |
| 199 if (CommandLine().HasSwitch(kUiTestSleepTimeout)) { | 201 if (CommandLine::ForCurrentProcess()->HasSwitch(kUiTestSleepTimeout)) { |
| 200 std::wstring sleep_timeout_str = | 202 std::wstring sleep_timeout_str = |
| 201 CommandLine().GetSwitchValue(kUiTestSleepTimeout); | 203 CommandLine::ForCurrentProcess()->GetSwitchValue(kUiTestSleepTimeout); |
| 202 int sleep_timeout = StringToInt(sleep_timeout_str); | 204 int sleep_timeout = StringToInt(sleep_timeout_str); |
| 203 sleep_timeout_ms_ = std::max(kWaitForActionMsec, sleep_timeout); | 205 sleep_timeout_ms_ = std::max(kWaitForActionMsec, sleep_timeout); |
| 204 } | 206 } |
| 205 } | 207 } |
| 206 | 208 |
| 207 void UITest::LaunchBrowserAndServer() { | 209 void UITest::LaunchBrowserAndServer() { |
| 208 #if defined(OS_WIN) | 210 #if defined(OS_WIN) |
| 209 // Set up IPC testing interface server. | 211 // Set up IPC testing interface server. |
| 210 server_.reset(new AutomationProxy(command_execution_timeout_ms_)); | 212 server_.reset(new AutomationProxy(command_execution_timeout_ms_)); |
| 211 | 213 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 228 | 230 |
| 229 #if defined(OS_WIN) | 231 #if defined(OS_WIN) |
| 230 // Shut down IPC testing interface. | 232 // Shut down IPC testing interface. |
| 231 server_.reset(); | 233 server_.reset(); |
| 232 #else | 234 #else |
| 233 // TODO(port): depends on AutomationProxy. | 235 // TODO(port): depends on AutomationProxy. |
| 234 NOTIMPLEMENTED(); | 236 NOTIMPLEMENTED(); |
| 235 #endif | 237 #endif |
| 236 } | 238 } |
| 237 | 239 |
| 238 void UITest::LaunchBrowser(const std::wstring& arguments, bool clear_profile) { | 240 void UITest::LaunchBrowser(const CommandLine& arguments, bool clear_profile) { |
| 239 std::wstring command_line(browser_directory_); | 241 std::wstring command = browser_directory_; |
| 240 file_util::AppendToPath(&command_line, | 242 file_util::AppendToPath(&command, |
| 241 chrome::kBrowserProcessExecutableName); | 243 chrome::kBrowserProcessExecutableName); |
| 244 CommandLine command_line(command); |
| 242 | 245 |
| 243 // Add any explict command line flags passed to the process. | 246 // Add any explict command line flags passed to the process. |
| 244 std::wstring extra_chrome_flags = | 247 std::wstring extra_chrome_flags = |
| 245 CommandLine().GetSwitchValue(kExtraChromeFlagsSwitch); | 248 CommandLine::ForCurrentProcess()->GetSwitchValue(kExtraChromeFlagsSwitch); |
| 246 if (!extra_chrome_flags.empty()) | 249 if (!extra_chrome_flags.empty()) { |
| 247 command_line.append(L" " + extra_chrome_flags); | 250 #if defined(OS_WIN) |
| 251 command_line.AppendLooseValue(extra_chrome_flags); |
| 252 #else |
| 253 // TODO(port): figure out how to pass through extra flags via a string. |
| 254 NOTIMPLEMENTED(); |
| 255 #endif |
| 256 } |
| 248 | 257 |
| 249 // We need cookies on file:// for things like the page cycler. | 258 // We need cookies on file:// for things like the page cycler. |
| 250 CommandLine::AppendSwitch(&command_line, switches::kEnableFileCookies); | 259 command_line.AppendSwitch(switches::kEnableFileCookies); |
| 251 | 260 |
| 252 if (dom_automation_enabled_) | 261 if (dom_automation_enabled_) |
| 253 CommandLine::AppendSwitch(&command_line, | 262 command_line.AppendSwitch(switches::kDomAutomationController); |
| 254 switches::kDomAutomationController); | |
| 255 | 263 |
| 256 #if defined(OS_WIN) | 264 #if defined(OS_WIN) |
| 257 if (include_testing_id_) { | 265 if (include_testing_id_) { |
| 258 if (use_existing_browser_) { | 266 if (use_existing_browser_) { |
| 259 // TODO(erikkay): The new switch depends on a browser instance already | 267 // TODO(erikkay): The new switch depends on a browser instance already |
| 260 // running, it won't open a new browser window if it's not. We could fix | 268 // running, it won't open a new browser window if it's not. We could fix |
| 261 // this by passing an url (e.g. about:blank) on the command line, but | 269 // this by passing an url (e.g. about:blank) on the command line, but |
| 262 // I decided to keep using the old switch in the existing use case to | 270 // I decided to keep using the old switch in the existing use case to |
| 263 // minimize changes in behavior. | 271 // minimize changes in behavior. |
| 264 CommandLine::AppendSwitchWithValue(&command_line, | 272 command_line.AppendSwitchWithValue(switches::kAutomationClientChannelID, |
| 265 switches::kAutomationClientChannelID, | |
| 266 server_->channel_id()); | 273 server_->channel_id()); |
| 267 } else { | 274 } else { |
| 268 CommandLine::AppendSwitchWithValue(&command_line, | 275 command_line.AppendSwitchWithValue(switches::kTestingChannelID, |
| 269 switches::kTestingChannelID, | |
| 270 server_->channel_id()); | 276 server_->channel_id()); |
| 271 } | 277 } |
| 272 } | 278 } |
| 273 #else | 279 #else |
| 274 // TODO(port): depends on AutomationProxy. | 280 // TODO(port): depends on AutomationProxy. |
| 275 NOTIMPLEMENTED(); | 281 NOTIMPLEMENTED(); |
| 276 #endif | 282 #endif |
| 277 | 283 |
| 278 if (!show_error_dialogs_) | 284 if (!show_error_dialogs_) |
| 279 CommandLine::AppendSwitch(&command_line, switches::kNoErrorDialogs); | 285 command_line.AppendSwitch(switches::kNoErrorDialogs); |
| 280 if (in_process_renderer_) | 286 if (in_process_renderer_) |
| 281 CommandLine::AppendSwitch(&command_line, switches::kSingleProcess); | 287 command_line.AppendSwitch(switches::kSingleProcess); |
| 282 if (in_process_plugins_) | 288 if (in_process_plugins_) |
| 283 CommandLine::AppendSwitch(&command_line, switches::kInProcessPlugins); | 289 command_line.AppendSwitch(switches::kInProcessPlugins); |
| 284 if (no_sandbox_) | 290 if (no_sandbox_) |
| 285 CommandLine::AppendSwitch(&command_line, switches::kNoSandbox); | 291 command_line.AppendSwitch(switches::kNoSandbox); |
| 286 if (full_memory_dump_) | 292 if (full_memory_dump_) |
| 287 CommandLine::AppendSwitch(&command_line, switches::kFullMemoryCrashReport); | 293 command_line.AppendSwitch(switches::kFullMemoryCrashReport); |
| 288 if (safe_plugins_) | 294 if (safe_plugins_) |
| 289 CommandLine::AppendSwitch(&command_line, switches::kSafePlugins); | 295 command_line.AppendSwitch(switches::kSafePlugins); |
| 290 if (enable_dcheck_) | 296 if (enable_dcheck_) |
| 291 CommandLine::AppendSwitch(&command_line, switches::kEnableDCHECK); | 297 command_line.AppendSwitch(switches::kEnableDCHECK); |
| 292 if (silent_dump_on_dcheck_) | 298 if (silent_dump_on_dcheck_) |
| 293 CommandLine::AppendSwitch(&command_line, switches::kSilentDumpOnDCHECK); | 299 command_line.AppendSwitch(switches::kSilentDumpOnDCHECK); |
| 294 if (disable_breakpad_) | 300 if (disable_breakpad_) |
| 295 CommandLine::AppendSwitch(&command_line, switches::kDisableBreakpad); | 301 command_line.AppendSwitch(switches::kDisableBreakpad); |
| 296 if (!homepage_.empty()) | 302 if (!homepage_.empty()) |
| 297 CommandLine::AppendSwitchWithValue(&command_line, | 303 command_line.AppendSwitchWithValue(switches::kHomePage, |
| 298 switches::kHomePage, | |
| 299 homepage_); | 304 homepage_); |
| 300 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_); | 305 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_); |
| 301 if (!user_data_dir_.empty()) | 306 if (!user_data_dir_.empty()) |
| 302 CommandLine::AppendSwitchWithValue(&command_line, | 307 command_line.AppendSwitchWithValue(switches::kUserDataDir, |
| 303 switches::kUserDataDir, | |
| 304 user_data_dir_); | 308 user_data_dir_); |
| 305 if (!js_flags_.empty()) | 309 if (!js_flags_.empty()) |
| 306 CommandLine::AppendSwitchWithValue(&command_line, | 310 command_line.AppendSwitchWithValue(switches::kJavaScriptFlags, |
| 307 switches::kJavaScriptFlags, | |
| 308 js_flags_); | 311 js_flags_); |
| 309 | 312 |
| 310 CommandLine::AppendSwitch(&command_line, switches::kMetricsRecordingOnly); | 313 command_line.AppendSwitch(switches::kMetricsRecordingOnly); |
| 311 | 314 |
| 312 // We always want to enable chrome logging | 315 // We always want to enable chrome logging |
| 313 CommandLine::AppendSwitch(&command_line, switches::kEnableLogging); | 316 command_line.AppendSwitch(switches::kEnableLogging); |
| 314 | 317 |
| 315 if (dump_histograms_on_exit_) | 318 if (dump_histograms_on_exit_) |
| 316 CommandLine::AppendSwitch(&command_line, switches::kDumpHistogramsOnExit); | 319 command_line.AppendSwitch(switches::kDumpHistogramsOnExit); |
| 317 | 320 |
| 318 #ifdef WAIT_FOR_DEBUGGER_ON_OPEN | 321 #ifdef WAIT_FOR_DEBUGGER_ON_OPEN |
| 319 CommandLine::AppendSwitch(&command_line, switches::kDebugOnStart); | 322 command_line.AppendSwitch(switches::kDebugOnStart); |
| 320 #endif | 323 #endif |
| 321 | 324 |
| 322 if (!ui_test_name_.empty()) | 325 if (!ui_test_name_.empty()) |
| 323 CommandLine::AppendSwitchWithValue(&command_line, | 326 command_line.AppendSwitchWithValue(switches::kTestName, |
| 324 switches::kTestName, | |
| 325 ui_test_name_); | 327 ui_test_name_); |
| 326 | 328 |
| 327 DebugFlags::ProcessDebugFlags(&command_line, DebugFlags::UNKNOWN, false); | 329 DebugFlags::ProcessDebugFlags(&command_line, DebugFlags::UNKNOWN, false); |
| 328 command_line.append(L" " + arguments); | 330 command_line.AppendArguments(arguments, false); |
| 329 | 331 |
| 330 // Clear user data directory to make sure test environment is consistent | 332 // Clear user data directory to make sure test environment is consistent |
| 331 // We balk on really short (absolute) user_data_dir directory names, because | 333 // We balk on really short (absolute) user_data_dir directory names, because |
| 332 // we're worried that they'd accidentally be root or something. | 334 // we're worried that they'd accidentally be root or something. |
| 333 ASSERT_LT(10, static_cast<int>(user_data_dir_.size())) << | 335 ASSERT_LT(10, static_cast<int>(user_data_dir_.size())) << |
| 334 "The user data directory name passed into this test was too " | 336 "The user data directory name passed into this test was too " |
| 335 "short to delete safely. Please check the user-data-dir " | 337 "short to delete safely. Please check the user-data-dir " |
| 336 "argument and try again."; | 338 "argument and try again."; |
| 337 if (clear_profile) | 339 if (clear_profile) |
| 338 ASSERT_TRUE(DieFileDie(user_data_dir_, true)); | 340 ASSERT_TRUE(DieFileDie(user_data_dir_, true)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 349 bool started = base::LaunchApp(command_line, | 351 bool started = base::LaunchApp(command_line, |
| 350 false, // Don't wait for process object | 352 false, // Don't wait for process object |
| 351 // (doesn't work for us) | 353 // (doesn't work for us) |
| 352 !show_window_, | 354 !show_window_, |
| 353 &process_); | 355 &process_); |
| 354 ASSERT_EQ(started, true); | 356 ASSERT_EQ(started, true); |
| 355 | 357 |
| 356 if (use_existing_browser_) { | 358 if (use_existing_browser_) { |
| 357 DWORD pid = 0; | 359 DWORD pid = 0; |
| 358 HWND hwnd = FindWindowEx(HWND_MESSAGE, NULL, chrome::kMessageWindowClass, | 360 HWND hwnd = FindWindowEx(HWND_MESSAGE, NULL, chrome::kMessageWindowClass, |
| 359 user_data_dir_.c_str()); | 361 user_data_dir_.c_str()); |
| 360 GetWindowThreadProcessId(hwnd, &pid); | 362 GetWindowThreadProcessId(hwnd, &pid); |
| 361 // This mode doesn't work if we wound up launching a new browser ourselves. | 363 // This mode doesn't work if we wound up launching a new browser ourselves. |
| 362 ASSERT_NE(pid, base::GetProcId(process_)); | 364 ASSERT_NE(pid, base::GetProcId(process_)); |
| 363 CloseHandle(process_); | 365 CloseHandle(process_); |
| 364 process_ = OpenProcess(SYNCHRONIZE, false, pid); | 366 process_ = OpenProcess(SYNCHRONIZE, false, pid); |
| 365 } | 367 } |
| 366 #else | 368 #else |
| 367 // TODO(port): above code is very Windows-specific; we need to | 369 // TODO(port): above code is very Windows-specific; we need to |
| 368 // figure out and abstract out how we'll handle finding any existing | 370 // figure out and abstract out how we'll handle finding any existing |
| 369 // running process, etc. on other platforms. | 371 // running process, etc. on other platforms. |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 // <*>RESULT <graph_name>: <trace_name>= <value> <units> | 802 // <*>RESULT <graph_name>: <trace_name>= <value> <units> |
| 801 // <*>RESULT <graph_name>: <trace_name>= {<mean>, <std deviation>} <units> | 803 // <*>RESULT <graph_name>: <trace_name>= {<mean>, <std deviation>} <units> |
| 802 // <*>RESULT <graph_name>: <trace_name>= [<value>,value,value,...,] <units> | 804 // <*>RESULT <graph_name>: <trace_name>= [<value>,value,value,...,] <units> |
| 803 wprintf(L"%lsRESULT %ls%ls: %ls= %ls%ls%ls %ls\n", | 805 wprintf(L"%lsRESULT %ls%ls: %ls= %ls%ls%ls %ls\n", |
| 804 important ? L"*" : L"", measurement.c_str(), modifier.c_str(), | 806 important ? L"*" : L"", measurement.c_str(), modifier.c_str(), |
| 805 trace.c_str(), prefix.c_str(), values.c_str(), suffix.c_str(), | 807 trace.c_str(), prefix.c_str(), values.c_str(), suffix.c_str(), |
| 806 units.c_str()); | 808 units.c_str()); |
| 807 } | 809 } |
| 808 | 810 |
| 809 #endif // OS_WIN | 811 #endif // OS_WIN |
| OLD | NEW |