1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/test/multiprocess_test.h" 6 7 #include "base/base_switches.h" 8 #include "base/command_line.h" 9 10 #if defined(OS_POSIX) 11 #include <sys/types.h> 12 #include <unistd.h> 13 #endif 14 15 namespace base { 16 17 MultiProcessTest::MultiProcessTest() { 18 } 19 20 ProcessHandle MultiProcessTest::SpawnChild(const std::string& procname, 21 bool debug_on_start) { 22 #if defined(OS_WIN) 23 return SpawnChildImpl(procname, debug_on_start); 24 #elif defined(OS_POSIX) 25 file_handle_mapping_vector empty_file_list; 26 return SpawnChildImpl(procname, empty_file_list, debug_on_start); 27 #endif 28 } 29 30 #if defined(OS_POSIX) 31 ProcessHandle MultiProcessTest::SpawnChild( 32 const std::string& procname, 33 const file_handle_mapping_vector& fds_to_map, 34 bool debug_on_start) { 35 return SpawnChildImpl(procname, fds_to_map, debug_on_start); 36 } 37 #endif 38 39 CommandLine MultiProcessTest::MakeCmdLine(const std::string& procname, 40 bool debug_on_start) { 41 CommandLine cl(*CommandLine::ForCurrentProcess()); 42 cl.AppendSwitchASCII(switches::kTestChildProcess, procname); 43 if (debug_on_start) 44 cl.AppendSwitch(switches::kDebugOnStart); 45 return cl; 46 } 47 48 #if defined(OS_WIN) 49 50 ProcessHandle MultiProcessTest::SpawnChildImpl(const std::string& procname, 51 bool debug_on_start) { 52 ProcessHandle handle = static_cast<ProcessHandle>(NULL); 53 LaunchApp(MakeCmdLine(procname, debug_on_start), 54 false, true, &handle); 55 return handle; 56 } 57 58 #elif defined(OS_POSIX) 59 60 // TODO(port): with the CommandLine refactoring, this code is very similar 61 // to the Windows code. Investigate whether this can be made shorter. 62 ProcessHandle MultiProcessTest::SpawnChildImpl( 63 const std::string& procname, 64 const file_handle_mapping_vector& fds_to_map, 65 bool debug_on_start) { 66 ProcessHandle handle = kNullProcessHandle; 67 LaunchApp(MakeCmdLine(procname, debug_on_start).argv(), 68 fds_to_map, false, &handle); 69 return handle; 70 } 71 72 #endif 73 74 } // namespace base 75