# 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/host_test.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") {
  assert(is_host || !defined(invoker.environments),
         "environments only supported for host tests")

  _exe_target_name = target_name

  _output_name = target_name
  if (defined(invoker.output_name)) {
    _output_name = invoker.output_name
  }
  if (is_host || is_fuchsia) {
    _output_dir = root_out_dir
    if (defined(invoker.output_dir)) {
      _output_dir = invoker.output_dir
    }
    _output_file = _output_name
    if (defined(invoker.output_extension)) {
      _output_extension = invoker.output_extension
    } else {
      if (is_win) {
        _output_extension = "exe"
      } else {
        _output_extension = ""
      }
    }
    if (_output_extension != "") {
      _output_file += "." + _output_extension
    }
  }

  if (is_host) {
    _exe_target_name = "${target_name}_executable"
    host_test(target_name) {
      binary_path = "${_output_dir}/${_output_file}"
      deps = [ ":${_exe_target_name}" ]
      if (defined(invoker.deps)) {
        deps += invoker.deps
      }
      if (defined(invoker.data_deps)) {
        deps += invoker.data_deps
      }
      if (defined(invoker.host_args)) {
        args = invoker.host_args
      }
      forward_variables_from(invoker,
                             [
                               "environments",
                               "visibility",
                             ])
    }
  }

  executable(_exe_target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "host_args",
                             "output_name",
                             "target_name",
                             "testonly",
                           ])

    # Normally defaults to target_name, but we don't want to use
    # _exe_target_name.
    output_name = _output_name
    testonly = true

    if (is_fuchsia) {
      metadata = {
        # Used by the distribution_manifest template.
        distribution_entries = [
          {
            source =
                rebase_path("${_output_dir}/${_output_file}", root_build_dir)
            destination = "test/${_output_file}"
            label =
                get_label_info(":${_exe_target_name}", "label_with_toolchain")
          },
        ]

        # Used by the fuchsia_test_component_manifest() template.
        test_component_manifest_program = [
          {
            program = {
              binary = "test/${_output_file}"
            }
          },
        ]
        test_component_manifest_program_barrier = []
      }
    }
  }
}

set_defaults("test") {
  configs = default_executable_configs
}
