# 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") {
  # go_build() redirects out of the variant, so root_out_dir et al are not
  # what it actually uses.  Just redirect this target itself first, so the
  # actual go_build instantiation below will not also redirect and the code
  # below matches its output.
  if (toolchain_variant.name != "") {
    group(target_name) {
      forward_variables_from(invoker, [ "visibility" ])
      testonly = true
      public_deps = [ ":$target_name(${toolchain_variant.base})" ]
    }
    not_needed(invoker, "*")
  } else {
    _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) {
        name = _output_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" ])
      }
    } else {
      not_needed(invoker, [ "args" ])
    }

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