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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
11 #include <string> | 11 #include <string> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
| 14 #include "base/bind_helpers.h" |
14 #include "base/command_line.h" | 15 #include "base/command_line.h" |
15 #include "base/containers/hash_tables.h" | 16 #include "base/containers/hash_tables.h" |
16 #include "base/environment.h" | 17 #include "base/environment.h" |
17 #include "base/files/file_util.h" | 18 #include "base/files/file_util.h" |
18 #include "base/files/scoped_temp_dir.h" | 19 #include "base/files/scoped_temp_dir.h" |
19 #include "base/logging.h" | 20 #include "base/logging.h" |
20 #include "base/macros.h" | 21 #include "base/macros.h" |
21 #include "base/memory/linked_ptr.h" | 22 #include "base/memory/linked_ptr.h" |
22 #include "base/memory/scoped_ptr.h" | 23 #include "base/memory/scoped_ptr.h" |
23 #include "base/message_loop/message_loop.h" | 24 #include "base/message_loop/message_loop.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 " Controls when full test output is printed.\n" | 108 " Controls when full test output is printed.\n" |
108 " auto means to print it when the test failed.\n" | 109 " auto means to print it when the test failed.\n" |
109 "\n" | 110 "\n" |
110 " --test-launcher-total-shards=N\n" | 111 " --test-launcher-total-shards=N\n" |
111 " Sets the total number of shards to N.\n" | 112 " Sets the total number of shards to N.\n" |
112 "\n" | 113 "\n" |
113 " --test-launcher-shard-index=N\n" | 114 " --test-launcher-shard-index=N\n" |
114 " Sets the shard index to run to N (from 0 to TOTAL - 1).\n"); | 115 " Sets the shard index to run to N (from 0 to TOTAL - 1).\n"); |
115 } | 116 } |
116 | 117 |
| 118 void CallChildProcessLaunched(TestState* test_state, |
| 119 base::ProcessHandle handle, |
| 120 base::ProcessId pid) { |
| 121 if (test_state) |
| 122 test_state->ChildProcessLaunched(handle, pid); |
| 123 } |
| 124 |
117 // Implementation of base::TestLauncherDelegate. This is also a test launcher, | 125 // Implementation of base::TestLauncherDelegate. This is also a test launcher, |
118 // wrapping a lower-level test launcher with content-specific code. | 126 // wrapping a lower-level test launcher with content-specific code. |
119 class WrapperTestLauncherDelegate : public base::TestLauncherDelegate { | 127 class WrapperTestLauncherDelegate : public base::TestLauncherDelegate { |
120 public: | 128 public: |
121 explicit WrapperTestLauncherDelegate( | 129 explicit WrapperTestLauncherDelegate( |
122 content::TestLauncherDelegate* launcher_delegate) | 130 content::TestLauncherDelegate* launcher_delegate) |
123 : launcher_delegate_(launcher_delegate) { | 131 : launcher_delegate_(launcher_delegate) { |
124 CHECK(temp_dir_.CreateUniqueTempDir()); | 132 CHECK(temp_dir_.CreateUniqueTempDir()); |
125 } | 133 } |
126 | 134 |
(...skipping 10 matching lines...) Expand all Loading... |
137 void DoRunTests(base::TestLauncher* test_launcher, | 145 void DoRunTests(base::TestLauncher* test_launcher, |
138 const std::vector<std::string>& test_names); | 146 const std::vector<std::string>& test_names); |
139 | 147 |
140 // Launches test named |test_name| using parallel launcher, | 148 // Launches test named |test_name| using parallel launcher, |
141 // given result of PRE_ test |pre_test_result|. | 149 // given result of PRE_ test |pre_test_result|. |
142 void RunDependentTest(base::TestLauncher* test_launcher, | 150 void RunDependentTest(base::TestLauncher* test_launcher, |
143 const std::string test_name, | 151 const std::string test_name, |
144 const base::TestResult& pre_test_result); | 152 const base::TestResult& pre_test_result); |
145 | 153 |
146 // Callback to receive result of a test. | 154 // Callback to receive result of a test. |
147 void GTestCallback( | 155 void GTestCallback(base::TestLauncher* test_launcher, |
148 base::TestLauncher* test_launcher, | 156 const std::vector<std::string>& test_names, |
149 const std::vector<std::string>& test_names, | 157 const std::string& test_name, |
150 const std::string& test_name, | 158 scoped_ptr<TestState> test_state, |
151 int exit_code, | 159 int exit_code, |
152 const base::TimeDelta& elapsed_time, | 160 const base::TimeDelta& elapsed_time, |
153 bool was_timeout, | 161 bool was_timeout, |
154 const std::string& output); | 162 const std::string& output); |
155 | 163 |
156 content::TestLauncherDelegate* launcher_delegate_; | 164 content::TestLauncherDelegate* launcher_delegate_; |
157 | 165 |
158 // Store dependent test name (map is indexed by full test name). | 166 // Store dependent test name (map is indexed by full test name). |
159 typedef std::map<std::string, std::string> DependentTestMap; | 167 typedef std::map<std::string, std::string> DependentTestMap; |
160 DependentTestMap dependent_test_map_; | 168 DependentTestMap dependent_test_map_; |
161 DependentTestMap reverse_dependent_test_map_; | 169 DependentTestMap reverse_dependent_test_map_; |
162 | 170 |
163 // Store unique data directory prefix for test names (without PRE_ prefixes). | 171 // Store unique data directory prefix for test names (without PRE_ prefixes). |
164 // PRE_ tests and tests that depend on them must share the same | 172 // PRE_ tests and tests that depend on them must share the same |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 if (test_names.empty()) | 342 if (test_names.empty()) |
335 return; | 343 return; |
336 | 344 |
337 std::string test_name(test_names.front()); | 345 std::string test_name(test_names.front()); |
338 std::vector<std::string> test_names_copy( | 346 std::vector<std::string> test_names_copy( |
339 test_names.begin() + 1, test_names.end()); | 347 test_names.begin() + 1, test_names.end()); |
340 | 348 |
341 std::string test_name_no_pre(RemoveAnyPrePrefixes(test_name)); | 349 std::string test_name_no_pre(RemoveAnyPrePrefixes(test_name)); |
342 | 350 |
343 base::CommandLine cmd_line(*base::CommandLine::ForCurrentProcess()); | 351 base::CommandLine cmd_line(*base::CommandLine::ForCurrentProcess()); |
| 352 base::TestLauncher::LaunchOptions test_launch_options; |
| 353 test_launch_options.flags = base::TestLauncher::USE_JOB_OBJECTS | |
| 354 base::TestLauncher::ALLOW_BREAKAWAY_FROM_JOB; |
| 355 scoped_ptr<TestState> test_state_ptr = |
| 356 launcher_delegate_->PreRunTest(&cmd_line, &test_launch_options); |
344 CHECK(launcher_delegate_->AdjustChildProcessCommandLine( | 357 CHECK(launcher_delegate_->AdjustChildProcessCommandLine( |
345 &cmd_line, user_data_dir_map_[test_name_no_pre])); | 358 &cmd_line, user_data_dir_map_[test_name_no_pre])); |
346 | 359 |
347 base::CommandLine new_cmd_line(cmd_line.GetProgram()); | 360 base::CommandLine new_cmd_line(cmd_line.GetProgram()); |
348 base::CommandLine::SwitchMap switches = cmd_line.GetSwitches(); | 361 base::CommandLine::SwitchMap switches = cmd_line.GetSwitches(); |
349 | 362 |
350 // Strip out gtest_output flag because otherwise we would overwrite results | 363 // Strip out gtest_output flag because otherwise we would overwrite results |
351 // of the other tests. | 364 // of the other tests. |
352 switches.erase(base::kGTestOutputFlag); | 365 switches.erase(base::kGTestOutputFlag); |
353 | 366 |
354 for (base::CommandLine::SwitchMap::const_iterator iter = switches.begin(); | 367 for (base::CommandLine::SwitchMap::const_iterator iter = switches.begin(); |
355 iter != switches.end(); ++iter) { | 368 iter != switches.end(); ++iter) { |
356 new_cmd_line.AppendSwitchNative(iter->first, iter->second); | 369 new_cmd_line.AppendSwitchNative(iter->first, iter->second); |
357 } | 370 } |
358 | 371 |
359 // Always enable disabled tests. This method is not called with disabled | 372 // Always enable disabled tests. This method is not called with disabled |
360 // tests unless this flag was specified to the browser test executable. | 373 // tests unless this flag was specified to the browser test executable. |
361 new_cmd_line.AppendSwitch("gtest_also_run_disabled_tests"); | 374 new_cmd_line.AppendSwitch("gtest_also_run_disabled_tests"); |
362 new_cmd_line.AppendSwitchASCII("gtest_filter", test_name); | 375 new_cmd_line.AppendSwitchASCII("gtest_filter", test_name); |
363 new_cmd_line.AppendSwitch(kSingleProcessTestsFlag); | 376 new_cmd_line.AppendSwitch(kSingleProcessTestsFlag); |
364 | 377 |
365 char* browser_wrapper = getenv("BROWSER_WRAPPER"); | 378 char* browser_wrapper = getenv("BROWSER_WRAPPER"); |
366 | 379 |
367 base::TestLauncher::LaunchOptions test_launch_options; | 380 TestState* test_state = test_state_ptr.get(); |
368 test_launch_options.flags = base::TestLauncher::USE_JOB_OBJECTS | | |
369 base::TestLauncher::ALLOW_BREAKAWAY_FROM_JOB; | |
370 test_launcher->LaunchChildGTestProcess( | 381 test_launcher->LaunchChildGTestProcess( |
371 new_cmd_line, browser_wrapper ? browser_wrapper : std::string(), | 382 new_cmd_line, browser_wrapper ? browser_wrapper : std::string(), |
372 TestTimeouts::action_max_timeout(), test_launch_options, | 383 TestTimeouts::action_max_timeout(), test_launch_options, |
373 base::Bind(&WrapperTestLauncherDelegate::GTestCallback, | 384 base::Bind(&WrapperTestLauncherDelegate::GTestCallback, |
374 base::Unretained(this), test_launcher, test_names_copy, | 385 base::Unretained(this), test_launcher, test_names_copy, |
375 test_name), | 386 test_name, base::Passed(&test_state_ptr)), |
376 base::TestLauncher::GTestProcessLaunchedCallback()); | 387 base::Bind(&CallChildProcessLaunched, base::Unretained(test_state))); |
377 } | 388 } |
378 | 389 |
379 void WrapperTestLauncherDelegate::RunDependentTest( | 390 void WrapperTestLauncherDelegate::RunDependentTest( |
380 base::TestLauncher* test_launcher, | 391 base::TestLauncher* test_launcher, |
381 const std::string test_name, | 392 const std::string test_name, |
382 const base::TestResult& pre_test_result) { | 393 const base::TestResult& pre_test_result) { |
383 if (pre_test_result.status == base::TestResult::TEST_SUCCESS) { | 394 if (pre_test_result.status == base::TestResult::TEST_SUCCESS) { |
384 // Only run the dependent test if PRE_ test succeeded. | 395 // Only run the dependent test if PRE_ test succeeded. |
385 std::vector<std::string> test_list; | 396 std::vector<std::string> test_list; |
386 test_list.push_back(test_name); | 397 test_list.push_back(test_name); |
(...skipping 10 matching lines...) Expand all Loading... |
397 dependent_test_map_[test_name], | 408 dependent_test_map_[test_name], |
398 test_result); | 409 test_result); |
399 } | 410 } |
400 } | 411 } |
401 } | 412 } |
402 | 413 |
403 void WrapperTestLauncherDelegate::GTestCallback( | 414 void WrapperTestLauncherDelegate::GTestCallback( |
404 base::TestLauncher* test_launcher, | 415 base::TestLauncher* test_launcher, |
405 const std::vector<std::string>& test_names, | 416 const std::vector<std::string>& test_names, |
406 const std::string& test_name, | 417 const std::string& test_name, |
| 418 scoped_ptr<TestState> test_state, |
407 int exit_code, | 419 int exit_code, |
408 const base::TimeDelta& elapsed_time, | 420 const base::TimeDelta& elapsed_time, |
409 bool was_timeout, | 421 bool was_timeout, |
410 const std::string& output) { | 422 const std::string& output) { |
411 base::TestResult result; | 423 base::TestResult result; |
412 result.full_name = test_name; | 424 result.full_name = test_name; |
413 | 425 |
414 // TODO(phajdan.jr): Recognize crashes. | 426 // TODO(phajdan.jr): Recognize crashes. |
415 if (exit_code == 0) | 427 if (exit_code == 0) |
416 result.status = base::TestResult::TEST_SUCCESS; | 428 result.status = base::TestResult::TEST_SUCCESS; |
(...skipping 30 matching lines...) Expand all Loading... |
447 | 459 |
448 const char kHelpFlag[] = "help"; | 460 const char kHelpFlag[] = "help"; |
449 | 461 |
450 const char kLaunchAsBrowser[] = "as-browser"; | 462 const char kLaunchAsBrowser[] = "as-browser"; |
451 | 463 |
452 // See kManualTestPrefix above. | 464 // See kManualTestPrefix above. |
453 const char kRunManualTestsFlag[] = "run-manual"; | 465 const char kRunManualTestsFlag[] = "run-manual"; |
454 | 466 |
455 const char kSingleProcessTestsFlag[] = "single_process"; | 467 const char kSingleProcessTestsFlag[] = "single_process"; |
456 | 468 |
| 469 scoped_ptr<TestState> TestLauncherDelegate::PreRunTest( |
| 470 base::CommandLine* command_line, |
| 471 base::TestLauncher::LaunchOptions* test_launch_options) { |
| 472 return nullptr; |
| 473 } |
457 | 474 |
458 TestLauncherDelegate::~TestLauncherDelegate() { | 475 TestLauncherDelegate::~TestLauncherDelegate() { |
459 } | 476 } |
460 | 477 |
461 int LaunchTests(TestLauncherDelegate* launcher_delegate, | 478 int LaunchTests(TestLauncherDelegate* launcher_delegate, |
462 int default_jobs, | 479 int default_jobs, |
463 int argc, | 480 int argc, |
464 char** argv) { | 481 char** argv) { |
465 DCHECK(!g_launcher_delegate); | 482 DCHECK(!g_launcher_delegate); |
466 g_launcher_delegate = launcher_delegate; | 483 g_launcher_delegate = launcher_delegate; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 | 546 |
530 TestLauncherDelegate* GetCurrentTestLauncherDelegate() { | 547 TestLauncherDelegate* GetCurrentTestLauncherDelegate() { |
531 return g_launcher_delegate; | 548 return g_launcher_delegate; |
532 } | 549 } |
533 | 550 |
534 ContentMainParams* GetContentMainParams() { | 551 ContentMainParams* GetContentMainParams() { |
535 return g_params; | 552 return g_params; |
536 } | 553 } |
537 | 554 |
538 } // namespace content | 555 } // namespace content |
OLD | NEW |