# 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
      target = invoker.target_name
      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) {
    # TODO(3367): remove `test_group` once all ZN tests are using test packages
    # instead.
    forward_variables_from(invoker, "*", [ "test_group" ])
    # TODO(3367): 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 (!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)
    if (defined(invoker.test_group)) {
      _test_group = invoker.test_group
    } else {
      _test_group = "sys"
    }

    metadata = {
      migrated_manifest_lines = [
        "test/$_test_group/$_output_name=$_output_file",
      ]
    }
  }
}

set_defaults("test") {
  configs = default_executable_configs
}
