# 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) {
    _output_name = target_name
    if (defined(invoker.output_name)) {
      _output_name = invoker.output_name
    }
    _output_dir = root_out_dir
    if (defined(invoker.output_dir)) {
      _output_dir = invoker.output_dir
    }
    test_spec("${target_name}_spec") {
      target = ":${invoker.target_name}"
      path = "$_output_dir/$_output_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) {
    original_target_name = target_name
    forward_variables_from(invoker, "*")
    testonly = true

    if (is_linux || is_mac) {
      deps += [ ":${target_name}_spec" ]
    }

    if (is_fuchsia) {
      if (!defined(output_dir)) {
        output_dir = root_out_dir
      }
      if (!defined(output_name)) {
        output_name = target_name
      }
      if (!defined(output_extension)) {
        output_extension = ""
      }

      _output_name = output_name
      if (output_extension != "") {
        _output_name += ".$output_extension"
      }
      _output_file = rebase_path("$output_dir/$_output_name", root_build_dir)

      metadata = {
        # Used by the distribution_manifest template.
        distribution_entries = [
          {
            source = _output_file
            destination = "test/$_output_name"
            label =
                get_label_info(":$original_target_name", "label_with_toolchain")
          },
        ]
      }
    } else {
      not_needed([ "original_target_name" ])
    }
  }
}

set_defaults("test") {
  configs = default_executable_configs
}
