# 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) {
    name = "$target_name"
    command = [
      "${invoker.runner}",
      "fuchsia-pkg://fuchsia.com/${package_name}#meta/${invoker.component_name}.cmx",
    ]

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