# 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
#
#   test_runtime_shard (optional)
#     The path to the dart test shard.
#     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
#      runtime_meta_v2: a path to the partial cml 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

  _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
  }

  _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",
                             "null_safe",
                           ])

    testonly = true
    visibility = [ ":*" ]

    sources = _test_files
    package_name = _test_package_name

    package_root = "${_package_root}/test"
    source_dir = "."
    pubspec = _pubspec
    if (defined(invoker.options_file)) {
      options_file = invoker.options_file
    }

    # 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
  }

  # 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

    # speed up compilation times by skipping these checks
    disable_analysis = true

    deps = [
      ":$_test_package_target_name",
      "//src/flutter/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",
                             "test_runtime_shard",
                           ])

    main_package = _generated_test_package
    main_dart = "main.dart"

    testonly = true

    deps = _component_deps
  }
}
