# 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/testing/test_spec.gni")

# This declares a test executable.
#
# The parameters are precisely those of an `executable`, along with
#
# environments
#   Optional: What environments this test should target. Only used here for
#     linux and mac tests, with a default value of a general linux/mac
#     environment (as a function of $current_os).
#     See //build/testing/test_spec.gni for more details.
#
template("test") {
  if (is_linux || is_mac) {
    test_spec("${target_name}_spec") {
      testonly = true
      name = invoker.target_name
      install_path = "$root_out_dir/${invoker.target_name}"
      deps = []
      if (defined(invoker.deps)) {
        deps += invoker.deps
      }
      if (defined(invoker.data_deps)) {
        deps += invoker.data_deps
      }
      forward_variables_from(invoker, [ "environments" ])
    }
  } else {
    if (defined(invoker.environments)) {
      not_needed(invoker, [ "environments" ])
    }
  }

  executable(target_name) {
    forward_variables_from(invoker, "*")
    testonly = true
    if (is_linux || is_mac) {
      deps += [ ":${target_name}_spec" ]
    }
  }
}

set_defaults("test") {
  configs = default_executable_configs
}
