# 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, "*", [ "test_group" ])

    # TODO(53965): remove references to this attribute.
    not_needed(invoker, [ "test_group" ])

    # TODO(44278): always force `testonly` once all ZN tests are moved to
    # packages.
    if (!defined(testonly)) {
      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
}
