blob: 136658f64dbf208434b209b2d827b87e1ea23b2e [file] [log] [blame]
# 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") {
testonly = true
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",
])
source_dir = _source_dir
infer_package_name = true
sources_required = false
}
# 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"),
]
}
}
# 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.
if (use_prebuilt_dart_sdk) {
_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" ]
} else {
_dart_binary = "$dart_sdk/bin/dart"
_sdk_deps = dart_sdk_deps
}
# 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}.packages"
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 = [
"--snapshot=$_rebased_snapshot",
"--snapshot-depfile=$_rebased_depfile",
"--packages=$_rebased_packages_path",
rebase_path(_grouped_main_file),
]
deps = _sdk_deps + [
":$_dart_library_target_name",
":$_test_grouping_target_name",
]
}
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) {
name = _main_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)) {
deps += invoker.deps
}
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",
]
}
}