# Copyright 2017 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.

# A template for an action that creates a Fuchsia Go test binary.

import("//build/go/go_build.gni")
import("//build/testing/test_spec.gni")

# Parameters: same as go_build, along with
#
#   gopackages
#     Required: The go packages containing the tests to be run.
#     Type: list of strings.
#
#   args
#     Optional: additional arguments needed when invoking the test.
#     Type: list of strings.
#
#   disabled
#     Optional: whether the test is disabled.
#     Type: bool
#     Default: false
#
#   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.
#
#   timeout:
#     Optional: override default timeout. Values must be valid Go durations,
#     such as "300ms", "-1.5h" or "2h45m".
#     See https://golang.org/cmd/go/#hdr-Testing_flags for details on timeout.
#     See https://golang.org/pkg/time/#ParseDuration for duration format.
template("go_test") {
  _main_target_name = target_name
  _test_spec_target_name = "${target_name}_spec"

  _output_name = target_name
  if (defined(invoker.output_name)) {
    _output_name = invoker.output_name
  }
  _output_path = "${root_out_dir}/${_output_name}"

  _is_disabled = defined(invoker.disabled) && invoker.disabled

  # We only include test metadata for non-disabled, linux/mac tests; metadata
  # for fuchsia tests is aggregated in the package template.
  _include_test_metadata = !_is_disabled && (is_linux || is_mac)
  if (_include_test_metadata) {
    test_spec(_test_spec_target_name) {
      # TODO(BLD-493): testonly should be automatic here
      testonly = true
      name = _main_target_name
      location = _output_path
      command = [ rebase_path(_output_path, root_build_dir) ]
      timeout = "5m"
      if (defined(invoker.timeout)) {
        timeout = invoker.timeout
      }
      command += [
        "--test.timeout",
        timeout,
      ]
      if (defined(invoker.args)) {
        command += invoker.args
      }
      deps = []
      if (defined(invoker.deps)) {
        deps += invoker.deps
      }
      if (defined(invoker.non_go_deps)) {
        deps += invoker.non_go_deps
      }
      forward_variables_from(invoker, [ "environments" ])
    }
  }

  go_build(_main_target_name) {
    test = true
    forward_variables_from(invoker,
                           "*",
                           [
                             "disabled",
                             "environments",
                           ])

    if (_include_test_metadata) {
      if (!defined(invoker.non_go_deps)) {
        non_go_deps = []
      }
      non_go_deps += [ ":$_test_spec_target_name" ]
    } else {
      not_needed([ "_test_spec_target_name" ])
    }
  }

  _outputs = get_target_outputs(":$_main_target_name")
  assert(_outputs[0] == _output_path)
}
