summaryrefslogtreecommitdiff
path: root/chromium/chrome/test/base/js2gtest.gni
blob: 44c99c75b2d1c79e98f4445368ed7b56a24dbe76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# Copyright 2015 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.

import("//v8/gni/v8.gni")
import("//v8/snapshot_toolchain.gni")

# Variables:
#   test_type: One of 'webui', 'unit' or 'extension' indicating what
#       environment the test runs under.
#   sources: List of javascript test source files.
#   deps_js: Javascript file with closure library dependencies.  Only needed
#       if the test fixtures use closureModuleDeps.
#   gen_include_files: List of javascript files used in GEN_INCLUDE calls
#       in the tests and therefore considered input to the C++ generation step.
#   extra_js_files: List of javascript files needed by the test at runtime,
#       typically listed in the extraLibraries member of the test fixture.
#   defines
#   deps
#   visibility
template("js2gtest") {
  assert(
      defined(invoker.test_type) &&
      (invoker.test_type == "webui" || invoker.test_type == "unit" ||
       invoker.test_type == "extension" || invoker.test_type == "mojo_webui"))
  action_name = target_name + "_action"
  source_set_name = target_name

  # The mapping from sources to the copied version.
  copied_source_pattern = "$root_out_dir/test_data/{{source_root_relative_dir}}/{{source_file_part}}"

  gen_source_pattern = "{{source_gen_dir}}/{{source_name_part}}-gen.cc"

  action_foreach(action_name) {
    testonly = true
    visibility = [ ":$source_set_name" ]
    script = "//tools/gypv8sh.py"

    sources = invoker.sources

    v8_shell_path = get_label_info("//v8:v8_shell($v8_snapshot_toolchain)",
                                   "root_out_dir") + "/v8_shell"
    if (host_os == "win") {
      v8_shell_path += ".exe"
    }

    input_js = [
      "//chrome/third_party/mock4js/mock4js.js",
      "//chrome/test/data/webui/test_api.js",
      "//chrome/test/base/js2gtest.js",
    ]
    inputs = [ v8_shell_path ] + input_js
    if (defined(invoker.deps_js)) {
      inputs += [ invoker.deps_js ]
    }
    if (defined(invoker.gen_include_files)) {
      inputs += invoker.gen_include_files
    }

    # Outputs. The script will copy the source files to the output directory,
    # which then must be treated as runtime data. The generated .cc file isn't
    # data, it will be compiled in a step below.
    outputs = [
      copied_source_pattern,
      gen_source_pattern,
    ]
    data = process_file_template(sources, [ copied_source_pattern ])

    args = []
    if (defined(invoker.deps_js)) {
      args += [
        "--deps_js",
        rebase_path(invoker.deps_js, root_build_dir),
      ]
    }
    args += [
      # Need "./" for script to find binary (cur dir is not on path).
      "./" + rebase_path(v8_shell_path, root_build_dir),
    ]
    args += rebase_path(input_js, root_build_dir) + [ invoker.test_type ]
    if (v8_use_external_startup_data) {
      args += [ "--external=y" ]
    } else {
      args += [ "--external=n" ]
    }
    args += [
      "{{source}}",
      "{{source_root_relative_dir}}/{{source_file_part}}",
      gen_source_pattern,
      rebase_path(copied_source_pattern, root_build_dir),
    ]

    deps = [
      "//v8:v8_shell($v8_snapshot_toolchain)",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }

  if (defined(invoker.extra_js_files)) {
    copy_target_name = target_name + "_copy"
    copy(copy_target_name) {
      visibility = [ ":$source_set_name" ]
      sources = invoker.extra_js_files
      outputs = [
        copied_source_pattern,
      ]
    }
  }

  source_set(source_set_name) {
    testonly = true
    forward_variables_from(invoker,
                           [
                             "defines",
                             "visibility",
                           ])
    sources = get_target_outputs(":$action_name")
    deps = [
      ":$action_name",

      # The generator implicitly makes includes from these targets.
      "//chrome/test:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//url",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    if (defined(invoker.extra_js_files)) {
      data_deps = [
        ":$copy_target_name",
      ]
    }
  }
}