# Copyright 2016 the V8 project 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/config/sanitizers/sanitizers.gni")
import("//third_party/icu/config.gni")
import("v8.gni")

declare_args() {
  # Sets the test isolation mode (noop|prepare|check).
  v8_test_isolation_mode = "noop"
}

template("v8_isolate_run") {
  forward_variables_from(invoker,
                         "*",
                         [
                           "deps",
                           "isolate",
                         ])

  # Remember target name as within the action scope the target name will be
  # different.
  name = target_name

  assert(defined(invoker.deps))
  assert(defined(invoker.isolate))

  if (name != "" && v8_test_isolation_mode != "noop") {
    action(name + "_run") {
      testonly = true

      deps = invoker.deps

      script = "//tools/isolate_driver.py"

      sources = [
        invoker.isolate,
      ]

      inputs = [
        # Files that are known to be involved in this step.
        "//tools/swarming_client/isolate.py",
        "//tools/swarming_client/run_isolated.py",
      ]

      if (v8_test_isolation_mode == "prepare") {
        outputs = [
          "$root_out_dir/$name.isolated.gen.json",
        ]
      } else if (v8_test_isolation_mode == "check") {
        outputs = [
          "$root_out_dir/$name.isolated",
          "$root_out_dir/$name.isolated.state",
        ]
      }

      # Translate gn to gyp variables.
      if (v8_code_coverage) {
        coverage = "1"
      } else {
        coverage = "0"
      }
      if (is_asan) {
        asan = "1"
      } else {
        asan = "0"
      }
      if (is_msan) {
        msan = "1"
      } else {
        msan = "0"
      }
      if (is_tsan) {
        tsan = "1"
      } else {
        tsan = "0"
      }
      if (is_cfi) {
        cfi_vptr = "1"
      } else {
        cfi_vptr = "0"
      }
      if (target_cpu == "x86") {
        target_arch = "ia32"
      } else {
        target_arch = target_cpu
      }
      if (is_debug) {
        configuration_name = "Debug"
      } else {
        configuration_name = "Release"
      }
      if (is_component_build) {
        component = "shared_library"
      } else {
        component = "static_library"
      }
      if (icu_use_data_file) {
        icu_use_data_file_flag = "1"
      } else {
        icu_use_data_file_flag = "0"
      }
      if (v8_use_external_startup_data) {
        use_external_startup_data = "1"
      } else {
        use_external_startup_data = "0"
      }
      if (v8_use_snapshot) {
        use_snapshot = "true"
      } else {
        use_snapshot = "false"
      }
      if (v8_has_valgrind) {
        has_valgrind = "1"
      } else {
        has_valgrind = "0"
      }
      if (v8_gcmole) {
        gcmole = "1"
      } else {
        gcmole = "0"
      }

      # Note, all paths will be rebased in isolate_driver.py to be relative to
      # the isolate file.
      args = [
        v8_test_isolation_mode,
        "--isolated",
        rebase_path("$root_out_dir/$name.isolated", root_build_dir),
        "--isolate",
        rebase_path(invoker.isolate, root_build_dir),

        # Path variables are used to replace file paths when loading a .isolate
        # file
        "--path-variable",
        "DEPTH",
        rebase_path("//", root_build_dir),
        "--path-variable",
        "PRODUCT_DIR",
        rebase_path(root_out_dir, root_build_dir),

        # TODO(machenbach): Set variables for remaining features.
        "--config-variable",
        "CONFIGURATION_NAME=$configuration_name",
        "--config-variable",
        "OS=$target_os",
        "--config-variable",
        "asan=$asan",
        "--config-variable",
        "cfi_vptr=$cfi_vptr",
        "--config-variable",
        "gcmole=$gcmole",
        "--config-variable",
        "has_valgrind=$has_valgrind",
        "--config-variable",
        "icu_use_data_file_flag=$icu_use_data_file_flag",
        "--config-variable",
        "is_gn=1",
        "--config-variable",
        "msan=$msan",
        "--config-variable",
        "tsan=$tsan",
        "--config-variable",
        "coverage=$coverage",
        "--config-variable",
        "sanitizer_coverage=$sanitizer_coverage_flags",
        "--config-variable",
        "component=$component",
        "--config-variable",
        "target_arch=$target_arch",
        "--config-variable",
        "v8_use_external_startup_data=$use_external_startup_data",
        "--config-variable",
        "v8_use_snapshot=$use_snapshot",
      ]

      if (is_win) {
        args += [
          "--config-variable",
          "msvs_version=2017",
        ]
      } else {
        args += [
          "--config-variable",
          "msvs_version=0",
        ]
      }
    }
  }
}
