Home | History | Annotate | Download | only in test
      1 // Copyright (c) 2012 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 #ifndef BASE_TEST_MULTIPROCESS_TEST_H_
      6 #define BASE_TEST_MULTIPROCESS_TEST_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/process/launch.h"
     12 #include "base/process/process_handle.h"
     13 #include "build/build_config.h"
     14 #include "testing/platform_test.h"
     15 
     16 class CommandLine;
     17 
     18 namespace 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!
     41 class 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   // Run a child process using the given launch options.
     60   //
     61   // Note: On Windows, you probably want to set |options.start_hidden|.
     62   ProcessHandle SpawnChildWithOptions(const std::string& procname,
     63                                       const LaunchOptions& options,
     64                                       bool debug_on_start);
     65 
     66 #if defined(OS_POSIX)
     67   // TODO(vtl): Remove this in favor of |SpawnChildWithOptions()|. Probably keep
     68   // the no-options |SpawnChild()| around for ease-of-use.
     69   ProcessHandle SpawnChild(const std::string& procname,
     70                            const FileHandleMappingVector& fds_to_map,
     71                            bool debug_on_start);
     72 #endif
     73 
     74   // Set up the command line used to spawn the child process.
     75   virtual CommandLine MakeCmdLine(const std::string& procname,
     76                                   bool debug_on_start);
     77 
     78  private:
     79   DISALLOW_COPY_AND_ASSIGN(MultiProcessTest);
     80 };
     81 
     82 }  // namespace base
     83 
     84 #endif  // BASE_TEST_MULTIPROCESS_TEST_H_
     85