blob: a242d08a969f4d376cc9bdb250bafdc1124e333b [file] [log] [blame]
# 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_test_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.cm
# fuchsia-pkg://fuchsia.com/rot13-tests#meta/rot13-decoder-test.cm
#
# 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
#
# required_offers (optional)
# A list of protocols that must be offered to every child and collection declared
# in the CML file.
# Type: list of strings
# Default: []
#
# required_uses (optional)
# A list of protocols that must be used by every child and collection declared
# in the CML file.
# Type: list of strings
# Default: []
#
# restricted_features (optional)
# The set of restricted CML features to allow.
# 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)
# The test will be forced to use ELF runner.
# ELF runner has fewer features than other specialized runners,
# but in some cases may offer faster test execution.
# Type: boolean
#
# test_type (optional)
# Maps to the moniker to run the test component in.
# Type: string
# Refer to
# https://fuchsia.dev/fuchsia-src/development/testing/components/test_runner_framework?hl=en#non-hermetic_tests
# for valid types
#
# 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)),
"cannot specify both deprecated_legacy_test_execution and an explicit manifest")
if (!defined(invoker.manifest)) {
generated_target = "${target_name}_generated_manifest"
fuchsia_test_component_manifest(generated_target) {
forward_variables_from(invoker, [ "deps" ])
metadata = {
test_component_manifest_cml = [
{
include = [ "//sdk/lib/syslog/use.shard.cml" ]
},
]
}
visibility = [ ":*" ]
}
manifest = get_target_outputs(":$generated_target")
manifest = manifest[0]
}
fuchsia_test_component(target_name) {
forward_variables_from(invoker,
[
"data_deps",
"deps",
"manifest",
"manifest_deps",
"required_offers",
"required_uses",
"restricted_features",
"visibility",
"test_type",
])
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
}
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, "*")
}
}