# 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")

# Defines a test that runs on a Fuchsia device.
# See: https://fuchsia.dev/fuchsia-src/development/components/build
#
# Invoking this template registers a component and a package such that running
# the test would involve pushing the package to a Fuchsia device, launching the
# component, and treating said component as a test.
#
# Example:
# ```
# fuchsia_test("my-test") {
#   package = ":my-package"
#   component = ":my-component"
# }
# ```
# The above can be tested with `fx test fuchsia-pkg://fuchsia.com/my-package#meta/my-component.cmx`.
#
# Parameters
#
#   package (required)
#     The `fuchsia_package()` that contains the test component.
#     Type: label
#
#   package_name (optional)
#     The name of the above (`package_name` argument if specified).
#     Type: string
#     Default: get_label_info(package, "name")
#
#   component (required)
#     The component that implements the test.
#
#   Additional `test_spec()` parameters will be forwarded.
template("fuchsia_test") {
  if (current_toolchain == default_toolchain) {
    assert(
        defined(invoker.package),
        "A `package` argument was missing when calling fuchsia_test($target_name)")
    assert(
        defined(invoker.component),
        "A `component` argument was missing when calling fuchsia_test($target_name)")

    package_name = get_label_info(invoker.package, "name")
    if (defined(invoker.package_name)) {
      package_name = invoker.package_name
    }

    manifest_name = get_target_outputs(invoker.component)
    manifest_name = get_path_info(manifest_name[0], "file")

    assert(
        get_path_info(manifest_name, "extension") == "cm",
        "`manifest_name` must end with '.cm'. Refer https://fxbug.dev/84888 for more information.")

    test_spec(target_name) {
      forward_variables_from(invoker, "*")
      target = get_label_info(invoker.package, "label_with_toolchain")

      build_rule = "fuchsia_test"

      package_out_dir = get_label_info(invoker.package, "target_out_dir")
      package_manifests =
          [ rebase_path("$package_out_dir/$package_name/package_manifest.json",
                        root_build_dir) ]

      package_url =
          "fuchsia-pkg://fuchsia.com/$package_name#meta/$manifest_name"
      if (!defined(deps)) {
        deps = []
      }
      deps += [ invoker.package ]
    }
  } else {
    group(target_name) {
      testonly = true
      deps = [ ":$target_name($default_toolchain)" ]
      forward_variables_from(invoker, [ "visibility" ])
    }
    not_needed(invoker, "*")
  }
}
