# 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("fuchsia_component.gni")
import("fuchsia_test_component_manifest.gni")

# Defines a component that launches a test.
# See: https://fuchsia.dev/fuchsia-src/development/components/build
#
# This template is a useful shortcut for defining classic unit tests for target
# devices, but (unlike fuchsia_unittest_package) where you have multiple test
# targets and want to bundle them in a single test package.
# Pure unit tests don't require any special capabilities, so their component
# manifest can be generated by the template if a manifest is not specified.
#
# Example:
# ```
# executable("rot13_encoder_test") {
#   sources = [ "rot13_encoder_test.cc" ]
#   testonly = true
# }
#
# fuchsia_unittest_component("rot13-encoder-test") {
#   deps = [ ":rot13_encoder_decoder_test" ]
# }
#
# executable("rot13_decoder_test") {
#   sources = [ "rot13_decoder_test.cc" ]
#   testonly = true
# }
#
# fuchsia_unittest_component("rot13-decoder-test") {
#   deps = [ ":rot13_decoder_test" ]
# }
#
# fuchsia_test_package("rot13-tests") {
#   test_components = [
#     ":rot13-encoder-test",
#     ":rot13-decoder-test",
#   ]
# }
# ```
#
# The above will generate a manifest for each test and include both components in a single package,
# which can be run with the launch URLs:
# fuchsia-pkg://fuchsia.com/rot13-tests#meta/rot13-encoder-test.cmx
# fuchsia-pkg://fuchsia.com/rot13-tests#meta/rot13-decoder-test.cmx
#
# Parameters
#
#   manifest (optional)
#     Specify a component manifest for the test.
#     If a manifest is not specified, a trivial manifest will be generated.
#     The generated manifest requests no special capabilities, which is good
#     enough for "pure" unit tests.
#     To view the generated manifest, see:
#     `fx gn outputs out/default path/to/your:<target_name>_generated_manifest`
#     Type: path
#
#   component_name (optional)
#     The name of the component.
#     Type: string
#     Default: target_name
#
#   v2 (optional)
#     If specified and set to false, will generate a CFv1 (.cmx) manifest.
#     If `manifest` is specified then this is ignored.
#     Type: boolean
#
#   restricted_features (optional)
#     The set of restricted CML features to allow. Only applicable to v2 components.
#     The set of features is allowlisted here: //tools/cmc/build/restricted_features/BUILD.gn
#     where each feature name is represented by a group of the same name.
#     Type: list of strings
#     Default: []
#
#   deprecated_legacy_test_execution (optional)
#     If set for a v2 test, the test will be forced to use ELF runner,
#     which sacrifices isolation for higher performance.
#     Type: boolean
#
#   data_deps
#   deps
#   visibility
template("fuchsia_unittest_component") {
  if (current_toolchain == default_toolchain) {
    assert(
        !(defined(invoker.deprecated_legacy_test_execution) &&
              invoker.deprecated_legacy_test_execution &&
              (defined(invoker.manifest) ||
                   (defined(invoker.v2) && !invoker.v2))),
        "cannot specify both deprecated_legacy_test_execution with either v2 = false or an explicit manifest")
    if (!defined(invoker.manifest)) {
      generated_target = "${target_name}_generated_manifest"
      fuchsia_test_component_manifest(generated_target) {
        forward_variables_from(invoker,
                               [
                                 "deps",
                                 "v2",
                               ])
        visibility = [ ":*" ]
      }
      manifest = get_target_outputs(":$generated_target")
      manifest = manifest[0]
    }

    fuchsia_component(target_name) {
      forward_variables_from(invoker,
                             [
                               "data_deps",
                               "deps",
                               "manifest",
                               "manifest_deps",
                               "restricted_features",
                               "visibility",
                             ])
      if (defined(invoker.deprecated_legacy_test_execution) &&
          invoker.deprecated_legacy_test_execution) {
        experimental_force_runner = "elf_test_runner"
      }
      component_name = target_name
      if (defined(invoker.component_name)) {
        component_name = invoker.component_name
      }
      testonly = true

      if (defined(generated_target)) {
        if (!defined(manifest_deps)) {
          manifest_deps = []
        }
        manifest_deps += [ ":$generated_target" ]
      }
    }
  } else {
    group(target_name) {
      testonly = true
      forward_variables_from(invoker, [ "visibility" ])
      deps = [ ":$target_name($default_toolchain)" ]
    }
    not_needed(invoker, "*")
  }
}
