# Copyright 2020 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.

# Declares host-side test data and makes them available at test runtime.
#
# It is a requirement that host tests with runtime dependencies express this
# by depending on instances of this template.
#
# Parameters
#
#   * sources
#     - Required: List of source data files to serve as host test data.
#     - Type: list(path)
#
#   * outputs
#     - Optional: Where to copy the provided sources. If provided, these
#       locations (and not those of sources) will be declared as runtime
#       dependencies.
#     - Type: list(path relative to $root_build_dir)
#
#   * deps
#   * visibility
#     - Optional: Usual GN meanings.
#
template("host_test_data") {
  assert(defined(invoker.sources), "sources are required")
  assert(
      is_host,
      "host_test_data should only be used on host, to fix this, wrap you target with `if (is_host) { ... }`")

  main_target_name = target_name
  if (defined(invoker.outputs)) {
    metadata_target_name = "${target_name}_metadata"

    # The main target that copies test data to the build directory.
    # It depends on the generated group `group_target_name`, which
    # carries the `test_runtime_deps` metadata.
    # The copy rule is the main target so that clients can still
    # call `get_target_outputs` on it.
    copy(main_target_name) {
      testonly = true
      forward_variables_from(invoker, "*")
      if (!defined(deps)) {
        deps = []
      }
      deps += [ ":$metadata_target_name" ]

      # If we are in the context of a variant, also perform the copy for the
      # base toolchain, as we want both the variant-selected and normal
      # versions of the associated test to have its test data available at the
      # prescribed relative paths.
      if (current_toolchain != toolchain_variant.base) {
        deps += [ ":$main_target_name(${toolchain_variant.base})" ]
      }
    }
    test_data = get_target_outputs(":$main_target_name")
  } else {
    metadata_target_name = main_target_name
    test_data = invoker.sources
  }

  # This group exists only to carry the `test_runtime_deps` metadata, which
  # is aggregated by test_spec().
  group(metadata_target_name) {
    testonly = true
    forward_variables_from(invoker,
                           [
                             "deps",
                             "visibility",
                           ])
    metadata = {
      test_runtime_deps = test_data
    }
  }
}
