# Copyright 2018 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/package.gni")
import("//build/test/test_package.gni")

# A variant of package() that only contains test executables. The test
# executables are specified as the build products of the deps. A tests_package()
# is always testonly = true. The deps are expected to be executable()s.
#
# Additional parameters
#
#   environments (optional, default: [ { dimensions = { device_type = "QEMU" } } ])
#     [list of scopes] Device environments in which the tests should run. See
#     //build/package.gni for more details.
#
template("tests_package") {
  computed_tests = []
  foreach(dep, invoker.deps) {
    computed_tests += [
      {
        name = get_label_info(dep, "name")
        forward_variables_from(invoker,
                               [
                                 "environments",
                                 "log_settings",
                               ])
      },
    ]
  }

  package(target_name) {
    testonly = true

    forward_variables_from(invoker,
                           [
                             "deps",
                             "meta",
                             "resources",
                           ])
    tests = computed_tests
  }
}

# A variant of test_package() that only contains test executables. It computes
# the value of the 'tests' paremeter from 'deps'.
#
# This variant, as described in
# https://fuchsia.dev/fuchsia-src/development/tests/v1_test_component.md,
# requires a .cmx file for each test.
#
#
# Additional parameters
#
#   environments (optional, default: [ { dimensions = { device_type = "QEMU" } } ])
#     [list of scopes] Device environments in which the tests should run. See
#     //build/package.gni for more details.
#
template("hermetic_tests_package") {
  computed_tests = []
  foreach(dep, invoker.deps) {
    computed_tests += [
      {
        name = get_label_info(dep, "name")
        forward_variables_from(invoker,
                               [
                                 "environments",
                                 "log_settings",
                               ])
      },
    ]
  }

  test_package(target_name) {
    forward_variables_from(invoker,
                           [
                             "deprecated_shell",
                             "deps",
                             "meta",
                             "resources",
                           ])
    tests = computed_tests
  }
}
