# 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
      target = _main_target_name
      path = _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)
}
