blob: 1503c59d2838427707b273fcb81d11704938bada [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/test_spec.gni")
import("//topaz/runtime/dart/dart_kernel.gni")
# Defines a flutter test suite
#
# Parameters
#
# sources (required)
# The list of test files, which must be within source_dir.
#
# source_dir (optional)
# Directory containing the test sources. Defaults to "test".
# Note: this cannot be set to ".".
#
# deps (optional)
# List of labels for Dart libraries this suite depends on.
#
# disable_analysis (optional)
# Prevents analysis from being run on this target.
#
# Example of usage:
#
# flutter_test("baz_test") {
# deps = [
# "//foo/baz",
# "//third_party/dart-pkg/pub/test",
# ]
# }
if (current_toolchain == dart_toolchain) {
template("flutter_test") {
assert(defined(invoker.sources),
"flutter_test() requires 'sources' be defined")
if (defined(invoker.source_dir)) {
assert(invoker.source_dir != ".",
"Cannot set source_dir to '.' because it breaks code coverage.")
}
_main_target_name = target_name
_library_target_name = "${target_name}_library"
_copy_target_name = "${target_name}_copy"
_snapshot_target_name = "${target_name}_snapshot"
_source_dir = "test"
if (defined(invoker.source_dir)) {
_source_dir = invoker.source_dir
}
dart_library(_library_target_name) {
forward_variables_from(invoker,
[
"deps",
"disable_analysis",
])
infer_package_name = true
sources_required = false
source_dir = _source_dir
sources = invoker.sources
}
_dot_packages_file = "$target_gen_dir/$_library_target_name.packages"
_flutter_shell_label =
"//third_party/flutter/shell/testing/($host_toolchain)"
_flutter_shell_out_dir =
get_label_info(_flutter_shell_label, "root_out_dir")
_flutter_shell_bin = "$_flutter_shell_out_dir/flutter_tester"
_precompiled_kernel_target_names = []
_tests_json = []
_tests_filename = "$target_gen_dir/tests.json"
_test_runtime_deps = [ _tests_filename ]
foreach(_source_file, invoker.sources) {
_source_path = "$_source_dir/$_source_file"
_test_target =
exec_script("//topaz/runtime/dart/gen_flutter_test_target_name.py",
[
"--file",
_source_file,
],
"trim string")
if (_test_target != "") {
_test_target_name = "${_main_target_name}_${_test_target}"
_kernel_target_name = "${_test_target_name}_dill"
_bootstrap_target_name = "${_test_target_name}_bootstrap"
_bootstrap_filename = "${target_gen_dir}/${_bootstrap_target_name}.dart"
_dill_filename = "$target_gen_dir/${_kernel_target_name}_kernel.dil"
action(_bootstrap_target_name) {
script = "$root_out_dir/dart-tools/build_test_bootstrap"
outputs = [
_bootstrap_filename,
]
rebased_source = rebase_path(_source_path, target_gen_dir)
args = [
"--output",
rebase_path(_bootstrap_filename),
"--test-name",
"$rebased_source",
]
deps = [
"//topaz/runtime/dart:build_test_bootstrap",
]
}
dart_kernel(_kernel_target_name) {
platform_name = "flutter_runner"
disable_analysis = true
main_dart = _bootstrap_filename
args = []
product = false
aot = false
# TODO(tvolkert): Change to flutter platform once libraries.json works
# in Fuchsia
# platform_deps = [
# "//third_party/flutter/lib/snapshot:strong_platform",
# ]
# platform_path = "$root_out_dir/flutter_patched_sdk"
platform_deps =
[ "//topaz/runtime/flutter_runner/kernel:kernel_platform_files" ]
platform_path = "$root_out_dir/flutter_runner_patched_sdk"
sources = [
_bootstrap_filename,
]
sources_required = false
non_dart_deps = [ ":$_bootstrap_target_name" ]
deps = [
":$_library_target_name",
"//third_party/dart-pkg/git/flutter/packages/flutter_test",
"//third_party/dart-pkg/pub/stream_channel",
"//third_party/dart-pkg/pub/test",
]
}
_precompiled_kernel_target_names += [ ":${_kernel_target_name}_kernel" ]
_tests_json += [
{
source = rebase_path(_bootstrap_filename, root_build_dir)
dill = rebase_path(_dill_filename, root_build_dir)
},
]
_test_runtime_deps += [
_bootstrap_filename,
_dill_filename,
]
}
write_file(_tests_filename, _tests_json, "json")
}
# Copies resources to the build directory so that it may be archived
# with the test and the rest of the test's dependencies, so that the
# archiving happens with respect to the build directory.
_data_dir = "$target_gen_dir/${_main_target_name}_data"
_icudtl_file = "$_data_dir/icudtl.dat"
_dart_binary = "$_data_dir/dart"
copy(_copy_target_name) {
sources = [
"//third_party/icu/common/icudtl.dat",
"//topaz/tools/prebuilt-dart-sdk/$host_os-$host_cpu/bin/dart",
]
outputs = [
"$_data_dir/{{source_file_part}}",
]
}
# Creates a snapshot file of the fuchsia tester, which allows the test to
# be invoked hermetically.
_snapshot = "$target_gen_dir/${_main_target_name}.snapshot"
_flutter_tools_label = "//third_party/dart-pkg/git/flutter/packages/flutter_tools:flutter_tools"
_dart_flutter_tools_gen_dir =
get_label_info("$_flutter_tools_label($dart_toolchain)",
"target_gen_dir")
_packages_path =
"$_dart_flutter_tools_gen_dir/flutter_tools.packages"
_main_file = "//third_party/dart-pkg/git/flutter/packages/flutter_tools/bin/fuchsia_tester.dart"
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(_main_file),
]
deps = dart_sdk_deps + [
"$_flutter_tools_label",
":$_copy_target_name",
]
}
_invocation_file = "$target_gen_dir/$target_name"
# _invocation_params encapsulates the parameters to pass to the
# invocation-generating action below. The utility lies in being able to
# construct the actions args and metadata at the same time.
_invocation_params = [
{
flag = "--wd"
# TODO(crbug.com/gn/56): Rebasing root_build_dir alone yields a path
# component that leaves root_build_dir, preventing portability.
path = "$root_build_dir/dummy/.."
base = get_path_info(_invocation_file, "dir")
},
{
flag = "--out"
path = _invocation_file
base = "" # Will result in an absolute path.
},
{
flag = "--dart"
path = _dart_binary
base = root_build_dir
},
{
flag = "--snapshot"
path = _snapshot
base = root_build_dir
},
{
flag = "--tests"
path = _tests_filename
base = root_build_dir
},
{
flag = "--dot-packages"
path = _dot_packages_file
base = root_build_dir
},
{
flag = "--flutter-shell"
path = _flutter_shell_bin
base = root_build_dir
},
{
flag = "--icudtl"
path = _icudtl_file
base = root_build_dir
},
{
flag = "--sdk-root"
path = "$root_out_dir/flutter_runner_patched_sdk"
base = root_build_dir
},
]
action(_main_target_name) {
script = "//topaz/runtime/dart/gen_flutter_test_invocation.py"
testonly = true
outputs = [
_invocation_file,
]
inputs = [
_dot_packages_file,
_bootstrap_filename,
_flutter_shell_bin,
_tests_filename,
]
args = []
foreach(param, _invocation_params) {
args += [
param.flag,
rebase_path(param.path, param.base),
]
if (param.flag != "--wd") {
_test_runtime_deps += [ param.path ]
}
}
deps = [
":$_library_target_name",
":$_bootstrap_target_name",
":${_kernel_target_name}_kernel",
":$_snapshot_target_name",
":$_copy_target_name",
_flutter_shell_label,
] + _precompiled_kernel_target_names
metadata = {
test_runtime_deps = _test_runtime_deps
}
}
}
} else {
# Not the Dart toolchain.
template("flutter_test") {
_main_target_name = target_name
_spec_target_name = "${target_name}_spec"
_invocation_file = "$target_gen_dir/$target_name"
if (is_linux || is_mac) {
# TODO(IN-819): Delete renaming when dart tests are no longer run out of
# $root_build_dir/host_tests/.
_invocation_file = "$root_out_dir/$target_name"
test_spec(_spec_target_name) {
testonly = true
name = _main_target_name
location = _invocation_file
deps = [
":$_main_target_name($dart_toolchain)",
]
}
} else {
not_needed([ "_spec_target_name" ])
}
action(_main_target_name) {
script = "//topaz/runtime/dart/gen_flutter_test_bundle_invocation.py"
testonly = true
not_needed(invoker, "*")
outputs = [
_invocation_file,
]
_dart_target_gen_dir =
get_label_info(":bogus($dart_toolchain)", "target_gen_dir")
_delegate_file = "$_dart_target_gen_dir/$_main_target_name"
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_file, "dir")),
"--out",
rebase_path(_invocation_file),
"--test",
rebase_path(_delegate_file, root_build_dir),
]
deps = [
":$_main_target_name($dart_toolchain)",
]
if (is_linux || is_mac) {
# TODO(IN-819): Temporary measure to support the fx workflow, which is to
# take a dependency on tests.json, to which this metadata will be
# supplementary. Once flutter tests are contributing test spec metadata,
# all relevant information will be in the former and this is to be
# deleted.
metadata = {
pseudo_test_spec = [
{
test = {
location = rebase_path(_invocation_file, root_build_dir)
os = current_os
}
},
]
}
deps += [ ":$_spec_target_name" ]
}
}
}
}