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

import("//sdk/cts/build/cts_element.gni")
import("//sdk/cts/build/write_cts_file.gni")
import("//src/sys/build/components.gni")

# Defines a Compatibility Test Suite package.
#
# An equivalent to fuchsia_test_package, but ensures dependencies and
# test_components are allowed in CTS.
#
# Example:
# ```
# cts_fuchsia_test_package("my-test-package") {
#   test_components = [ ":my-test-component" ]
# }
# ```
template("cts_fuchsia_test_package") {
  # Ensure that deps and test_components are CTS targets.
  invoker_deps = []
  if (defined(invoker.deps)) {
    invoker_deps += invoker.deps
  }
  if (defined(invoker.test_components)) {
    invoker_deps += invoker.test_components
  }
  if (invoker_deps != []) {
    cts_element("${target_name}_verify_deps") {
      deps = invoker_deps
      invoker_label = get_label_info(invoker.target_name, "label_no_toolchain")
    }
  }

  fuchsia_test_package(target_name) {
    forward_variables_from(invoker, "*")
    if (invoker_deps != []) {
      if (defined(deps)) {
        deps += [ ":${target_name}_verify_deps" ]
      } else {
        deps = [ ":${target_name}_verify_deps" ]
      }
    }
  }

  write_cts_file(target_name) {
  }
}
