# 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")
import("fuchsia_test_component.gni")
import("fuchsia_test_component_manifest.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
#
#   wrap_cmx_test_with_cml_test (optional)
#     If enabled, test_components that are legacy (v1) tests with cmx manifests
#     will be wrapped with a modern (v2) test with a cml manifest. The launch
#     URL of the wrapper will be derived from the wrapped test's launch URL.
#     For instance:
#       fuchsia-pkg://fuchsia.com/package#meta/test_component.cmx
#     will become:
#       fuchsia-pkg://fuchsia.com/package#meta/test_component.cm
#     Type: bool
#     Default: true
#
#   data_deps
#   deps
#   visibility
template("fuchsia_test_package") {
  if (current_toolchain == default_toolchain) {
    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")
    package_manifest =
        rebase_path("$target_out_dir/$target_name/package_manifest.json",
                    root_build_dir)
    if (defined(invoker.package_name)) {
      package_name = invoker.package_name
    }
    test_specs = {
    }
    if (defined(invoker.test_specs)) {
      test_specs = invoker.test_specs
    }

    wrap_cmx_test_with_cml_test = true
    if (defined(invoker.wrap_cmx_test_with_cml_test)) {
      wrap_cmx_test_with_cml_test = invoker.wrap_cmx_test_with_cml_test
    }

    test_deps = []
    foreach(test, invoker.test_components) {
      test_target_name = get_label_info(test, "name")
      test_target = "${target_name}_test_" + test_target_name
      manifest_name = get_target_outputs(test)
      manifest_name = get_path_info(manifest_name[0], "file")

      _wrapped_legacy_test = false
      if (wrap_cmx_test_with_cml_test &&
          get_path_info(manifest_name, "extension") == "cmx") {
        _wrapped_legacy_test = true
        modern_generated_name =
            "${target_name}_${test_target_name}_modern_generated"
        generated_manifest_target = "${modern_generated_name}_manifest"
        fuchsia_test_component_manifest(generated_manifest_target) {
          metadata = {
            test_component_manifest_program = [
              {
                program = {
                  legacy_manifest = "meta/$manifest_name"
                }
              },
            ]
            test_component_manifest_cml = [
              {
                include =
                    [ "//src/sys/test_runners/legacy_test/default.shard.cml" ]
              },
            ]
          }
          visibility = [ ":*" ]
        }

        manifest = get_target_outputs(":$generated_manifest_target")
        manifest = manifest[0]

        name = get_path_info(manifest_name, "name")

        fuchsia_test_component("$modern_generated_name") {
          component_name = name
          manifest = manifest
          visibility = [ ":*" ]
          manifest_deps = [ ":$generated_manifest_target" ]
        }

        manifest_name = get_target_outputs(":$modern_generated_name")
        manifest_name = get_path_info(manifest_name[0], "file")

        test_deps += [ ":$modern_generated_name" ]
      }

      test_spec(test_target) {
        forward_variables_from(test_specs, "*")
        if (!defined(build_rule)) {
          build_rule = "fuchsia_test_package"
        }
        target = get_label_info(":$target_name", "label_with_toolchain")
        wrapped_legacy_test = _wrapped_legacy_test
        package_label = package_label
        package_manifests = [ package_manifest ]
        package_url =
            "fuchsia-pkg://fuchsia.com/$package_name#meta/$manifest_name"
      }
      test_deps += [ ":$test_target" ]
    }

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

      # test packages won't be configured by assembly tools, so we can check their config earlier
      validate_structured_config = true
    }
  } else {
    group(target_name) {
      testonly = true
      forward_variables_from(invoker, [ "visibility" ])
      deps = [ "$target_name($default_toolchain)" ]
    }
    not_needed(invoker, "*")
  }
}
