| // Copyright (c) 2012 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/multiprocess_test.h" | 
 |  | 
 | #include "base/base_switches.h" | 
 | #include "base/command_line.h" | 
 | #include "base/files/file_path.h" | 
 | #include "base/files/file_util.h" | 
 | #include "base/threading/thread_restrictions.h" | 
 | #include "build_config.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | #if !defined(OS_ANDROID) | 
 | Process SpawnMultiProcessTestChild(const std::string& procname, | 
 |                                    const CommandLine& base_command_line, | 
 |                                    const LaunchOptions& options) { | 
 |   CommandLine command_line(base_command_line); | 
 |   // TODO(viettrungluu): See comment above |MakeCmdLine()| in the header file. | 
 |   // This is a temporary hack, since |MakeCmdLine()| has to provide a full | 
 |   // command line. | 
 |   if (!command_line.HasSwitch(switches::kTestChildProcess)) | 
 |     command_line.AppendSwitchASCII(switches::kTestChildProcess, procname); | 
 |  | 
 |   return LaunchProcess(command_line, options); | 
 | } | 
 |  | 
 | bool WaitForMultiprocessTestChildExit(const Process& process, | 
 |                                       TimeDelta timeout, | 
 |                                       int* exit_code) { | 
 |   return process.WaitForExitWithTimeout(timeout, exit_code); | 
 | } | 
 |  | 
 | bool TerminateMultiProcessTestChild(const Process& process, | 
 |                                     int exit_code, | 
 |                                     bool wait) { | 
 |   return process.Terminate(exit_code, wait); | 
 | } | 
 |  | 
 | #endif  // !defined(OS_ANDROID) | 
 |  | 
 | CommandLine GetMultiProcessTestChildBaseCommandLine() { | 
 |   base::ScopedAllowBlockingForTesting allow_blocking; | 
 |   CommandLine cmd_line = *CommandLine::ForCurrentProcess(); | 
 |   cmd_line.SetProgram(MakeAbsoluteFilePath(cmd_line.GetProgram())); | 
 |   return cmd_line; | 
 | } | 
 |  | 
 | // MultiProcessTest ------------------------------------------------------------ | 
 |  | 
 | MultiProcessTest::MultiProcessTest() = default; | 
 |  | 
 | Process MultiProcessTest::SpawnChild(const std::string& procname) { | 
 |   LaunchOptions options; | 
 | #if defined(OS_WIN) | 
 |   options.start_hidden = true; | 
 | #endif | 
 |   return SpawnChildWithOptions(procname, options); | 
 | } | 
 |  | 
 | Process MultiProcessTest::SpawnChildWithOptions(const std::string& procname, | 
 |                                                 const LaunchOptions& options) { | 
 |   return SpawnMultiProcessTestChild(procname, MakeCmdLine(procname), options); | 
 | } | 
 |  | 
 | CommandLine MultiProcessTest::MakeCmdLine(const std::string& procname) { | 
 |   CommandLine command_line = GetMultiProcessTestChildBaseCommandLine(); | 
 |   command_line.AppendSwitchASCII(switches::kTestChildProcess, procname); | 
 |   return command_line; | 
 | } | 
 |  | 
 | }  // namespace base |