| // 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/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 |