# 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_test_package.gni")

# Defines prebuilt package tests based on the contents in a prebuilt test manifest.
#
# Vendors are required to upload a "test_manifest.json" file in the same CIPD
# package as their prebuilt FAR tests. We use this manifest for determining
# which test packages to enable and how each test package is run.
#
# Parameters
#
#   archive_dir (required)
#     [string] Path to directory containing prebuilt archives and test_manifest.json
#
#   package_name_prefix (optional)
#     [string] Vendor specific prefix to add to pacakge (for avoiding GN target collision)
#
#   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
#
template("prebuilt_test_manifest") {
  assert(defined(invoker.archive_dir), "archive_dir must be defined.")

  package_name_prefix = target_name
  if (defined(invoker.package_name_prefix)) {
    package_name_prefix = invoker.package_name_prefix
  }

  manifest_path = "${invoker.archive_dir}/test_manifest.json"
  manifest = read_file(manifest_path, "json")
  test_targets = []
  foreach(test, manifest) {
    prefixed_test_package = "${package_name_prefix}_${test.package}"
    test_package = test.package
    component_name = test.component_name
    runner = "run"
    if (defined(test.runner)) {
      runner = test.runner
    }
    prebuilt_test_package(prefixed_test_package) {
      archive = "${invoker.archive_dir}/${test_package}.far"
      component_name = component_name
      runner = runner
      forward_variables_from(invoker, [ "environments" ])
    }
    test_targets += [ ":${prefixed_test_package}" ]
  }

  group(target_name) {
    testonly = true
    forward_variables_from(invoker, [ "visibility" ])
    public_deps = test_targets
  }
}
