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