# 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("//build/components.gni")
import("//sdk/cts/build/cts_element.gni")
import("//sdk/cts/build/write_cts_file.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" ]
      }
    }

    if (defined(deps)) {
      deps += [ ":${target_name}_cts_file" ]
    } else {
      deps = [ ":${target_name}_cts_file" ]
    }
  }

  write_cts_file(target_name) {
  }
}
