summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--testing/libfuzzer/fuzzer_test.gni83
-rw-r--r--testing/libfuzzer/fuzzers/BUILD.gn77
-rwxr-xr-xtesting/libfuzzer/gen_fuzzer_runner.py31
3 files changed, 142 insertions, 49 deletions
diff --git a/testing/libfuzzer/fuzzer_test.gni b/testing/libfuzzer/fuzzer_test.gni
new file mode 100644
index 0000000..db5e438
--- /dev/null
+++ b/testing/libfuzzer/fuzzer_test.gni
@@ -0,0 +1,83 @@
+# Copyright 2015 The Chromium 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("//testing/test.gni")
+
+# 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.
+#
+# 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
+# dir (next to test).
+template("fuzzer_test") {
+ assert(defined(invoker.sources), "Need sources in $target_name.")
+
+ test_deps = [ "//testing/libfuzzer:libfuzzer_main" ]
+
+ if (defined(invoker.deps)) {
+ test_deps += invoker.deps
+ }
+
+ test_data = []
+ if (defined(invoker.data)) {
+ test_data += invoker.data
+ }
+
+ if (defined(invoker.dict)) {
+ fuzzer_name = target_name
+ launcher_name = target_name + ".sh"
+ generated_script = "$root_build_dir/$launcher_name"
+
+ # Copy dictionary to output
+ copy(target_name + "_dict_copy") {
+ sources = [
+ invoker.dict,
+ ]
+ outputs = [
+ "$target_out_dir/{{source_file_part}}",
+ ]
+ }
+
+ # Generate test launcher
+ action(launcher_name) {
+ script = "//testing/libfuzzer/gen_fuzzer_runner.py"
+ args = [
+ "--fuzzer",
+ fuzzer_name,
+ "--launcher",
+ rebase_path(generated_script, root_build_dir),
+ "--dict",
+ rebase_path("$target_out_dir/" + invoker.dict, root_build_dir),
+ ]
+ outputs = [
+ generated_script,
+ ]
+ }
+ test_deps += [
+ ":$launcher_name",
+ ":" + fuzzer_name + "_dict_copy",
+ ]
+ test_data += [
+ invoker.dict,
+ ":$launcher_name",
+ ]
+ }
+
+ test(target_name) {
+ forward_variables_from(invoker, [ "sources" ])
+ deps = test_deps
+ data = test_data
+
+ if (defined(invoker.additional_configs)) {
+ configs += invoker.additional_configs
+ }
+ }
+}
diff --git a/testing/libfuzzer/fuzzers/BUILD.gn b/testing/libfuzzer/fuzzers/BUILD.gn
index c708a45..7e5acae 100644
--- a/testing/libfuzzer/fuzzers/BUILD.gn
+++ b/testing/libfuzzer/fuzzers/BUILD.gn
@@ -5,52 +5,48 @@
# Individual libfuzzer tests that didn't find their home yet.
import("//build/config/features.gni")
-import("//testing/test.gni")
+import("//testing/libfuzzer/fuzzer_test.gni")
-test("brotli_fuzzer") {
+fuzzer_test("brotli_fuzzer") {
sources = [
"brotli_fuzzer.cc",
]
deps = [
- "//testing/libfuzzer:libfuzzer_main",
"//third_party/brotli:brotli",
]
}
-test("courgette_fuzzer") {
+fuzzer_test("courgette_fuzzer") {
sources = [
"courgette_fuzzer.cc",
]
deps = [
"//base",
"//courgette:courgette_lib",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("dns_record_fuzzer") {
+fuzzer_test("dns_record_fuzzer") {
sources = [
"dns_record_fuzzer.cc",
]
deps = [
"//base",
"//net",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("ftp_ctrl_response_fuzzer") {
+fuzzer_test("ftp_ctrl_response_fuzzer") {
sources = [
"ftp_ctrl_response_fuzzer.cc",
]
deps = [
"//base",
"//net",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("ftp_directory_listing_fuzzer") {
+fuzzer_test("ftp_directory_listing_fuzzer") {
sources = [
"ftp_directory_listing_fuzzer.cc",
]
@@ -58,136 +54,123 @@ test("ftp_directory_listing_fuzzer") {
"//base",
"//base:i18n",
"//net",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("language_detection_fuzzer") {
+fuzzer_test("language_detection_fuzzer") {
sources = [
"language_detection_fuzzer.cc",
]
deps = [
"//base",
"//components/translate/core/language_detection:language_detection",
- "//testing/libfuzzer:libfuzzer_main",
]
}
if (proprietary_codecs) {
- test("mp4_box_reader_fuzzer") {
+ fuzzer_test("mp4_box_reader_fuzzer") {
sources = [
"mp4_box_reader_fuzzer.cc",
]
deps = [
"//base",
"//media",
- "//testing/libfuzzer:libfuzzer_main",
]
}
- test("es_parser_adts_fuzzer") {
+ fuzzer_test("es_parser_adts_fuzzer") {
sources = [
"es_parser_adts_fuzzer.cc",
]
deps = [
"//base",
"//media",
- "//testing/libfuzzer:libfuzzer_main",
]
}
- test("es_parser_h264_fuzzer") {
+ fuzzer_test("es_parser_h264_fuzzer") {
sources = [
"es_parser_h264_fuzzer.cc",
]
deps = [
"//base",
"//media",
- "//testing/libfuzzer:libfuzzer_main",
]
}
- test("es_parser_mpeg1audio_fuzzer") {
+ fuzzer_test("es_parser_mpeg1audio_fuzzer") {
sources = [
"es_parser_mpeg1audio_fuzzer.cc",
]
deps = [
"//base",
"//media",
- "//testing/libfuzzer:libfuzzer_main",
]
}
}
-test("snappy_fuzzer") {
+fuzzer_test("snappy_fuzzer") {
sources = [
"snappy_fuzzer.cc",
]
deps = [
- "//testing/libfuzzer:libfuzzer_main",
"//third_party/snappy:snappy",
]
}
-test("string_tokenizer_fuzzer") {
+fuzzer_test("string_tokenizer_fuzzer") {
sources = [
"string_tokenizer_fuzzer.cc",
]
deps = [
"//base",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("string_to_int_fuzzer") {
+fuzzer_test("string_to_int_fuzzer") {
sources = [
"string_to_int_fuzzer.cc",
]
deps = [
"//base",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("unescape_url_component_fuzzer") {
+fuzzer_test("unescape_url_component_fuzzer") {
sources = [
"unescape_url_component_fuzzer.cc",
]
deps = [
"//base",
"//net",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("url_parse_fuzzer") {
+fuzzer_test("url_parse_fuzzer") {
sources = [
"url_parse_fuzzer.cc",
]
deps = [
"//base",
"//base:i18n",
- "//testing/libfuzzer:libfuzzer_main",
"//url:url",
]
}
-test("vp9_parser_fuzzer") {
+fuzzer_test("vp9_parser_fuzzer") {
sources = [
"vp9_parser_fuzzer.cc",
]
deps = [
"//media",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("v8_json_parser_fuzzer") {
+fuzzer_test("v8_json_parser_fuzzer") {
sources = [
"v8_json_parser_fuzzer.cc",
]
deps = [
- "//testing/libfuzzer:libfuzzer_main",
"//v8",
"//v8:v8_libplatform",
]
@@ -197,69 +180,65 @@ test("v8_json_parser_fuzzer") {
]
}
-test("base_json_reader_fuzzer") {
+fuzzer_test("base_json_reader_fuzzer") {
sources = [
"base_json_reader_fuzzer.cc",
]
deps = [
"//base",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("gfx_png_image_fuzzer") {
+fuzzer_test("gfx_png_image_fuzzer") {
sources = [
"gfx_png_image_fuzzer.cc",
]
deps = [
"//base",
- "//testing/libfuzzer:libfuzzer_main",
"//ui/gfx",
]
}
-test("zlib_uncompress_fuzzer") {
+fuzzer_test("zlib_uncompress_fuzzer") {
sources = [
"zlib_uncompress_fuzzer.cc",
]
deps = [
- "//testing/libfuzzer:libfuzzer_main",
"//third_party/zlib",
]
}
-test("pdfium_fuzzer") {
+fuzzer_test("pdfium_fuzzer") {
sources = [
"pdfium_fuzzer.cc",
]
deps = [
- "//testing/libfuzzer:libfuzzer_main",
"//third_party/pdfium",
"//third_party/pdfium:test_support",
"//v8",
"//v8:v8_libplatform",
]
- configs += [ "//third_party/pdfium:pdfium_config" ]
- configs += [ "//v8:external_startup_data" ]
+ additional_configs = [
+ "//third_party/pdfium:pdfium_config",
+ "//v8:external_startup_data",
+ ]
}
-test("websocket_frame_parser_fuzzer") {
+fuzzer_test("websocket_frame_parser_fuzzer") {
sources = [
"websocket_frame_parser_fuzzer.cc",
]
deps = [
"//net",
- "//testing/libfuzzer:libfuzzer_main",
]
}
-test("http_chunked_decoder_fuzzer") {
+fuzzer_test("http_chunked_decoder_fuzzer") {
sources = [
"http_chunked_decoder_fuzzer.cc",
]
deps = [
"//net",
- "//testing/libfuzzer:libfuzzer_main",
]
}
diff --git a/testing/libfuzzer/gen_fuzzer_runner.py b/testing/libfuzzer/gen_fuzzer_runner.py
new file mode 100755
index 0000000..516bd64
--- /dev/null
+++ b/testing/libfuzzer/gen_fuzzer_runner.py
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Generate .sh runner for libfuzzer test.
+
+Invoked by GN from fuzzer_test.gni.
+"""
+
+import argparse
+import os
+import sys
+
+
+parser = argparse.ArgumentParser(description="Generate fuzzer launcher.")
+parser.add_argument('--fuzzer', required=True)
+parser.add_argument('--launcher', required=True)
+parser.add_argument('--dict', required=True)
+args = parser.parse_args()
+
+out = open(args.launcher, 'w')
+out.write("""#!/bin/bash
+set -ue
+DIR=$(dirname $0)
+$DIR/%(fuzzer)s -dict=$DIR/%(dict)s $*
+""" % { "fuzzer": args.fuzzer, "dict": args.dict })
+out.close()
+
+os.chmod(args.launcher, os.stat(args.launcher).st_mode | 0o111) # chmod a+x