# 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)
#
#   * testonly
#     - Optional: GN Usual. Allow option to set to false for IDK inclusion.
#       See https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/BUILD.gn;l=161-167;drc=aa7ba9d998556f7124fe8e2edc6604c9c1592d01
#     - Type: boolean
#     - Default: true
#
#   * deps
#   * visibility
#     - Optional: Usual GN meanings.
#
template("host_test_data") {
  assert(defined(invoker.sources), "sources are required")
  assert(
      !is_fuchsia,
      "host_test_data should only be used on host, to fix this, wrap you target with `if (is_host) { ... }`")

  _testonly = true
  if (defined(invoker.testonly)) {
    _testonly = invoker.testonly
  }

  if (defined(invoker.outputs)) {
    main_target_name = target_name
    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 = _testonly
      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})" ]
      }
    }

    # This group exists because the metadata needed by test_spec cannot be
    # generated within the copy() action, as 'process_file_pattern()' rejects
    # 'source_path_relative', which is valid for 'copy()'.
    group(metadata_target_name) {
      testonly = _testonly
      visibility = [ ":$main_target_name" ]
      metadata = {
        test_runtime_deps = get_target_outputs(":$main_target_name")
      }
    }
  } else {
    # This group exists only to carry the `test_runtime_deps` metadata, which
    # is aggregated by test_spec().
    group(target_name) {
      testonly = _testonly
      forward_variables_from(invoker,
                             [
                               "deps",
                               "data_deps",
                               "public_deps",
                               "visibility",
                             ])
      metadata = {
        test_runtime_deps = invoker.sources
        test_runtime_deps_barrier = []
      }
    }
  }
}
