# 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 (is_ubsan_vptr) {
        ubsan_vptr = "1"
      } else {
        ubsan_vptr = "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",
        "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",
        "ubsan_vptr=$ubsan_vptr",
        "--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",
        ]
      }
    }
  }
}
