|  | # Copyright 2020 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_component.gni") | 
|  | import("//build/dart/dart_library.gni") | 
|  | import("//build/flutter/internal/flutter_dart_component.gni") | 
|  |  | 
|  | # Defines a component which runs tests in the flutter/dart test harness | 
|  | # | 
|  | # Bundles a set of `package:test` tests into a single Fuchsia application | 
|  | # with generated helper code to invoke the tests appropriately. The resulting | 
|  | # application can take Dart test arguments; pass --help to see full options. | 
|  | # Some options (e.g. Dart test platform selectors) are not supported. | 
|  | # | 
|  | # Note: this target is intended to be called by the corresponding | 
|  | # flutter_test_component and dart_test_component instead of being called | 
|  | # directly. | 
|  | # | 
|  | # Parameters | 
|  | # | 
|  | #   manifest (required) | 
|  | #     The path to the component manifest | 
|  | #     Type: path | 
|  | # | 
|  | #   sources (required) | 
|  | #     The list of test sources. These sources must be within the test/ directory. | 
|  | #     Type: List of paths | 
|  | # | 
|  | #   language_version (optional) | 
|  | #     Specify the Dart language version to use for this test. | 
|  | #     Defaults to "2.8". | 
|  | # | 
|  | #   component_name (optional) | 
|  | #     The name of the component to test. | 
|  | #     Type: String | 
|  | #     Default: target_name | 
|  | # | 
|  | #   build_cfg (required) | 
|  | #    A description of how to build this component. This object needs | 
|  | #    to contain the following variables: | 
|  | #      runtime_meta: a path to the partial cmx file containing the runner | 
|  | #      platform_name: either 'dart_runner' or 'flutter_runner' | 
|  | #      is_aot: a boolean indicating if this is an AOT build | 
|  | #      is_product: a boolean indicating if this is a product build | 
|  | #      enable_asserts: whether we should enable asserts when compiling | 
|  | # | 
|  | #  deps | 
|  | #  visibility | 
|  | #  non_dart_deps | 
|  | template("flutter_dart_test_component") { | 
|  | assert(defined(invoker.sources), | 
|  | "flutter_dart_test_component() requires 'sources' be defined") | 
|  | assert(defined(invoker.manifest), | 
|  | "flutter_dart_test_component() requires 'manifest' be defined") | 
|  | assert(defined(invoker.build_cfg), | 
|  | "flutter_dart_test_component() requires 'build_cfg' be defined") | 
|  | _build_cfg = invoker.build_cfg | 
|  | assert(!_build_cfg.is_product, | 
|  | "flutter_dart_test_component() requires a non-product build_cfg") | 
|  |  | 
|  | _test_files = invoker.sources | 
|  |  | 
|  | _package_root = "." | 
|  | if (defined(invoker.package_root)) { | 
|  | _package_root = invoker.package_root | 
|  | } | 
|  |  | 
|  | _pubspec = "${_package_root}/pubspec.yaml" | 
|  | if (defined(invoker.pubspec)) { | 
|  | _pubspec = invoker.pubspec | 
|  | } | 
|  |  | 
|  | _options_file = "${_package_root}/analysis_options.yaml" | 
|  | if (defined(invoker.options_file)) { | 
|  | _options_file = invoker.options_file | 
|  | } | 
|  |  | 
|  | _test_package_name = string_replace(target_name, "-", "_") + "_test_package" | 
|  |  | 
|  | # Create a package containing all of the original test sources | 
|  | _test_package_target_name = "${target_name}_test_library" | 
|  | dart_library(_test_package_target_name) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "language_version", | 
|  | "deps", | 
|  | "non_dart_deps", | 
|  | ]) | 
|  |  | 
|  | testonly = true | 
|  | visibility = [ ":*" ] | 
|  |  | 
|  | sources = _test_files | 
|  | package_name = _test_package_name | 
|  |  | 
|  | package_root = "${_package_root}/test" | 
|  | source_dir = "." | 
|  | pubspec = _pubspec | 
|  | options_file = _options_file | 
|  | } | 
|  |  | 
|  | # Generate a main which will call all of the test targets | 
|  | _dart_gen_dir = get_label_info(":bogus($dart_toolchain)", "target_gen_dir") | 
|  |  | 
|  | _generate_test_main_target_name = target_name + "_test_main" | 
|  | _generated_test_package = "${_test_package_name}_generated" | 
|  | _generated_package_root = | 
|  | "${_dart_gen_dir}/${target_name}/${_generated_test_package}" | 
|  | _generated_test_main = "${_generated_package_root}/lib/main.dart" | 
|  |  | 
|  | action(_generate_test_main_target_name) { | 
|  | script = "//build/flutter/internal/gen_test_component_main.py" | 
|  | outputs = [ _generated_test_main ] | 
|  | sources = [] | 
|  |  | 
|  | args = [ | 
|  | "--out", | 
|  | rebase_path(_generated_test_main, root_build_dir), | 
|  | "--package", | 
|  | _test_package_name, | 
|  | ] | 
|  | foreach(_source, _test_files) { | 
|  | args += [ | 
|  | "--source", | 
|  | _source, | 
|  | ] | 
|  |  | 
|  | # The source needs to be added relative to the test/ directory since that | 
|  | # is where the build system expects the file to exist whereas the dart | 
|  | # compiler expects the source to be within the test directory since we are | 
|  | # using test/ as the package root. | 
|  | sources += [ "${_package_root}/test/${_source}" ] | 
|  | } | 
|  |  | 
|  | testonly = true | 
|  | visibility = [ ":*" ] | 
|  |  | 
|  | if (defined(invoker.non_dart_deps)) { | 
|  | deps = invoker.non_dart_deps | 
|  | } | 
|  | } | 
|  |  | 
|  | # Create a package containing the main | 
|  | _generated_package_target_name = "${target_name}_test_library_generated" | 
|  | dart_library(_generated_package_target_name) { | 
|  | forward_variables_from(invoker, [ "language_version" ]) | 
|  |  | 
|  | testonly = true | 
|  |  | 
|  | visibility = [ ":*" ] | 
|  |  | 
|  | sources = [ "main.dart" ] | 
|  | package_name = _generated_test_package | 
|  |  | 
|  | package_root = _generated_package_root | 
|  | pubspec = _pubspec | 
|  | options_file = _options_file | 
|  |  | 
|  | # speed up compilation times by skipping these checks | 
|  | disable_analysis = true | 
|  |  | 
|  | deps = [ | 
|  | ":$_test_package_target_name", | 
|  | "//topaz/lib/fuchsia_test_helper", | 
|  | ] | 
|  | non_dart_deps = [ ":$_generate_test_main_target_name($target_toolchain)" ] | 
|  | if (defined(invoker.non_dart_deps)) { | 
|  | non_dart_deps += invoker.non_dart_deps | 
|  | } | 
|  | } | 
|  |  | 
|  | _component_deps = [ | 
|  | ":$_generated_package_target_name", | 
|  | _build_cfg.runner_dep, | 
|  | ] | 
|  | if (defined(invoker.deps)) { | 
|  | _component_deps += invoker.deps | 
|  | } | 
|  |  | 
|  | flutter_dart_component(target_name) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "manifest", | 
|  | "visibility", | 
|  | "language_version", | 
|  | "component_name", | 
|  | "build_cfg", | 
|  | ]) | 
|  |  | 
|  | main_package = _generated_test_package | 
|  | main_dart = "main.dart" | 
|  |  | 
|  | testonly = true | 
|  |  | 
|  | deps = _component_deps | 
|  | } | 
|  | } |