# 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
}
