# 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("//build_overrides/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"))
  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

    d8_path =
        get_label_info("//v8:d8($snapshot_toolchain)", "root_out_dir") + "/d8"
    if (is_win) {
      d8_path += ".exe"
    }

    input_js = [
      "//chrome/third_party/mock4js/mock4js.js",
      "//chrome/test/data/webui/test_api.js",
      "//chrome/test/base/js2gtest.js",
    ]
    inputs = [ d8_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(d8_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:d8($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",
      ]
    }
  }
}
