# 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(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 (!defined(output_dir)) {
      output_dir = root_out_dir
    }
    if (defined(output_name)) {
      _manifest_output_name = output_name
    } else {
      output_name = target_name
      _manifest_output_name = "$target_name-test"
    }
    if (!defined(output_extension)) {
      output_extension = ""
    }

    _output_name = output_name
    if (output_extension != "") {
      _output_name += ".$output_extension"
      _manifest_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/$_manifest_output_name=$_output_file" ]
    }
  }
}

set_defaults("test") {
  configs = default_executable_configs
}
