# Copyright 2019 The Fuchsia 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/dart/dart_library.gni")
import("//build/dart/toolchain.gni")
import("//build/testing/host_test_data.gni")
import("//build/testing/test_spec.gni")

# Defines a Dart test suite.
#
# Parameters
#
#   sources
#     Required: The list of public dart sources files defining the test.
#       NOTE: this template assumes that all test entrypoints are defined by
#       files with a suffix of "_test.dart".
#
#   source_dir
#     Optional: The directory of test sources files. Defaults to "test".
#
#   deps
#     Optional: Dart dependencies of the test.
#
#   non_dart_deps
#     Optional: List of labels this package depends on that are not Dart
#       packages.
#
#   environments
#     Optional: What environments this test should target. Only used here for
#       linux and mac tests, with a default value of a general linux/mac
#       environment (as a function of $current_os).
#       See //build/testing/test_spec.gni for more details.
#
#   args
#     Optional: Command-line arguments to pass to the Dart application. These
#       arguments are inserted ahead of any arguments given to the invocation,
#       like the program/args entry in a component manifest.
#
template("dart_test") {
  assert(defined(invoker.sources), "dart_test() must specify sources")

  _main_target_name = target_name
  _dart_library_target_name = "${target_name}_dart_library"
  _test_grouping_target_name = "${target_name}_test_grouping"
  _snapshot_target_name = "${target_name}_snapshot"
  _spec_target_name = "${target_name}_spec"

  if (is_host) {
    _test_data_target_name = "${target_name}_test_data"
  }

  if (defined(invoker.source_dir)) {
    _source_dir = invoker.source_dir
  } else {
    _source_dir = "test"
  }

  dart_library(_dart_library_target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "sources",
                             "hermetic_deps",
                           ])

    # We want to mimic the package_root being in place of the source_dir. Dart
    # does not allow multiple packages to share the same package_root so we
    # do this so our /test directories can live along side out /lib directories
    # which is how most dart packages are structured in out tree.
    package_root = rebase_path(_source_dir, ".")
    source_dir = "."

    # We include the pubspec and analysis options files which are at the
    # original package root since we are effectively changing the package_root
    # for this library.
    pubspec = "pubspec.yaml"

    if (!defined(disable_analysis) ||
        (defined(disable_analysis) && !disable_analysis)) {
      # analysis is not disabled so include the options file
      options_file = "analysis_options.yaml"
    }

    infer_package_name = true
    testonly = true

    # TODO(fxbug.dev/71902): replace the enclosing dart_library with an analysis
    # target when they are decoupled.
    #
    # Skip source verification because the purpose of this target is to run
    # analysis only. `dart_library` expects all sources under `source_dir` to be
    # included in `sources`, and this doesn't apply to `dart_test` because it is
    # valid to have multiple test files for different tests in the same dir.
    disable_source_verification = true
  }

  # Create a single, grouped test file, as snapshot files correspond to a single
  # entrypoint.
  _grouped_main_file = "$target_gen_dir/${_main_target_name}_grouped.dart"

  action(_test_grouping_target_name) {
    script = "//build/dart/group_tests.py"
    outputs = [ _grouped_main_file ]
    args = [
      "--out",
      rebase_path(_grouped_main_file),
    ]
    foreach(src, invoker.sources) {
      args += [
        "--source",
        rebase_path("$_source_dir/$src"),
      ]
    }
    testonly = true
  }

  # When using the prebuilt, we copy the dart binary into the build directory
  # so that it can be used without the prebuilt directory in the source tree.

  _dart_binary = "$target_gen_dir/$_main_target_name/dart"

  _copy_target_name = "${target_name}_copy"
  copy(_copy_target_name) {
    sources = [ "$dart_sdk/bin/dart" ]
    outputs = [ _dart_binary ]
    deps = dart_sdk_deps
  }
  _sdk_deps = [ ":$_copy_target_name" ]

  # Creates a snapshot file, which allows the test to be invoked hermetically.
  _snapshot = "$target_gen_dir/${target_name}.snapshot"
  _dart_target_gen_dir =
      get_label_info(":anything($dart_toolchain)", "target_gen_dir")
  _packages_path =
      "$_dart_target_gen_dir/${_dart_library_target_name}_package_config.json"

  action(_snapshot_target_name) {
    depfile = "${_snapshot}.d"

    outputs = [ _snapshot ]

    script = _dart_binary

    # The snapshot path needs to be rebased on top of the root build dir so
    # that the resulting depfile gets properly formatted.
    _rebased_snapshot = rebase_path(_snapshot, root_build_dir)
    _rebased_depfile = rebase_path(depfile)
    _rebased_packages_path = rebase_path(_packages_path)

    args = [
      "--verbosity=warning",
      "--snapshot=$_rebased_snapshot",
      "--snapshot-depfile=$_rebased_depfile",
      "--packages=$_rebased_packages_path",
      "--no-sound-null-safety",
      rebase_path(_grouped_main_file),
    ]

    deps = _sdk_deps + [
             ":$_dart_library_target_name",
             ":$_test_grouping_target_name",
           ]
    testonly = true
  }

  if (is_host) {
    host_test_data(_test_data_target_name) {
      sources = [
        _dart_binary,
        _snapshot,
      ]
      deps = [
        ":$_copy_target_name",
        ":$_snapshot_target_name",
      ]
    }
  }

  _invocation = "$root_out_dir/$_main_target_name"
  test_spec(_spec_target_name) {
    target = ":$_main_target_name"
    path = _invocation

    forward_variables_from(invoker, [ "environments" ])

    deps = [ ":$_snapshot_target_name" ]
    if (is_host) {
      deps += [ ":$_test_data_target_name" ]
    }

    if (defined(invoker.deps)) {
      foreach(dep, invoker.deps) {
        deps +=
            [ get_label_info(dep, "label_no_toolchain") + "($dart_toolchain)" ]
      }
    }
    if (defined(invoker.non_dart_deps)) {
      deps += invoker.non_dart_deps
    }
  }

  # Creates a convenience script to invoke the test.
  action(_main_target_name) {
    script = "//build/dart/gen_dart_test_invocation.py"

    inputs = [ _snapshot ]
    outputs = [ _invocation ]

    args = [
      "--wd",

      # TODO(crbug.com/gn/56): Rebasing root_build_dir alone yields a path
      # component that leaves root_build_dir, preventing portability.
      rebase_path("$root_build_dir/dummy/..",
                  get_path_info(_invocation, "dir")),
      "--out",
      rebase_path(_invocation),
      "--dart",
      rebase_path(_dart_binary, root_build_dir),
      "--snapshot",
      rebase_path(_snapshot, root_build_dir),
    ]

    # TODO(joshuaseaton): use test_spec's `command` field when fx supports
    # running tests out of $root_build_dir/tests.json.
    # CL to back out: https://fuchsia-review.googlesource.com/269458
    if (defined(invoker.args) && invoker.args != []) {
      argstr = ""
      foreach(arg, invoker.args) {
        argstr += "\"" + arg + "\" "
      }

      args += [
        "--args",
        argstr,
      ]
    }

    deps = _sdk_deps + [
             ":$_snapshot_target_name",
             ":$_spec_target_name",
           ]
    testonly = true
  }
}
