# 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/host_test.gni")

# Parameters: same as go_build, along with
#
#   gopackages
#     Required: The go packages containing the tests to be run.
#     Type: list of strings.
#
#   use_prebuilt_go (optional)
#     If true, use a prebuilt go toolchain, rather than building the toolchain.
#     If not set, defaults to false when targeting Fuchsia and true otherwise.
#
#   output_name (optional)
#     The name of the binary that that will be generated.
#     It defaults to the target name.
#
#   args
#     Optional: additional arguments needed when invoking the test.
#     Only applies to host tests.
#     Type: list of strings.
#
#   environments
#     Optional: what environments this test should target. Only applies to host
#     host tests. See //build/testing/test_spec.gni for more details.
#     Type: list of scopes.
#
#   timeout:
#     Optional: override default timeout. Only applies to host tests.
#     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.
#     Type: string.
template("go_test") {
  _output_name = target_name
  if (defined(invoker.output_name)) {
    _output_name = invoker.output_name
  }

  assert(is_host || (!defined(invoker.args) && !defined(invoker.environments) &&
                         !defined(invoker.timeout)),
         "args, environments, and timeout are only supported for host tests")

  _go_build_target_name = target_name

  if (is_host) {
    _go_build_target_name = "${target_name}_go_build"
    host_test(target_name) {
      binary_path = "$root_out_dir/$_output_name"

      timeout = "5m"
      if (defined(invoker.timeout)) {
        timeout = invoker.timeout
      }
      args = [
        "-test.timeout",
        timeout,
        "-test.v",  # Emit detailed test case information.
      ]
      if (defined(invoker.args)) {
        args += invoker.args
      }

      deps = [ ":${_go_build_target_name}" ]
      if (defined(invoker.deps)) {
        deps += invoker.deps
      }
      if (defined(invoker.non_go_deps)) {
        deps += invoker.non_go_deps
      }
      forward_variables_from(invoker,
                             [
                               "data_deps",
                               "environments",
                               "public_deps",
                               "visibility",
                             ])
    }
  }

  go_build(_go_build_target_name) {
    test = true
    output_name = _output_name
    forward_variables_from(invoker,
                           "*",
                           [
                             "args",
                             "environments",
                             "timeout",
                           ])
  }
}
