# 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")
        if (defined(invoker.environments)) {
          environments = invoker.environments
        }
      },
    ]
  }

  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.googlesource.com/fuchsia/+/master/docs/development/tests/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")
        if (defined(invoker.environments)) {
          environments = invoker.environments
        }
      },
    ]
  }

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