# Copyright 2022 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/testing/host_test.gni")
import("//sdk/cts/build/cts_copy_to_sdk.gni")
import("//sdk/cts/build/cts_element.gni")
import("//sdk/cts/build/cts_version.gni")
import("//sdk/cts/build/write_cts_file.gni")

# Defines a host_test that can be used in the CTS.
#
# An equivalent to host_test, but ensures dependencies are allowed in the CTS.
#
# See host_test() for parameters.
template("cts_host_test") {
  if (invoker.deps != [] && cts_version == "") {
    verify_target = target_name + "_verify_deps"
  }
  write_file_target = target_name + "_cts_file"

  if (defined(verify_target)) {
    cts_element(verify_target) {
      deps = invoker.deps
      invoker_label = get_label_info(invoker.target_name, "label_no_toolchain")
    }
  }

  write_cts_file(write_file_target) {
  }

  main_target_name = target_name + "_host"
  host_test(main_target_name) {
    forward_variables_from(invoker, "*")

    if (defined(verify_target)) {
      deps += [ ":$verify_target" ]
    }
    deps += [ ":$write_file_target" ]
  }

  cts_copy_to_sdk(target_name) {
    testonly = true
    sources = [ invoker.binary_path ]
    dest = "host_${host_cpu}"
    non_sdk_deps = invoker.deps
  }

  group(target_name) {
    testonly = true
    _test_name = target_name
    if (cts_version != "") {
      _test_name += "_$cts_version"
    }
    metadata = {
      host_test_manifest = [
        {
          test_name = _test_name
          binary_path = rebase_path(invoker.binary_path, root_build_dir)
          args = invoker.args
        },
      ]
    }
    deps = [ ":$main_target_name" ]
  }
}
