| Index: testing/multiprocess_func_list.h
|
| diff --git a/testing/multiprocess_func_list.h b/testing/multiprocess_func_list.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2ec4d7d9759d92a3032c282e844154824a81f990
|
| --- /dev/null
|
| +++ b/testing/multiprocess_func_list.h
|
| @@ -0,0 +1,72 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef TESTING_MULTIPROCESS_FUNC_LIST_H_
|
| +#define TESTING_MULTIPROCESS_FUNC_LIST_H_
|
| +
|
| +#include <string>
|
| +
|
| +// This file provides the plumbing to register functions to be executed
|
| +// as the main function of a child process in a multi-process test.
|
| +// This complements the MultiProcessTest class which provides facilities
|
| +// for launching such tests.
|
| +//
|
| +// The MULTIPROCESS_TEST_MAIN() macro registers a string -> func_ptr mapping
|
| +// by creating a new global instance of the AppendMultiProcessTest() class
|
| +// this means that by the time that we reach our main() function the mapping
|
| +// is already in place.
|
| +//
|
| +// Example usage:
|
| +// MULTIPROCESS_TEST_MAIN(a_test_func) {
|
| +// // Code here runs in a child process.
|
| +// return 0;
|
| +// }
|
| +//
|
| +// The prototype of a_test_func is implicitly
|
| +// int test_main_func_name();
|
| +
|
| +namespace multi_process_function_list {
|
| +
|
| +// Type for child process main functions.
|
| +typedef int (*TestMainFunctionPtr)();
|
| +
|
| +// Type for child setup functions.
|
| +typedef void (*SetupFunctionPtr)();
|
| +
|
| +// Helper class to append a test function to the global mapping.
|
| +// Used by the MULTIPROCESS_TEST_MAIN macro.
|
| +class AppendMultiProcessTest {
|
| + public:
|
| + // |main_func_ptr| is the main function that is run in the child process.
|
| + // |setup_func_ptr| is a function run when the global mapping is added.
|
| + AppendMultiProcessTest(std::string test_name,
|
| + TestMainFunctionPtr main_func_ptr,
|
| + SetupFunctionPtr setup_func_ptr);
|
| +};
|
| +
|
| +// Invoke the main function of a test previously registered with
|
| +// MULTIPROCESS_TEST_MAIN()
|
| +int InvokeChildProcessTest(std::string test_name);
|
| +
|
| +// This macro creates a global MultiProcessTest::AppendMultiProcessTest object
|
| +// whose constructor does the work of adding the global mapping.
|
| +#define MULTIPROCESS_TEST_MAIN(test_main) \
|
| + MULTIPROCESS_TEST_MAIN_WITH_SETUP(test_main, NULL)
|
| +
|
| +// Same as above but lets callers specify a setup method that is run in the
|
| +// child process, just before the main function is run. This facilitates
|
| +// adding a generic one-time setup function for multiple tests.
|
| +#define MULTIPROCESS_TEST_MAIN_WITH_SETUP(test_main, test_setup) \
|
| + int test_main(); \
|
| + namespace { \
|
| + multi_process_function_list::AppendMultiProcessTest \
|
| + AddMultiProcessTest##_##test_main(#test_main, \
|
| + (test_main), \
|
| + (test_setup)); \
|
| + } \
|
| + int test_main()
|
| +
|
| +} // namespace multi_process_function_list
|
| +
|
| +#endif // TESTING_MULTIPROCESS_FUNC_LIST_H_
|
|
|