xref: /aosp_15_r20/external/cronet/base/test/multiprocess_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/test/multiprocess_test.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/base_switches.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/command_line.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_restrictions.h"
12*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker namespace base {
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
SpawnMultiProcessTestChild(const std::string & procname,const CommandLine & base_command_line,const LaunchOptions & options)17*6777b538SAndroid Build Coastguard Worker Process SpawnMultiProcessTestChild(const std::string& procname,
18*6777b538SAndroid Build Coastguard Worker                                    const CommandLine& base_command_line,
19*6777b538SAndroid Build Coastguard Worker                                    const LaunchOptions& options) {
20*6777b538SAndroid Build Coastguard Worker   CommandLine command_line(base_command_line);
21*6777b538SAndroid Build Coastguard Worker   // TODO(viettrungluu): See comment above |MakeCmdLine()| in the header file.
22*6777b538SAndroid Build Coastguard Worker   // This is a temporary hack, since |MakeCmdLine()| has to provide a full
23*6777b538SAndroid Build Coastguard Worker   // command line.
24*6777b538SAndroid Build Coastguard Worker   if (!command_line.HasSwitch(switches::kTestChildProcess))
25*6777b538SAndroid Build Coastguard Worker     command_line.AppendSwitchASCII(switches::kTestChildProcess, procname);
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker   return LaunchProcess(command_line, options);
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker 
WaitForMultiprocessTestChildExit(const Process & process,TimeDelta timeout,int * exit_code)30*6777b538SAndroid Build Coastguard Worker bool WaitForMultiprocessTestChildExit(const Process& process,
31*6777b538SAndroid Build Coastguard Worker                                       TimeDelta timeout,
32*6777b538SAndroid Build Coastguard Worker                                       int* exit_code) {
33*6777b538SAndroid Build Coastguard Worker   return process.WaitForExitWithTimeout(timeout, exit_code);
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker 
TerminateMultiProcessTestChild(const Process & process,int exit_code,bool wait)36*6777b538SAndroid Build Coastguard Worker bool TerminateMultiProcessTestChild(const Process& process,
37*6777b538SAndroid Build Coastguard Worker                                     int exit_code,
38*6777b538SAndroid Build Coastguard Worker                                     bool wait) {
39*6777b538SAndroid Build Coastguard Worker   return process.Terminate(exit_code, wait);
40*6777b538SAndroid Build Coastguard Worker }
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_ANDROID)
43*6777b538SAndroid Build Coastguard Worker 
GetMultiProcessTestChildBaseCommandLine()44*6777b538SAndroid Build Coastguard Worker CommandLine GetMultiProcessTestChildBaseCommandLine() {
45*6777b538SAndroid Build Coastguard Worker   base::ScopedAllowBlockingForTesting allow_blocking;
46*6777b538SAndroid Build Coastguard Worker   CommandLine cmd_line = *CommandLine::ForCurrentProcess();
47*6777b538SAndroid Build Coastguard Worker   cmd_line.SetProgram(MakeAbsoluteFilePath(cmd_line.GetProgram()));
48*6777b538SAndroid Build Coastguard Worker   return cmd_line;
49*6777b538SAndroid Build Coastguard Worker }
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker // MultiProcessTest ------------------------------------------------------------
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker MultiProcessTest::MultiProcessTest() = default;
54*6777b538SAndroid Build Coastguard Worker 
SpawnChild(const std::string & procname)55*6777b538SAndroid Build Coastguard Worker Process MultiProcessTest::SpawnChild(const std::string& procname) {
56*6777b538SAndroid Build Coastguard Worker   LaunchOptions options;
57*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
58*6777b538SAndroid Build Coastguard Worker   options.start_hidden = true;
59*6777b538SAndroid Build Coastguard Worker #endif
60*6777b538SAndroid Build Coastguard Worker   return SpawnChildWithOptions(procname, options);
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker 
SpawnChildWithOptions(const std::string & procname,const LaunchOptions & options)63*6777b538SAndroid Build Coastguard Worker Process MultiProcessTest::SpawnChildWithOptions(const std::string& procname,
64*6777b538SAndroid Build Coastguard Worker                                                 const LaunchOptions& options) {
65*6777b538SAndroid Build Coastguard Worker   return SpawnMultiProcessTestChild(procname, MakeCmdLine(procname), options);
66*6777b538SAndroid Build Coastguard Worker }
67*6777b538SAndroid Build Coastguard Worker 
MakeCmdLine(const std::string & procname)68*6777b538SAndroid Build Coastguard Worker CommandLine MultiProcessTest::MakeCmdLine(const std::string& procname) {
69*6777b538SAndroid Build Coastguard Worker   CommandLine command_line = GetMultiProcessTestChildBaseCommandLine();
70*6777b538SAndroid Build Coastguard Worker   command_line.AppendSwitchASCII(switches::kTestChildProcess, procname);
71*6777b538SAndroid Build Coastguard Worker   return command_line;
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker }  // namespace base
75