# 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("//src/sys/build/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",
                             "visibility",
                           ])
    package_name = package_name
    if (!defined(deps)) {
      deps = []
    }
    deps += invoker.test_components
    deps += test_deps
    testonly = true
  }
}
