// 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_