# 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).
#
#   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
#
#   deps (optional)
#     [list of labels]: List of labels that the test depends on.
#
template("prebuilt_test_package") {
  assert(defined(invoker.archive), "archive must be defined.")
  assert(defined(invoker.component_name), "component_name must be defined.")
  assert(defined(invoker.runner), "runner must be defined.")

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

  if (invoker.runner == "run") {
    package_deps += [ "//garnet/packages/prod:run" ]
  } else if (invoker.runner == "run_test_component") {
    package_deps += [ "//garnet/packages/testing:run_test_component" ]
  } else {
    assert(
        false,
        "unexpected runner \"${invoker.runner}; must be one of \"run\" or \"run_test_component\"")
  }
  spec_target_name = "${target_name}_${invoker.component_name}_spec"
  test_spec(spec_target_name) {
    target = ":${invoker.target_name}"
    package_url = "fuchsia-pkg://fuchsia.com/${package_name}#meta/${invoker.component_name}.cmx"
    command = [
      "${invoker.runner}",
      package_url,
    ]

    forward_variables_from(invoker,
                           [
                             "deps",
                             "environments",
                           ])
  }
  package_deps += [ ":$spec_target_name" ]

  prebuilt_package(target_name) {
    package_name = package_name
    testonly = true
    archive = invoker.archive
    deps = package_deps
  }
}
