# Copyright 2019 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/packages/prebuilt_package.gni")
import("//build/testing/test_spec.gni")

# Describes a prebuilt package of tests.
#
# Parameters
#
#   archive (required)
#     [string] Path to archive containing a package.
#
#   package (optional)
#     [string] Name of the package.
#
#   component_name (required)
#     [string] Component name to test.
#
#   runner (required)
#     [string] The runner used to execute the test(run|run_test_component).
#
#   deps (optional)
#     [list of labels]: List of labels that the test depends on.
#
#   environments (optional, default: [ { dimensions = { device_type = "QEMU" } } ])
#     [list of scopes] Device environments in which the test should run.
#
#     Environment scope is defined in //build/testing/test_spec.gni
#
#   log_settings (optional)
#      [scope] passed through to test_spec. See //build/testing/test_spec.gni.
#
template("prebuilt_test_package") {
  assert(defined(invoker.archive), "archive must be defined.")
  assert(defined(invoker.component_name), "component_name must be defined.")

  package_name = target_name
  if (defined(invoker.package)) {
    package_name = invoker.package
  }

  spec_target_name = "${target_name}_${invoker.component_name}_spec"
  test_spec(spec_target_name) {
    target = get_label_info(":${invoker.target_name}", "label_with_toolchain")
    build_rule = "prebuilt_test_package"
    package_url = "fuchsia-pkg://fuchsia.com/${package_name}#meta/${invoker.component_name}"
    if (get_path_info(invoker.component_name, "extension") == "") {
      package_url = "${package_url}.cmx"
    }

    forward_variables_from(invoker,
                           [
                             "deps",
                             "environments",
                             "log_settings",
                           ])
  }

  prebuilt_package(target_name) {
    package_name = package_name
    testonly = true
    archive = invoker.archive
    deps = [ ":$spec_target_name" ]
  }
}
