# 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\"")
  }
  main_target_name = target_name
  spec_target_name = "${target_name}_${invoker.component_name}_spec"
  test_spec(spec_target_name) {
    name = main_target_name
    target = main_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
  }
}
