# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be found
# in the LICENSE file.

# The crosier_tests template is used to define crosier test targets in
# subdirectories. They should be in the dependency chain of the top-level
# chromeos_integration_tests target.
#
# crosier_tests behaves like source_set except that it supports (and expects) a
# "sources_metadata" variable that lists the yaml metadata files corresponding
# to the test sources. These files will be copied to the appropriate directory.
# See docs/testing/chromeos_integration/crosier_metadata.md for details.

import("//build/config/chromeos/ui_mode.gni")

template("crosier_tests") {
  assert(is_chromeos_device)
  assert(defined(invoker.sources),
         "Need sources in $target_name listing the C++ files.")
  assert(defined(invoker.sources_metadata),
         "Need sources_metadata in $target_name listing the yaml files.")

  _have_metadata = invoker.sources_metadata != []

  source_set(target_name) {
    forward_variables_from(invoker, "*", [ "sources_metadata" ])
    testonly = true
    if (defined(defines)) {
      defines += [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
    } else {
      defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
    }
    if (_have_metadata) {
      if (defined(data_deps)) {
        data_deps += [ ":${target_name}_metadata" ]
      } else {
        data_deps = [ ":${target_name}_metadata" ]
      }
    }
  }

  if (_have_metadata) {
    copy("${target_name}_metadata") {
      testonly = true
      sources = invoker.sources_metadata
      outputs = [ "$root_out_dir/crosier_metadata/{{source_file_part}}" ]
    }
  }
}
