| Index: testing/libfuzzer/fuzzer_test.gni
|
| diff --git a/testing/libfuzzer/fuzzer_test.gni b/testing/libfuzzer/fuzzer_test.gni
|
| index 2064f6cf024c9abdabf346bd22cee094650908bc..9fc5c6a5e5d0e09db1f75537cbfe056c96fb245b 100644
|
| --- a/testing/libfuzzer/fuzzer_test.gni
|
| +++ b/testing/libfuzzer/fuzzer_test.gni
|
| @@ -8,45 +8,22 @@ import("//build/config/features.gni")
|
| import("//build/config/sanitizers/sanitizers.gni")
|
| import("//testing/test.gni")
|
|
|
| -# visible for testing only.
|
| -template("fuzzer_test_launcher") {
|
| - assert(defined(invoker.fuzzer_name), "need fuzzer_name in $target_name.")
|
| - assert(defined(invoker.dict), "need dict in $target_name.")
|
| -
|
| - generated_script = "$root_build_dir/$target_name"
|
| -
|
| - action(target_name) {
|
| - script = "//testing/libfuzzer/gen_fuzzer_runner.py"
|
| - args = [
|
| - "--fuzzer",
|
| - invoker.fuzzer_name,
|
| - "--launcher",
|
| - rebase_path(generated_script, root_build_dir),
|
| - "--dict",
|
| - rebase_path("$root_build_dir/" + invoker.dict, root_build_dir),
|
| - ]
|
| - outputs = [
|
| - generated_script,
|
| - ]
|
| - }
|
| -}
|
| -
|
| # fuzzer_test is used to define individual libfuzzer tests.
|
| #
|
| # Supported attributes:
|
| # - (required) sources - fuzzer test source files
|
| -# - data - test data files.
|
| # - deps - test dependencies
|
| # - additional_configs - additional configs to be used for compilation
|
| # - dict - a dictionary file for the fuzzer.
|
| +# - libfuzzer_options - options for the fuzzer (e.g. -max_len or -timeout).
|
| #
|
| # If use_libfuzzer gn flag is defined, then proper fuzzer would be build.
|
| # Without use_libfuzzer a unit-test style binary would be built on linux
|
| # and the whole target is a no-op otherwise.
|
| #
|
| # The template wraps test() target with appropriate dependencies.
|
| -# If any test run-time options are present (dict), then a launcher
|
| -# file would be generated with <fuzzer_name>.sh name in root output
|
| +# If any test run-time options are present (dict or libfuzzer_options), then a
|
| +# config (.options file) file would be generated or modified in root output
|
| # dir (next to test).
|
| template("fuzzer_test") {
|
| if (!disable_libfuzzer && (use_libfuzzer || use_drfuzz || is_linux)) {
|
| @@ -58,37 +35,55 @@ template("fuzzer_test") {
|
| test_deps += invoker.deps
|
| }
|
|
|
| - test_data = []
|
| - if (defined(invoker.data)) {
|
| - test_data += invoker.data
|
| + if (defined(invoker.libfuzzer_options) && !defined(invoker.dict)) {
|
| + # Copy libfuzzer_options to output if dict is not provided.
|
| + copy(target_name + "_libfuzzer_options_copy") {
|
| + sources = [
|
| + invoker.libfuzzer_options,
|
| + ]
|
| + outputs = [
|
| + "$root_build_dir/" + target_name + ".options",
|
| + ]
|
| + }
|
| +
|
| + test_deps += [ ":" + target_name + "_libfuzzer_options_copy" ]
|
| }
|
|
|
| if (defined(invoker.dict)) {
|
| - fuzzer_name = target_name
|
| - launcher_name = target_name + ".sh"
|
| -
|
| - # Copy dictionary to output
|
| + # Copy dictionary to output.
|
| copy(target_name + "_dict_copy") {
|
| sources = [
|
| invoker.dict,
|
| ]
|
| outputs = [
|
| - "$root_build_dir/" + invoker.dict,
|
| + "$root_build_dir/" + target_name + ".dict",
|
| ]
|
| }
|
|
|
| - fuzzer_test_launcher(launcher_name) {
|
| - dict = invoker.dict
|
| - }
|
| + test_deps += [ ":" + target_name + "_dict_copy" ]
|
| +
|
| + # Generate new .options file or update an existing one.
|
| + config_name = target_name + ".options"
|
| + action(config_name) {
|
| + script = "//testing/libfuzzer/gen_fuzzer_config.py"
|
| + args = [
|
| + "--config",
|
| + rebase_path("$root_build_dir/" + config_name),
|
| + "--dict",
|
| + rebase_path("$root_build_dir/" + invoker.target_name + ".dict"),
|
| + ]
|
|
|
| - test_deps += [
|
| - ":$launcher_name",
|
| - ":" + fuzzer_name + "_dict_copy",
|
| - ]
|
| - test_data += [
|
| - invoker.dict,
|
| - ":$launcher_name",
|
| - ]
|
| + if (defined(invoker.libfuzzer_options)) {
|
| + args += [
|
| + "--libfuzzer_options",
|
| + rebase_path(invoker.libfuzzer_options),
|
| + ]
|
| + }
|
| + outputs = [
|
| + "$root_build_dir/$config_name",
|
| + ]
|
| + }
|
| + test_deps += [ ":" + config_name ]
|
| }
|
|
|
| test(target_name) {
|
| @@ -98,7 +93,6 @@ template("fuzzer_test") {
|
| "include_dirs",
|
| ])
|
| deps = test_deps
|
| - data = test_data
|
|
|
| if (defined(invoker.additional_configs)) {
|
| configs += invoker.additional_configs
|
| @@ -118,6 +112,9 @@ template("fuzzer_test") {
|
| if (defined(invoker.dict)) {
|
| assert(invoker.dict == [] || invoker.dict != [])
|
| }
|
| + if (defined(invoker.libfuzzer_options)) {
|
| + assert(invoker.libfuzzer_options == [] || invoker.libfuzzer_options != [])
|
| + }
|
|
|
| group(target_name) {
|
| }
|
|
|