blob: 9dbc4647a699f4a8b013200ccdbbe64a0a0debf2 [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("//build/components.gni")
# Defines a Fuchsia component for a fuzzer test.
# See: https://fuchsia.dev/fuchsia-src/development/components/build
#
# This template extends `fuchsia_component` by automatically generating a fuzzer test manifest to
# act as the component manifest. These tests are generated for each accompanying fuzzer. Unlike the
# fuzzers, they loop over only a small, fixed set of inputs.
#
# See also the closely related `fuzzer_component` template in //build/fuzzing/fuzzer_component.gni.
#
# Parameters:
#
# fuzzer (required)
# [string] The name of the fuzzer being tested.
#
# label (required)
# [label] The GN label of the associated fuzzer.
#
# deps (required)
# [list of labels] Same meaning as for `fuchsia_component`, but required. This typically
# includes the fuzzer test binary. It should also include the fuzzer corpus, when present.
#
# corpus (optional)
# [label] If present, includes program arguments in the component manifest
# to use the corpus when testing.
#
template("fuzzer_test_component") {
if (current_toolchain == default_toolchain) {
assert(defined(invoker.fuzzer),
"missing 'fuzzer' for fuzzer_test_component($target_name)")
assert(defined(invoker.label),
"missing 'label' for fuzzer_test_component($target_name)")
assert(defined(invoker.deps),
"missing 'deps' for fuzzer_test_component($target_name)")
fuzzer_test = "${invoker.fuzzer}_test"
meta_target_name = "${target_name}_metadata"
fuchsia_unittest_component(target_name) {
forward_variables_from(invoker, [ "visibility" ])
component_name = fuzzer_test
deps = invoker.deps + [ ":$meta_target_name" ]
}
group(meta_target_name) {
testonly = true
deps = invoker.deps + [ "//build/fuzzing:includes_cml" ]
metadata = {
test_component_manifest_cml = [
{
forward_variables_from(invoker, [ "include" ])
program = {
args = [ "-q" ]
if (defined(invoker.corpus)) {
corpus_path = get_label_info(invoker.corpus, "dir")
corpus_name = get_label_info(invoker.corpus, "name")
if (corpus_name != get_path_info(corpus_path, "file")) {
corpus_path += "/" + corpus_name
}
args += [ "pkg/data/" + rebase_path(corpus_path, "//") ]
}
args += [ "data/corpus" ]
}
},
]
fuzz_spec = [
{
label = invoker.label
fuzzer_test = fuzzer_test
test_manifest = get_target_outputs(":${invoker.target_name}")
test_manifest = get_path_info(test_manifest[0], "file")
},
]
}
}
} else {
group(target_name) {
testonly = true
deps = [ ":$target_name($default_toolchain)" ]
}
not_needed(invoker, "*")
}
}