Chromium Code Reviews| 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 "content/public/test/test_launcher.h" | 5 #include "content/public/test/test_launcher.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 123 // base::TestLauncherDelegate: | 123 // base::TestLauncherDelegate: |
| 124 bool GetTests(std::vector<base::TestIdentifier>* output) override; | 124 bool GetTests(std::vector<base::TestIdentifier>* output) override; |
| 125 bool ShouldRunTest(const std::string& test_case_name, | 125 bool ShouldRunTest(const std::string& test_case_name, |
| 126 const std::string& test_name) override; | 126 const std::string& test_name) override; |
| 127 size_t RunTests(base::TestLauncher* test_launcher, | 127 size_t RunTests(base::TestLauncher* test_launcher, |
| 128 const std::vector<std::string>& test_names) override; | 128 const std::vector<std::string>& test_names) override; |
| 129 size_t RetryTests(base::TestLauncher* test_launcher, | 129 size_t RetryTests(base::TestLauncher* test_launcher, |
| 130 const std::vector<std::string>& test_names) override; | 130 const std::vector<std::string>& test_names) override; |
| 131 | 131 |
| 132 private: | 132 private: |
| 133 void DoRunTest(base::TestLauncher* test_launcher, | 133 void DoRunTests(base::TestLauncher* test_launcher, |
| 134 const std::string& test_name); | 134 const std::vector<std::string>& test_names); |
| 135 | 135 |
| 136 // Launches test named |test_name| using parallel launcher, | 136 // Launches test named |test_name| using parallel launcher, |
| 137 // given result of PRE_ test |pre_test_result|. | 137 // given result of PRE_ test |pre_test_result|. |
| 138 void RunDependentTest(base::TestLauncher* test_launcher, | 138 void RunDependentTest(base::TestLauncher* test_launcher, |
| 139 const std::string test_name, | 139 const std::string test_name, |
| 140 const base::TestResult& pre_test_result); | 140 const base::TestResult& pre_test_result); |
| 141 | 141 |
| 142 // Callback to receive result of a test. | 142 // Callback to receive result of a test. |
| 143 void GTestCallback( | 143 void GTestCallback( |
| 144 base::TestLauncher* test_launcher, | 144 base::TestLauncher* test_launcher, |
| 145 const std::vector<std::string>& test_names, | |
| 145 const std::string& test_name, | 146 const std::string& test_name, |
| 146 int exit_code, | 147 int exit_code, |
| 147 const base::TimeDelta& elapsed_time, | 148 const base::TimeDelta& elapsed_time, |
| 148 bool was_timeout, | 149 bool was_timeout, |
| 149 const std::string& output); | 150 const std::string& output); |
| 150 | 151 |
| 151 content::TestLauncherDelegate* launcher_delegate_; | 152 content::TestLauncherDelegate* launcher_delegate_; |
| 152 | 153 |
| 153 // Store dependent test name (map is indexed by full test name). | 154 // Store dependent test name (map is indexed by full test name). |
| 154 typedef std::map<std::string, std::string> DependentTestMap; | 155 typedef std::map<std::string, std::string> DependentTestMap; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 247 base::FilePath temp_dir; | 248 base::FilePath temp_dir; |
| 248 CHECK(base::CreateTemporaryDirInDir(temp_dir_.path(), | 249 CHECK(base::CreateTemporaryDirInDir(temp_dir_.path(), |
| 249 FILE_PATH_LITERAL("d"), &temp_dir)); | 250 FILE_PATH_LITERAL("d"), &temp_dir)); |
| 250 user_data_dir_map_[full_name] = temp_dir; | 251 user_data_dir_map_[full_name] = temp_dir; |
| 251 } | 252 } |
| 252 | 253 |
| 253 // If the test has any dependencies, get to the root and start with that. | 254 // If the test has any dependencies, get to the root and start with that. |
| 254 while (ContainsKey(reverse_dependent_test_map_, full_name)) | 255 while (ContainsKey(reverse_dependent_test_map_, full_name)) |
| 255 full_name = GetPreTestName(full_name); | 256 full_name = GetPreTestName(full_name); |
| 256 | 257 |
| 257 DoRunTest(test_launcher, full_name); | 258 std::vector<std::string> test_list; |
| 259 test_list.push_back(full_name); | |
| 260 DoRunTests(test_launcher, test_list); | |
| 258 } | 261 } |
| 259 | 262 |
| 260 return test_names.size() + additional_tests_to_run_count; | 263 return test_names.size() + additional_tests_to_run_count; |
| 261 } | 264 } |
| 262 | 265 |
| 263 size_t WrapperTestLauncherDelegate::RetryTests( | 266 size_t WrapperTestLauncherDelegate::RetryTests( |
| 264 base::TestLauncher* test_launcher, | 267 base::TestLauncher* test_launcher, |
| 265 const std::vector<std::string>& test_names) { | 268 const std::vector<std::string>& test_names) { |
| 266 // List of tests we can kick off right now, depending on no other tests. | 269 // List of tests we can kick off right now, depending on no other tests. |
| 267 std::vector<std::string> tests_to_run_now; | 270 std::vector<std::string> tests_to_run_now; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 309 size_t dot_pos = full_name.find('.'); | 312 size_t dot_pos = full_name.find('.'); |
| 310 CHECK_NE(dot_pos, std::string::npos); | 313 CHECK_NE(dot_pos, std::string::npos); |
| 311 std::string test_case_name = full_name.substr(0, dot_pos); | 314 std::string test_case_name = full_name.substr(0, dot_pos); |
| 312 std::string test_name = full_name.substr(dot_pos + 1); | 315 std::string test_name = full_name.substr(dot_pos + 1); |
| 313 std::string pre_test_name( | 316 std::string pre_test_name( |
| 314 test_case_name + "." + kPreTestPrefix + test_name); | 317 test_case_name + "." + kPreTestPrefix + test_name); |
| 315 if (!ContainsKey(test_names_set, pre_test_name)) | 318 if (!ContainsKey(test_names_set, pre_test_name)) |
| 316 tests_to_run_now.push_back(full_name); | 319 tests_to_run_now.push_back(full_name); |
| 317 } | 320 } |
| 318 | 321 |
| 319 for (size_t i = 0; i < tests_to_run_now.size(); i++) | 322 DoRunTests(test_launcher, tests_to_run_now); |
| 320 DoRunTest(test_launcher, tests_to_run_now[i]); | |
| 321 | 323 |
| 322 return test_names_set.size(); | 324 return test_names_set.size(); |
| 323 } | 325 } |
| 324 | 326 |
| 325 void WrapperTestLauncherDelegate::DoRunTest(base::TestLauncher* test_launcher, | 327 void WrapperTestLauncherDelegate::DoRunTests( |
| 326 const std::string& test_name) { | 328 base::TestLauncher* test_launcher, |
| 329 const std::vector<std::string>& test_names) { | |
| 330 if (test_names.empty()) | |
| 331 return; | |
| 332 | |
| 333 std::string test_name(test_names.back()); | |
|
sky
2015/10/29 17:20:34
Shouldn't you run test_names.front() first?
Paweł Hajdan Jr.
2015/10/30 14:38:45
Done.
| |
| 334 std::vector<std::string> test_names_copy(test_names); | |
|
sky
2015/10/29 17:20:34
nit: std::vector<std::string> test_names_copy(test
Paweł Hajdan Jr.
2015/10/30 14:38:45
Done.
| |
| 335 test_names_copy.pop_back(); | |
| 336 | |
| 327 std::string test_name_no_pre(RemoveAnyPrePrefixes(test_name)); | 337 std::string test_name_no_pre(RemoveAnyPrePrefixes(test_name)); |
| 328 | 338 |
| 329 base::CommandLine cmd_line(*base::CommandLine::ForCurrentProcess()); | 339 base::CommandLine cmd_line(*base::CommandLine::ForCurrentProcess()); |
| 330 CHECK(launcher_delegate_->AdjustChildProcessCommandLine( | 340 CHECK(launcher_delegate_->AdjustChildProcessCommandLine( |
| 331 &cmd_line, user_data_dir_map_[test_name_no_pre])); | 341 &cmd_line, user_data_dir_map_[test_name_no_pre])); |
| 332 | 342 |
| 333 base::CommandLine new_cmd_line(cmd_line.GetProgram()); | 343 base::CommandLine new_cmd_line(cmd_line.GetProgram()); |
| 334 base::CommandLine::SwitchMap switches = cmd_line.GetSwitches(); | 344 base::CommandLine::SwitchMap switches = cmd_line.GetSwitches(); |
| 335 | 345 |
| 336 // Strip out gtest_output flag because otherwise we would overwrite results | 346 // Strip out gtest_output flag because otherwise we would overwrite results |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 352 | 362 |
| 353 test_launcher->LaunchChildGTestProcess( | 363 test_launcher->LaunchChildGTestProcess( |
| 354 new_cmd_line, | 364 new_cmd_line, |
| 355 browser_wrapper ? browser_wrapper : std::string(), | 365 browser_wrapper ? browser_wrapper : std::string(), |
| 356 TestTimeouts::action_max_timeout(), | 366 TestTimeouts::action_max_timeout(), |
| 357 base::TestLauncher::USE_JOB_OBJECTS | | 367 base::TestLauncher::USE_JOB_OBJECTS | |
| 358 base::TestLauncher::ALLOW_BREAKAWAY_FROM_JOB, | 368 base::TestLauncher::ALLOW_BREAKAWAY_FROM_JOB, |
| 359 base::Bind(&WrapperTestLauncherDelegate::GTestCallback, | 369 base::Bind(&WrapperTestLauncherDelegate::GTestCallback, |
| 360 base::Unretained(this), | 370 base::Unretained(this), |
| 361 test_launcher, | 371 test_launcher, |
| 372 test_names_copy, | |
| 362 test_name)); | 373 test_name)); |
| 363 } | 374 } |
| 364 | 375 |
| 365 void WrapperTestLauncherDelegate::RunDependentTest( | 376 void WrapperTestLauncherDelegate::RunDependentTest( |
| 366 base::TestLauncher* test_launcher, | 377 base::TestLauncher* test_launcher, |
| 367 const std::string test_name, | 378 const std::string test_name, |
| 368 const base::TestResult& pre_test_result) { | 379 const base::TestResult& pre_test_result) { |
| 369 if (pre_test_result.status == base::TestResult::TEST_SUCCESS) { | 380 if (pre_test_result.status == base::TestResult::TEST_SUCCESS) { |
| 370 // Only run the dependent test if PRE_ test succeeded. | 381 // Only run the dependent test if PRE_ test succeeded. |
| 371 DoRunTest(test_launcher, test_name); | 382 std::vector<std::string> test_list; |
| 383 test_list.push_back(test_name); | |
| 384 DoRunTests(test_launcher, test_list); | |
| 372 } else { | 385 } else { |
| 373 // Otherwise skip the test. | 386 // Otherwise skip the test. |
| 374 base::TestResult test_result; | 387 base::TestResult test_result; |
| 375 test_result.full_name = test_name; | 388 test_result.full_name = test_name; |
| 376 test_result.status = base::TestResult::TEST_SKIPPED; | 389 test_result.status = base::TestResult::TEST_SKIPPED; |
| 377 test_launcher->OnTestFinished(test_result); | 390 test_launcher->OnTestFinished(test_result); |
| 378 | 391 |
| 379 if (ContainsKey(dependent_test_map_, test_name)) { | 392 if (ContainsKey(dependent_test_map_, test_name)) { |
| 380 RunDependentTest(test_launcher, | 393 RunDependentTest(test_launcher, |
| 381 dependent_test_map_[test_name], | 394 dependent_test_map_[test_name], |
| 382 test_result); | 395 test_result); |
| 383 } | 396 } |
| 384 } | 397 } |
| 385 } | 398 } |
| 386 | 399 |
| 387 void WrapperTestLauncherDelegate::GTestCallback( | 400 void WrapperTestLauncherDelegate::GTestCallback( |
| 388 base::TestLauncher* test_launcher, | 401 base::TestLauncher* test_launcher, |
| 402 const std::vector<std::string>& test_names, | |
| 389 const std::string& test_name, | 403 const std::string& test_name, |
| 390 int exit_code, | 404 int exit_code, |
| 391 const base::TimeDelta& elapsed_time, | 405 const base::TimeDelta& elapsed_time, |
| 392 bool was_timeout, | 406 bool was_timeout, |
| 393 const std::string& output) { | 407 const std::string& output) { |
| 394 base::TestResult result; | 408 base::TestResult result; |
| 395 result.full_name = test_name; | 409 result.full_name = test_name; |
| 396 | 410 |
| 397 // TODO(phajdan.jr): Recognize crashes. | 411 // TODO(phajdan.jr): Recognize crashes. |
| 398 if (exit_code == 0) | 412 if (exit_code == 0) |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 415 if (ContainsKey(user_data_dir_map_, test_name_no_pre)) { | 429 if (ContainsKey(user_data_dir_map_, test_name_no_pre)) { |
| 416 if (!base::DeleteFile(user_data_dir_map_[test_name_no_pre], true)) { | 430 if (!base::DeleteFile(user_data_dir_map_[test_name_no_pre], true)) { |
| 417 LOG(WARNING) << "Failed to delete " | 431 LOG(WARNING) << "Failed to delete " |
| 418 << user_data_dir_map_[test_name_no_pre].value(); | 432 << user_data_dir_map_[test_name_no_pre].value(); |
| 419 } | 433 } |
| 420 user_data_dir_map_.erase(test_name_no_pre); | 434 user_data_dir_map_.erase(test_name_no_pre); |
| 421 } | 435 } |
| 422 } | 436 } |
| 423 | 437 |
| 424 test_launcher->OnTestFinished(result); | 438 test_launcher->OnTestFinished(result); |
| 439 | |
| 440 DoRunTests(test_launcher, test_names); | |
| 425 } | 441 } |
| 426 | 442 |
| 427 } // namespace | 443 } // namespace |
| 428 | 444 |
| 429 const char kHelpFlag[] = "help"; | 445 const char kHelpFlag[] = "help"; |
| 430 | 446 |
| 431 const char kLaunchAsBrowser[] = "as-browser"; | 447 const char kLaunchAsBrowser[] = "as-browser"; |
| 432 | 448 |
| 433 // See kManualTestPrefix above. | 449 // See kManualTestPrefix above. |
| 434 const char kRunManualTestsFlag[] = "run-manual"; | 450 const char kRunManualTestsFlag[] = "run-manual"; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 510 | 526 |
| 511 TestLauncherDelegate* GetCurrentTestLauncherDelegate() { | 527 TestLauncherDelegate* GetCurrentTestLauncherDelegate() { |
| 512 return g_launcher_delegate; | 528 return g_launcher_delegate; |
| 513 } | 529 } |
| 514 | 530 |
| 515 ContentMainParams* GetContentMainParams() { | 531 ContentMainParams* GetContentMainParams() { |
| 516 return g_params; | 532 return g_params; |
| 517 } | 533 } |
| 518 | 534 |
| 519 } // namespace content | 535 } // namespace content |
| OLD | NEW |