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#include "multiprocess_func_list.h"
6
7#include <map>
8
9// Helper functions to maintain mapping of "test name"->test func.
10// The information is accessed via a global map.
11namespace multi_process_function_list {
12
13namespace {
14
15struct ProcessFunctions {
16  ProcessFunctions() : main(NULL), setup(NULL) {}
17  ProcessFunctions(TestMainFunctionPtr main, SetupFunctionPtr setup)
18      : main(main),
19        setup(setup) {
20  }
21  TestMainFunctionPtr main;
22  SetupFunctionPtr setup;
23};
24
25typedef std::map<std::string, ProcessFunctions> MultiProcessTestMap;
26
27// Retrieve a reference to the global 'func name' -> func ptr map.
28MultiProcessTestMap& GetMultiprocessFuncMap() {
29  static MultiProcessTestMap test_name_to_func_ptr_map;
30  return test_name_to_func_ptr_map;
31}
32
33}  // namespace
34
35AppendMultiProcessTest::AppendMultiProcessTest(
36    std::string test_name,
37    TestMainFunctionPtr main_func_ptr,
38    SetupFunctionPtr setup_func_ptr) {
39  GetMultiprocessFuncMap()[test_name] =
40      ProcessFunctions(main_func_ptr, setup_func_ptr);
41}
42
43int InvokeChildProcessTest(std::string test_name) {
44  MultiProcessTestMap& func_lookup_table = GetMultiprocessFuncMap();
45  MultiProcessTestMap::iterator it = func_lookup_table.find(test_name);
46  if (it != func_lookup_table.end()) {
47    const ProcessFunctions& process_functions = it->second;
48    if (process_functions.setup)
49      (*process_functions.setup)();
50    if (process_functions.main)
51      return (*process_functions.main)();
52  }
53
54  return -1;
55}
56
57}  // namespace multi_process_function_list
58