# Copyright 2021 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/go/go_test.gni")
import("//build/testing/host_test_data.gni")

# Declares a Go test that uses the fidlgentest library.
#
# The fidlgentest library runs fidlc at runtime, so tests using it must make
# fidlc available and pass its path as an argument to the test binary. This
# template takes care of that.
#
# Parameters: same as go_test.
template("fidlgentest_go_test") {
  assert(is_host, "The fidlgentest_go_test template can only be used on host")

  fidlc_target = "//tools/fidl/fidlc($host_toolchain)"
  fidlc_binary = get_label_info(fidlc_target, "root_out_dir") + "/fidlc"

  test_data_target = "${target_name}_test_data"
  host_test_data(test_data_target) {
    visibility = [ ":*" ]
    sources = [ fidlc_binary ]
    deps = [ fidlc_target ]
  }

  go_test(target_name) {
    forward_variables_from(invoker, "*")
    if (!defined(args)) {
      args = []
    }
    args += [
      "--fidlc",
      rebase_path(fidlc_binary, root_build_dir),
    ]
    if (!defined(deps)) {
      deps = []
    }
    deps += [ "//tools/fidl/lib/fidlgentest" ]
    if (!defined(non_go_deps)) {
      non_go_deps = []
    }
    non_go_deps += [ ":$test_data_target" ]
  }
}
