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

Unified Diff: base/test/launcher/parallel_test_launcher.cc

Issue 55473002: GTTF: Unify parallel test launching. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: reupload Created 7 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/test/launcher/parallel_test_launcher.h ('k') | base/test/launcher/test_launcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/test/launcher/parallel_test_launcher.cc
diff --git a/base/test/launcher/parallel_test_launcher.cc b/base/test/launcher/parallel_test_launcher.cc
deleted file mode 100644
index 225b4ebf09c1e25caddcb55d58bc1e6556b0ac9d..0000000000000000000000000000000000000000
--- a/base/test/launcher/parallel_test_launcher.cc
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/launcher/parallel_test_launcher.h"
-
-#if defined(OS_POSIX)
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#endif
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/file_util.h"
-#include "base/location.h"
-#include "base/message_loop/message_loop_proxy.h"
-#include "base/process/launch.h"
-#include "base/run_loop.h"
-#include "base/test/launcher/test_launcher.h"
-#include "base/test/sequenced_worker_pool_owner.h"
-
-#if defined(OS_WIN)
-#include "base/win/scoped_handle.h"
-#endif
-
-namespace base {
-
-namespace {
-
-// Maximum time of no output after which we print list of processes still
-// running. This deliberately doesn't use TestTimeouts (which is otherwise
-// a recommended solution), because they can be increased. This would defeat
-// the purpose of this timeout, which is 1) to avoid buildbot "no output for
-// X seconds" timeout killing the process 2) help communicate status of
-// the test launcher to people looking at the output (no output for a long
-// time is mysterious and gives no info about what is happening) 3) help
-// debugging in case the process hangs anyway.
-const int kOutputTimeoutSeconds = 15;
-
-void RunCallback(
- const ParallelTestLauncher::LaunchChildGTestProcessCallback& callback,
- int exit_code,
- const TimeDelta& elapsed_time,
- bool was_timeout,
- const std::string& output) {
- callback.Run(exit_code, elapsed_time, was_timeout, output);
-}
-
-void DoLaunchChildTestProcess(
- const CommandLine& command_line,
- base::TimeDelta timeout,
- scoped_refptr<MessageLoopProxy> message_loop_proxy,
- const ParallelTestLauncher::LaunchChildGTestProcessCallback& callback) {
- TimeTicks start_time = TimeTicks::Now();
-
- // Redirect child process output to a file.
- base::FilePath output_file;
- CHECK(file_util::CreateTemporaryFile(&output_file));
-
- LaunchOptions options;
-#if defined(OS_WIN)
- // Make the file handle inheritable by the child.
- SECURITY_ATTRIBUTES sa_attr;
- sa_attr.nLength = sizeof(SECURITY_ATTRIBUTES);
- sa_attr.lpSecurityDescriptor = NULL;
- sa_attr.bInheritHandle = TRUE;
-
- win::ScopedHandle handle(CreateFile(output_file.value().c_str(),
- GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_DELETE,
- &sa_attr,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_TEMPORARY,
- NULL));
- CHECK(handle.IsValid());
- options.inherit_handles = true;
- options.stdin_handle = INVALID_HANDLE_VALUE;
- options.stdout_handle = handle.Get();
- options.stderr_handle = handle.Get();
-#elif defined(OS_POSIX)
- options.new_process_group = true;
-
- int output_file_fd = open(output_file.value().c_str(), O_RDWR);
- CHECK_GE(output_file_fd, 0);
-
- file_util::ScopedFD output_file_fd_closer(&output_file_fd);
-
- base::FileHandleMappingVector fds_mapping;
- fds_mapping.push_back(std::make_pair(output_file_fd, STDOUT_FILENO));
- fds_mapping.push_back(std::make_pair(output_file_fd, STDERR_FILENO));
- options.fds_to_remap = &fds_mapping;
-#endif
-
- bool was_timeout = false;
- int exit_code = LaunchChildTestProcessWithOptions(
- command_line, options, timeout, &was_timeout);
-
-#if defined(OS_WIN)
- FlushFileBuffers(handle.Get());
- handle.Close();
-#elif defined(OS_POSIX)
- output_file_fd_closer.reset();
-#endif
-
- std::string output_file_contents;
- CHECK(base::ReadFileToString(output_file, &output_file_contents));
-
- if (!base::DeleteFile(output_file, false)) {
- // This needs to be non-fatal at least for Windows.
- LOG(WARNING) << "Failed to delete " << output_file.AsUTF8Unsafe();
- }
-
- // Run target callback on the thread it was originating from, not on
- // a worker pool thread.
- message_loop_proxy->PostTask(
- FROM_HERE,
- Bind(&RunCallback,
- callback,
- exit_code,
- TimeTicks::Now() - start_time,
- was_timeout,
- output_file_contents));
-}
-
-} // namespace
-
-ParallelTestLauncher::ParallelTestLauncher(size_t jobs)
- : timer_(FROM_HERE,
- TimeDelta::FromSeconds(kOutputTimeoutSeconds),
- this,
- &ParallelTestLauncher::OnOutputTimeout),
- launch_sequence_number_(0),
- worker_pool_owner_(
- new SequencedWorkerPoolOwner(jobs, "parallel_test_launcher")) {
- // Start the watchdog timer.
- timer_.Reset();
-}
-
-ParallelTestLauncher::~ParallelTestLauncher() {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- worker_pool_owner_->pool()->Shutdown();
-}
-
-void ParallelTestLauncher::LaunchChildGTestProcess(
- const CommandLine& command_line,
- const std::string& wrapper,
- base::TimeDelta timeout,
- const LaunchChildGTestProcessCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- // Record the exact command line used to launch the child.
- CommandLine new_command_line(
- PrepareCommandLineForGTest(command_line, wrapper));
- launch_sequence_number_++;
- running_processes_map_.insert(
- std::make_pair(launch_sequence_number_, new_command_line));
-
- worker_pool_owner_->pool()->PostWorkerTask(
- FROM_HERE,
- Bind(&DoLaunchChildTestProcess,
- new_command_line,
- timeout,
- MessageLoopProxy::current(),
- Bind(&ParallelTestLauncher::OnLaunchTestProcessFinished,
- Unretained(this),
- launch_sequence_number_,
- callback)));
-}
-
-void ParallelTestLauncher::ResetOutputWatchdog() {
- DCHECK(thread_checker_.CalledOnValidThread());
- timer_.Reset();
-}
-
-void ParallelTestLauncher::OnLaunchTestProcessFinished(
- size_t sequence_number,
- const LaunchChildGTestProcessCallback& callback,
- int exit_code,
- const TimeDelta& elapsed_time,
- bool was_timeout,
- const std::string& output) {
- DCHECK(thread_checker_.CalledOnValidThread());
- running_processes_map_.erase(sequence_number);
- callback.Run(exit_code, elapsed_time, was_timeout, output);
-}
-
-void ParallelTestLauncher::OnOutputTimeout() {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- fprintf(stdout, "Still waiting for the following processes to finish:\n");
-
- for (RunningProcessesMap::const_iterator i = running_processes_map_.begin();
- i != running_processes_map_.end();
- ++i) {
-#if defined(OS_WIN)
- fwprintf(stdout, L"\t%s\n", i->second.GetCommandLineString().c_str());
-#else
- fprintf(stdout, "\t%s\n", i->second.GetCommandLineString().c_str());
-#endif
- }
-
- fflush(stdout);
-
- // Arm the timer again - otherwise it would fire only once.
- timer_.Reset();
-}
-
-} // namespace base
« no previous file with comments | « base/test/launcher/parallel_test_launcher.h ('k') | base/test/launcher/test_launcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698