blob: 3bbb7396c0dc56196671d03af4854046c0ace3e6 [file] [log] [blame]
thestig@chromium.org33d56572012-02-24 13:40:20 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_TEST_MULTIPROCESS_TEST_H_
6#define BASE_TEST_MULTIPROCESS_TEST_H_
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +09007
8#include <string>
9
10#include "base/basictypes.h"
rsesek@chromium.org687756f2013-07-26 06:38:23 +090011#include "base/process/launch.h"
12#include "base/process/process_handle.h"
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +090013#include "build/build_config.h"
14#include "testing/platform_test.h"
15
16class CommandLine;
17
18namespace base {
19
20// A MultiProcessTest is a test class which makes it easier to
21// write a test which requires code running out of process.
22//
23// To create a multiprocess test simply follow these steps:
24//
25// 1) Derive your test from MultiProcessTest. Example:
26//
27// class MyTest : public MultiProcessTest {
28// };
29//
30// TEST_F(MyTest, TestCaseName) {
31// ...
32// }
33//
34// 2) Create a mainline function for the child processes and include
35// testing/multiprocess_func_list.h.
36// See the declaration of the MULTIPROCESS_TEST_MAIN macro
37// in that file for an example.
38// 3) Call SpawnChild("foo"), where "foo" is the name of
39// the function you wish to run in the child processes.
40// That's it!
41class MultiProcessTest : public PlatformTest {
42 public:
43 MultiProcessTest();
44
45 protected:
46 // Run a child process.
47 // 'procname' is the name of a function which the child will
48 // execute. It must be exported from this library in order to
49 // run.
50 //
51 // Example signature:
52 // extern "C" int __declspec(dllexport) FooBar() {
53 // // do client work here
54 // }
55 //
56 // Returns the handle to the child, or NULL on failure
57 ProcessHandle SpawnChild(const std::string& procname, bool debug_on_start);
58
59#if defined(OS_POSIX)
evan@chromium.orgf8da1bb2011-07-14 03:51:47 +090060 // TODO(evan): see if we can delete this via more refactoring.
61 // SpawnChild() should just take a base::LaunchOptions so that we don't
62 // need multiple versions of it.
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +090063 ProcessHandle SpawnChild(const std::string& procname,
thestig@chromium.org33d56572012-02-24 13:40:20 +090064 const FileHandleMappingVector& fds_to_map,
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +090065 bool debug_on_start);
66#endif
67
evan@chromium.org87b15df2010-10-16 04:51:20 +090068 // Set up the command line used to spawn the child process.
69 virtual CommandLine MakeCmdLine(const std::string& procname,
70 bool debug_on_start);
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +090071
72 private:
evan@chromium.orgf8da1bb2011-07-14 03:51:47 +090073 // Shared implementation of SpawnChild.
74 // TODO: |fds_to_map| is unused on Windows; see above TODO about
75 // further refactoring.
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +090076 ProcessHandle SpawnChildImpl(const std::string& procname,
thestig@chromium.org33d56572012-02-24 13:40:20 +090077 const FileHandleMappingVector& fds_to_map,
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +090078 bool debug_on_start);
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +090079
evan@chromium.org87b15df2010-10-16 04:51:20 +090080 DISALLOW_COPY_AND_ASSIGN(MultiProcessTest);
brettw@chromium.org1c8c3be2010-08-18 04:40:11 +090081};
82
83} // namespace base
84
85#endif // BASE_TEST_MULTIPROCESS_TEST_H_