# 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/testing/test_spec.gni")
import("fuchsia_package.gni")

# Defines a Fuchsia package that contains one or more components, some of which
# implement one or more tests, and specifies how to run tests.
# See: https://fuchsia.dev/fuchsia-src/development/components/build
#
# Example:
# ```
# fuchsia_component("fonts-service") { ... }
# fuchsia_component("fonts-service-test") {
#   testonly = true
#   ...
# }
#
# fuchsia_test_package("fonts-service-test-package") {
#   test_components = [ ":fonts-service-test" ]
#   deps = [ ":fonts-service" ],
# }
#
# fuchsia_component("fonts-ui") { ... }
# fuchsia_component("fonts-ui-test") {
#   testonly = true
#   ...
# }
#
# fuchsia_test_package("fonts-ui-test-package") {
#   test_components = [ ":fonts-ui-test" ]
#   deps = [ ":fonts-ui" ],
#   test_specs = {
#     environments = [
#       astro_env,
#       sherlock_env,
#     ]
#   }
# }
# ```
#
# Parameters
#
#   test_components (required)
#     `fuchsia_component()` targets to include in the package and also register
#     as entry points for tests.
#     Additional non-test components can be included via `deps`.
#     Type: list(labels)
#
#   test_specs (optional)
#     Additional test specifications to apply to tests defined above.
#     See `test_spec.gni`.
#     Type: scope
#
#   package_name (optional)
#     The name of the package.
#     Type: string
#     Default: target_name
#
#   deps
#   visibility
template("fuchsia_test_package") {
  assert(
      defined(invoker.test_components) && invoker.test_components != [],
      "`test_components` must be specified when calling fuchsia_test_package($target_name)")

  package_name = target_name
  package_label = get_label_info(":$target_name", "label_with_toolchain")
  if (defined(invoker.package_name)) {
    package_name = invoker.package_name
  }
  test_specs = {
  }
  if (defined(invoker.test_specs)) {
    test_specs = invoker.test_specs
  }

  test_deps = []
  foreach(test, invoker.test_components) {
    test_target = "${target_name}_test_" + get_label_info(test, "name")
    manifest_name = get_target_outputs(test)
    manifest_name = get_path_info(manifest_name[0], "file")
    test_spec(test_target) {
      forward_variables_from(test_specs, "*")
      target = ":$target_name"
      package_label = package_label
      package_url =
          "fuchsia-pkg://fuchsia.com/$package_name#meta/$manifest_name"
    }
    test_deps += [ ":$test_target" ]
  }

  fuchsia_package(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "disable_elf_binaries_checks",
                             "visibility",
                           ])
    package_name = package_name
    if (!defined(deps)) {
      deps = []
    }
    deps += invoker.test_components
    deps += test_deps
    testonly = true
  }
}
