Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Side by Side Diff: content/test/test_launcher.cc

Issue 10832106: Allow writing browser_tests that involve a restart. The way to do this: (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/test/base/in_process_browser_test.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 292
293 // Make it possible for selected tests to request a longer timeout. 293 // Make it possible for selected tests to request a longer timeout.
294 // Generally tests should really avoid doing too much, and splitting 294 // Generally tests should really avoid doing too much, and splitting
295 // a test instead of using SLOW prefix is strongly preferred. 295 // a test instead of using SLOW prefix is strongly preferred.
296 if (test_name.find("SLOW_") != std::string::npos) 296 if (test_name.find("SLOW_") != std::string::npos)
297 timeout *= kSlowTestTimeoutMultiplier; 297 timeout *= kSlowTestTimeoutMultiplier;
298 298
299 return timeout; 299 return timeout;
300 } 300 }
301 301
302 // Runs test specified by |test_name| in a child process, 302 int RunTestInternal(const testing::TestCase* test_case,
303 // and returns the exit code. 303 const std::string& test_name,
304 int RunTest(TestLauncherDelegate* launcher_delegate, 304 CommandLine* command_line,
305 const std::string& test_name, 305 base::TimeDelta default_timeout,
306 base::TimeDelta default_timeout, 306 bool* was_timeout) {
307 bool* was_timeout) { 307 std::string pre_test_name = test_name;
sky 2012/08/02 15:21:55 move 307/308 inside if (test_case)
jam 2012/08/05 21:44:02 Done.
308 if (was_timeout) 308 ReplaceFirstSubstringAfterOffset(&pre_test_name, 0, ".", ".PRE_");
309 *was_timeout = false;
310 309
311 #if defined(OS_MACOSX) 310 if (test_case) {
312 // Some of the below method calls will leak objects if there is no 311 for (int i = 0; i < test_case->total_test_count(); ++i) {
313 // autorelease pool in place. 312 const testing::TestInfo* test_info = test_case->GetTestInfo(i);
314 base::mac::ScopedNSAutoreleasePool pool; 313 std::string test_name = test_info->test_case_name();
sky 2012/08/02 15:21:55 nit: use a different name here so you aren't shado
315 #endif 314 test_name.append(".");
315 test_name.append(test_info->name());
316 if (test_name == pre_test_name) {
317 int exit_code = RunTestInternal(test_case, pre_test_name, command_line,
318 default_timeout, was_timeout);
319 if (exit_code != 0)
320 return exit_code;
321 }
322 }
323 }
316 324
317 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); 325 CommandLine new_cmd_line(*command_line);
318 CommandLine new_cmd_line(cmd_line->GetProgram());
319 CommandLine::SwitchMap switches = cmd_line->GetSwitches();
320
321 // Strip out gtest_output flag because otherwise we would overwrite results
322 // of the previous test. We will generate the final output file later
323 // in RunTests().
324 switches.erase(kGTestOutputFlag);
325
326 // Strip out gtest_repeat flag because we can only run one test in the child
327 // process (restarting the browser in the same process is illegal after it
328 // has been shut down and will actually crash).
329 switches.erase(kGTestRepeatFlag);
330
331 for (CommandLine::SwitchMap::const_iterator iter = switches.begin();
332 iter != switches.end(); ++iter) {
333 new_cmd_line.AppendSwitchNative((*iter).first, (*iter).second);
334 }
335 326
336 // Always enable disabled tests. This method is not called with disabled 327 // Always enable disabled tests. This method is not called with disabled
337 // tests unless this flag was specified to the browser test executable. 328 // tests unless this flag was specified to the browser test executable.
338 new_cmd_line.AppendSwitch("gtest_also_run_disabled_tests"); 329 new_cmd_line.AppendSwitch("gtest_also_run_disabled_tests");
339 new_cmd_line.AppendSwitchASCII("gtest_filter", test_name); 330 new_cmd_line.AppendSwitchASCII("gtest_filter", test_name);
340 new_cmd_line.AppendSwitch(kSingleProcessTestsFlag); 331 new_cmd_line.AppendSwitch(kSingleProcessTestsFlag);
341 332
342 // Do not let the child ignore failures. We need to propagate the
343 // failure status back to the parent.
344 new_cmd_line.AppendSwitch(base::TestSuite::kStrictFailureHandling);
345
346 if (!launcher_delegate->AdjustChildProcessCommandLine(&new_cmd_line))
347 return -1;
348
349 const char* browser_wrapper = getenv("BROWSER_WRAPPER"); 333 const char* browser_wrapper = getenv("BROWSER_WRAPPER");
350 if (browser_wrapper) { 334 if (browser_wrapper) {
351 #if defined(OS_WIN) 335 #if defined(OS_WIN)
352 new_cmd_line.PrependWrapper(ASCIIToWide(browser_wrapper)); 336 new_cmd_line.PrependWrapper(ASCIIToWide(browser_wrapper));
353 #elif defined(OS_POSIX) 337 #elif defined(OS_POSIX)
354 new_cmd_line.PrependWrapper(browser_wrapper); 338 new_cmd_line.PrependWrapper(browser_wrapper);
355 #endif 339 #endif
356 VLOG(1) << "BROWSER_WRAPPER was set, prefixing command_line with " 340 VLOG(1) << "BROWSER_WRAPPER was set, prefixing command_line with "
357 << browser_wrapper; 341 << browser_wrapper;
358 } 342 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 // cleaned up using JobObjects. 379 // cleaned up using JobObjects.
396 base::KillProcessGroup(process_handle); 380 base::KillProcessGroup(process_handle);
397 } 381 }
398 #endif 382 #endif
399 383
400 base::CloseProcessHandle(process_handle); 384 base::CloseProcessHandle(process_handle);
401 385
402 return exit_code; 386 return exit_code;
403 } 387 }
404 388
389 // Runs test specified by |test_name| in a child process,
390 // and returns the exit code.
391 int RunTest(TestLauncherDelegate* launcher_delegate,
392 const testing::TestCase* test_case,
393 const std::string& test_name,
394 base::TimeDelta default_timeout,
395 bool* was_timeout) {
396 if (was_timeout)
397 *was_timeout = false;
398
399 #if defined(OS_MACOSX)
400 // Some of the below method calls will leak objects if there is no
401 // autorelease pool in place.
402 base::mac::ScopedNSAutoreleasePool pool;
403 #endif
404
405 const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
406 CommandLine new_cmd_line(cmd_line->GetProgram());
407 CommandLine::SwitchMap switches = cmd_line->GetSwitches();
408
409 // Strip out gtest_output flag because otherwise we would overwrite results
410 // of the previous test. We will generate the final output file later
411 // in RunTests().
412 switches.erase(kGTestOutputFlag);
413
414 // Strip out gtest_repeat flag because we can only run one test in the child
415 // process (restarting the browser in the same process is illegal after it
416 // has been shut down and will actually crash).
417 switches.erase(kGTestRepeatFlag);
418
419 for (CommandLine::SwitchMap::const_iterator iter = switches.begin();
420 iter != switches.end(); ++iter) {
421 new_cmd_line.AppendSwitchNative((*iter).first, (*iter).second);
422 }
423
424 // Do not let the child ignore failures. We need to propagate the
425 // failure status back to the parent.
426 new_cmd_line.AppendSwitch(base::TestSuite::kStrictFailureHandling);
427
428 if (!launcher_delegate->AdjustChildProcessCommandLine(&new_cmd_line))
429 return -1;
430
431 return RunTestInternal(
432 test_case, test_name, &new_cmd_line, default_timeout, was_timeout);
433 }
434
405 bool RunTests(TestLauncherDelegate* launcher_delegate, 435 bool RunTests(TestLauncherDelegate* launcher_delegate,
406 bool should_shard, 436 bool should_shard,
407 int total_shards, 437 int total_shards,
408 int shard_index) { 438 int shard_index) {
409 const CommandLine* command_line = CommandLine::ForCurrentProcess(); 439 const CommandLine* command_line = CommandLine::ForCurrentProcess();
410 440
411 DCHECK(!command_line->HasSwitch(kGTestListTestsFlag)); 441 DCHECK(!command_line->HasSwitch(kGTestListTestsFlag));
412 442
413 testing::UnitTest* const unit_test = testing::UnitTest::GetInstance(); 443 testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();
414 444
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 continue; 477 continue;
448 478
449 // Skip disabled tests. 479 // Skip disabled tests.
450 if (test_name.find("DISABLED") != std::string::npos && 480 if (test_name.find("DISABLED") != std::string::npos &&
451 !command_line->HasSwitch(kGTestRunDisabledTestsFlag)) { 481 !command_line->HasSwitch(kGTestRunDisabledTestsFlag)) {
452 printer.OnTestEnd(test_info->name(), test_case->name(), 482 printer.OnTestEnd(test_info->name(), test_case->name(),
453 false, false, false, 0); 483 false, false, false, 0);
454 continue; 484 continue;
455 } 485 }
456 486
487 if (StartsWithASCII(test_info->name(), "PRE_", true))
488 continue;
489
457 // Skip the test that doesn't match the filter string (if given). 490 // Skip the test that doesn't match the filter string (if given).
458 if ((!positive_filter.empty() && 491 if ((!positive_filter.empty() &&
459 !MatchesFilter(test_name, positive_filter)) || 492 !MatchesFilter(test_name, positive_filter)) ||
460 MatchesFilter(test_name, negative_filter)) { 493 MatchesFilter(test_name, negative_filter)) {
461 printer.OnTestEnd(test_info->name(), test_case->name(), 494 printer.OnTestEnd(test_info->name(), test_case->name(),
462 false, false, false, 0); 495 false, false, false, 0);
463 continue; 496 continue;
464 } 497 }
465 498
466 // Decide if this test should be run. 499 // Decide if this test should be run.
467 bool should_run = true; 500 bool should_run = true;
468 if (should_shard) { 501 if (should_shard) {
469 should_run = ShouldRunTestOnShard(total_shards, shard_index, 502 should_run = ShouldRunTestOnShard(total_shards, shard_index,
470 num_runnable_tests); 503 num_runnable_tests);
471 } 504 }
472 num_runnable_tests += 1; 505 num_runnable_tests += 1;
473 // If sharding is enabled and the test should not be run, skip it. 506 // If sharding is enabled and the test should not be run, skip it.
474 if (!should_run) { 507 if (!should_run) {
475 continue; 508 continue;
476 } 509 }
477 510
478 base::Time start_time = base::Time::Now(); 511 base::Time start_time = base::Time::Now();
479 ++test_run_count; 512 ++test_run_count;
480 bool was_timeout = false; 513 bool was_timeout = false;
481 int exit_code = RunTest(launcher_delegate, 514 int exit_code = RunTest(launcher_delegate,
515 test_case,
482 test_name, 516 test_name,
483 TestTimeouts::action_max_timeout(), 517 TestTimeouts::action_max_timeout(),
484 &was_timeout); 518 &was_timeout);
485 if (exit_code == 0) { 519 if (exit_code == 0) {
486 // Test passed. 520 // Test passed.
487 printer.OnTestEnd(test_info->name(), test_case->name(), true, false, 521 printer.OnTestEnd(test_info->name(), test_case->name(), true, false,
488 false, 522 false,
489 (base::Time::Now() - start_time).InMillisecondsF()); 523 (base::Time::Now() - start_time).InMillisecondsF());
490 } else { 524 } else {
491 failed_tests.push_back(test_name); 525 failed_tests.push_back(test_name);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 // from disk may be slow on a busy bot, and can easily exceed the default 668 // from disk may be slow on a busy bot, and can easily exceed the default
635 // timeout causing flaky test failures. Use an empty test that only starts 669 // timeout causing flaky test failures. Use an empty test that only starts
636 // and closes a browser with a long timeout to avoid those problems. 670 // and closes a browser with a long timeout to avoid those problems.
637 // NOTE: We don't do this when specifying a filter because this slows down 671 // NOTE: We don't do this when specifying a filter because this slows down
638 // the common case of running one test locally, and also on trybots when 672 // the common case of running one test locally, and also on trybots when
639 // sharding as this one test runs ~200 times and wastes a few minutes. 673 // sharding as this one test runs ~200 times and wastes a few minutes.
640 bool warmup = command_line->HasSwitch(kWarmupFlag); 674 bool warmup = command_line->HasSwitch(kWarmupFlag);
641 bool has_filter = command_line->HasSwitch(kGTestFilterFlag); 675 bool has_filter = command_line->HasSwitch(kGTestFilterFlag);
642 if (warmup || (!should_shard && !has_filter)) { 676 if (warmup || (!should_shard && !has_filter)) {
643 exit_code = RunTest(launcher_delegate, 677 exit_code = RunTest(launcher_delegate,
678 NULL,
644 empty_test, 679 empty_test,
645 TestTimeouts::large_test_timeout(), 680 TestTimeouts::large_test_timeout(),
646 NULL); 681 NULL);
647 if (exit_code != 0 || warmup) 682 if (exit_code != 0 || warmup)
648 return exit_code; 683 return exit_code;
649 } 684 }
650 } 685 }
651 686
652 int cycles = 1; 687 int cycles = 1;
653 if (command_line->HasSwitch(kGTestRepeatFlag)) { 688 if (command_line->HasSwitch(kGTestRepeatFlag)) {
(...skipping 15 matching lines...) Expand all
669 cycles--; 704 cycles--;
670 } 705 }
671 return exit_code; 706 return exit_code;
672 } 707 }
673 708
674 TestLauncherDelegate* GetCurrentTestLauncherDelegate() { 709 TestLauncherDelegate* GetCurrentTestLauncherDelegate() {
675 return g_launcher_delegate; 710 return g_launcher_delegate;
676 } 711 }
677 712
678 } // namespace test_launcher 713 } // namespace test_launcher
OLDNEW
« no previous file with comments | « chrome/test/base/in_process_browser_test.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698