15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/multiprocess_test.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_switches.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if !defined(OS_ANDROID)
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ProcessHandle SpawnMultiProcessTestChild(
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& procname,
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const CommandLine& base_command_line,
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const LaunchOptions& options) {
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CommandLine command_line(base_command_line);
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(viettrungluu): See comment above |MakeCmdLine()| in the header file.
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This is a temporary hack, since |MakeCmdLine()| has to provide a full
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // command line.
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!command_line.HasSwitch(switches::kTestChildProcess))
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    command_line.AppendSwitchASCII(switches::kTestChildProcess, procname);
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ProcessHandle handle = kNullProcessHandle;
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LaunchProcess(command_line, options, &handle);
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return handle;
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // !defined(OS_ANDROID)
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)CommandLine GetMultiProcessTestChildBaseCommandLine() {
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return *CommandLine::ForCurrentProcess();
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// MultiProcessTest ------------------------------------------------------------
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MultiProcessTest::MultiProcessTest() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ProcessHandle MultiProcessTest::SpawnChild(const std::string& procname) {
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  LaunchOptions options;
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  options.start_hidden = true;
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return SpawnChildWithOptions(procname, options);
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ProcessHandle MultiProcessTest::SpawnChildWithOptions(
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string& procname,
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const LaunchOptions& options) {
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return SpawnMultiProcessTestChild(procname, MakeCmdLine(procname), options);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)CommandLine MultiProcessTest::MakeCmdLine(const std::string& procname) {
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CommandLine command_line = GetMultiProcessTestChildBaseCommandLine();
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  command_line.AppendSwitchASCII(switches::kTestChildProcess, procname);
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return command_line;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
60