Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/test/launcher/test_launcher.h" | 5 #include "base/test/launcher/test_launcher.h" |
| 6 | 6 |
| 7 #if defined(OS_POSIX) | 7 #if defined(OS_POSIX) |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 bool UnsetEnvironmentVariableIfExists(const std::string& name) { | 194 bool UnsetEnvironmentVariableIfExists(const std::string& name) { |
| 195 scoped_ptr<Environment> env(Environment::Create()); | 195 scoped_ptr<Environment> env(Environment::Create()); |
| 196 std::string str_val; | 196 std::string str_val; |
| 197 | 197 |
| 198 if (!env->GetVar(name.c_str(), &str_val)) | 198 if (!env->GetVar(name.c_str(), &str_val)) |
| 199 return true; | 199 return true; |
| 200 | 200 |
| 201 return env->UnSetVar(name.c_str()); | 201 return env->UnSetVar(name.c_str()); |
| 202 } | 202 } |
| 203 | 203 |
| 204 // Returns true if bot mode has been requested, i.e. defaults optimized | |
| 205 // for continuous integration bots. This way developers don't have to remember | |
| 206 // special command-line flags. | |
| 207 bool BotModeEnabled() { | |
| 208 scoped_ptr<Environment> env(Environment::Create()); | |
| 209 return CommandLine::ForCurrentProcess()->HasSwitch( | |
| 210 switches::kTestLauncherBotMode) || | |
| 211 env->HasVar("CHROMIUM_TEST_LAUNCHER_BOT_MODE"); | |
| 212 } | |
| 213 | |
| 214 void RunCallback( | 204 void RunCallback( |
| 215 const TestLauncher::LaunchChildGTestProcessCallback& callback, | 205 const TestLauncher::LaunchChildGTestProcessCallback& callback, |
| 216 int exit_code, | 206 int exit_code, |
| 217 const TimeDelta& elapsed_time, | 207 const TimeDelta& elapsed_time, |
| 218 bool was_timeout, | 208 bool was_timeout, |
| 219 const std::string& output) { | 209 const std::string& output) { |
| 220 callback.Run(exit_code, elapsed_time, was_timeout, output); | 210 callback.Run(exit_code, elapsed_time, was_timeout, output); |
| 221 } | 211 } |
| 222 | 212 |
| 223 void DoLaunchChildTestProcess( | 213 void DoLaunchChildTestProcess( |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 329 test_success_count_(0), | 319 test_success_count_(0), |
| 330 test_broken_count_(0), | 320 test_broken_count_(0), |
| 331 retry_count_(0), | 321 retry_count_(0), |
| 332 retry_limit_(0), | 322 retry_limit_(0), |
| 333 run_result_(true), | 323 run_result_(true), |
| 334 watchdog_timer_(FROM_HERE, | 324 watchdog_timer_(FROM_HERE, |
| 335 TimeDelta::FromSeconds(kOutputTimeoutSeconds), | 325 TimeDelta::FromSeconds(kOutputTimeoutSeconds), |
| 336 this, | 326 this, |
| 337 &TestLauncher::OnOutputTimeout), | 327 &TestLauncher::OnOutputTimeout), |
| 338 parallel_jobs_(parallel_jobs) { | 328 parallel_jobs_(parallel_jobs) { |
| 339 if (BotModeEnabled()) { | |
| 340 fprintf(stdout, | |
| 341 "Enabling defaults optimized for continuous integration bots.\n"); | |
| 342 fflush(stdout); | |
| 343 | |
| 344 // Enable test retries by default for bots. This can be still overridden | |
| 345 // from command line using --test-launcher-retry-limit flag. | |
| 346 retry_limit_ = 3; | |
| 347 } else { | |
| 348 // Default to serial test execution if not running on a bot. This makes it | |
| 349 // possible to disable stdio redirection and can still be overridden with | |
| 350 // --test-launcher-jobs flag. | |
| 351 parallel_jobs_ = 1; | |
| 352 } | |
| 353 } | 329 } |
| 354 | 330 |
| 355 TestLauncher::~TestLauncher() { | 331 TestLauncher::~TestLauncher() { |
| 356 if (worker_pool_owner_) | 332 if (worker_pool_owner_) |
| 357 worker_pool_owner_->pool()->Shutdown(); | 333 worker_pool_owner_->pool()->Shutdown(); |
| 358 } | 334 } |
| 359 | 335 |
| 360 bool TestLauncher::Run() { | 336 bool TestLauncher::Run() { |
| 361 if (!Init()) | 337 if (!Init()) |
| 362 return false; | 338 return false; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 411 base::TimeDelta timeout, | 387 base::TimeDelta timeout, |
| 412 int flags, | 388 int flags, |
| 413 const LaunchChildGTestProcessCallback& callback) { | 389 const LaunchChildGTestProcessCallback& callback) { |
| 414 DCHECK(thread_checker_.CalledOnValidThread()); | 390 DCHECK(thread_checker_.CalledOnValidThread()); |
| 415 | 391 |
| 416 // Record the exact command line used to launch the child. | 392 // Record the exact command line used to launch the child. |
| 417 CommandLine new_command_line( | 393 CommandLine new_command_line( |
| 418 PrepareCommandLineForGTest(command_line, wrapper)); | 394 PrepareCommandLineForGTest(command_line, wrapper)); |
| 419 | 395 |
| 420 // When running in parallel mode we need to redirect stdio to avoid mixed-up | 396 // When running in parallel mode we need to redirect stdio to avoid mixed-up |
| 421 // output. We also always redirect on the bots to get the test output into | 397 // output. We also always redirect on the bots to get the test output into |
|
Paweł Hajdan Jr.
2014/08/13 09:36:37
Please see this comment. It's important behavior:
Dirk Pranke
2014/08/13 16:56:04
Ah, okay. I will restore this and BotModeEnabled()
| |
| 422 // JSON summary. | 398 // JSON summary. |
| 423 bool redirect_stdio = (parallel_jobs_ > 1) || BotModeEnabled(); | 399 bool redirect_stdio = (parallel_jobs_ > 1); |
| 424 | 400 |
| 425 worker_pool_owner_->pool()->PostWorkerTask( | 401 worker_pool_owner_->pool()->PostWorkerTask( |
| 426 FROM_HERE, | 402 FROM_HERE, |
| 427 Bind(&DoLaunchChildTestProcess, | 403 Bind(&DoLaunchChildTestProcess, |
| 428 new_command_line, | 404 new_command_line, |
| 429 timeout, | 405 timeout, |
| 430 flags, | 406 flags, |
| 431 redirect_stdio, | 407 redirect_stdio, |
| 432 MessageLoopProxy::current(), | 408 MessageLoopProxy::current(), |
| 433 Bind(&TestLauncher::OnLaunchTestProcessFinished, | 409 Bind(&TestLauncher::OnLaunchTestProcessFinished, |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 643 switches::kTestLauncherRetryLimit)) { | 619 switches::kTestLauncherRetryLimit)) { |
| 644 int retry_limit = -1; | 620 int retry_limit = -1; |
| 645 if (!StringToInt(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 621 if (!StringToInt(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 646 switches::kTestLauncherRetryLimit), &retry_limit) || | 622 switches::kTestLauncherRetryLimit), &retry_limit) || |
| 647 retry_limit < 0) { | 623 retry_limit < 0) { |
| 648 LOG(ERROR) << "Invalid value for " << switches::kTestLauncherRetryLimit; | 624 LOG(ERROR) << "Invalid value for " << switches::kTestLauncherRetryLimit; |
| 649 return false; | 625 return false; |
| 650 } | 626 } |
| 651 | 627 |
| 652 retry_limit_ = retry_limit; | 628 retry_limit_ = retry_limit; |
| 629 } else if (!CommandLine::ForCurrentProcess()->HasSwitch(kGTestFilterFlag)) { | |
| 630 // Retry failures 3 times by default if we are running all of the tests. | |
| 631 retry_limit_ = 3; | |
| 653 } | 632 } |
| 654 | 633 |
| 655 if (CommandLine::ForCurrentProcess()->HasSwitch( | 634 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 656 switches::kTestLauncherJobs)) { | 635 switches::kTestLauncherJobs)) { |
| 657 int jobs = -1; | 636 int jobs = -1; |
| 658 if (!StringToInt(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 637 if (!StringToInt(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 659 switches::kTestLauncherJobs), &jobs) || | 638 switches::kTestLauncherJobs), &jobs) || |
| 660 jobs < 0) { | 639 jobs < 0) { |
| 661 LOG(ERROR) << "Invalid value for " << switches::kTestLauncherJobs; | 640 LOG(ERROR) << "Invalid value for " << switches::kTestLauncherJobs; |
| 662 return false; | 641 return false; |
| 663 } | 642 } |
| 664 | 643 |
| 665 parallel_jobs_ = jobs; | 644 parallel_jobs_ = jobs; |
| 645 } else if (CommandLine::ForCurrentProcess()->HasSwitch(kGTestFilterFlag)) { | |
| 646 // Do not run jobs in parallel by default if we are running a subset of | |
| 647 // the tests. | |
| 648 parallel_jobs_ = 1; | |
| 666 } | 649 } |
| 650 | |
| 667 fprintf(stdout, "Using %" PRIuS " parallel jobs.\n", parallel_jobs_); | 651 fprintf(stdout, "Using %" PRIuS " parallel jobs.\n", parallel_jobs_); |
| 668 fflush(stdout); | 652 fflush(stdout); |
| 669 worker_pool_owner_.reset( | 653 worker_pool_owner_.reset( |
| 670 new SequencedWorkerPoolOwner(parallel_jobs_, "test_launcher")); | 654 new SequencedWorkerPoolOwner(parallel_jobs_, "test_launcher")); |
| 671 | 655 |
| 672 if (command_line->HasSwitch(switches::kTestLauncherFilterFile) && | 656 if (command_line->HasSwitch(switches::kTestLauncherFilterFile) && |
| 673 command_line->HasSwitch(kGTestFilterFlag)) { | 657 command_line->HasSwitch(kGTestFilterFlag)) { |
| 674 LOG(ERROR) << "Only one of --test-launcher-filter-file and --gtest_filter " | 658 LOG(ERROR) << "Only one of --test-launcher-filter-file and --gtest_filter " |
| 675 << "at a time is allowed."; | 659 << "at a time is allowed."; |
| 676 return false; | 660 return false; |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1097 | 1081 |
| 1098 g_live_processes.Get().erase(process_handle); | 1082 g_live_processes.Get().erase(process_handle); |
| 1099 } | 1083 } |
| 1100 | 1084 |
| 1101 base::CloseProcessHandle(process_handle); | 1085 base::CloseProcessHandle(process_handle); |
| 1102 | 1086 |
| 1103 return exit_code; | 1087 return exit_code; |
| 1104 } | 1088 } |
| 1105 | 1089 |
| 1106 } // namespace base | 1090 } // namespace base |
| OLD | NEW |