aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 1 | # Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
aizatsky | 7dfb5734 | 2015-12-21 04:02:52 | [diff] [blame] | 5 | # Defines fuzzer_test. |
| 6 | # |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 7 | import("//build/config/features.gni") |
| 8 | import("//build/config/sanitizers/sanitizers.gni") |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 9 | import("//testing/test.gni") |
| 10 | |
| 11 | # fuzzer_test is used to define individual libfuzzer tests. |
| 12 | # |
| 13 | # Supported attributes: |
| 14 | # - (required) sources - fuzzer test source files |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 15 | # - deps - test dependencies |
| 16 | # - additional_configs - additional configs to be used for compilation |
| 17 | # - dict - a dictionary file for the fuzzer. |
mmoroz | 344a75ae | 2016-03-02 16:57:17 | [diff] [blame] | 18 | # - libfuzzer_options - options for the fuzzer (e.g. -max_len or -timeout). |
aizatsky | 198e302 | 2016-03-08 21:33:46 | [diff] [blame] | 19 | # - seed_corpus - a directory with seed corpus. |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 20 | # |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 21 | # If use_libfuzzer gn flag is defined, then proper fuzzer would be build. |
metzman | 8c9ed0e | 2016-06-21 20:37:20 | [diff] [blame] | 22 | # Without use_libfuzzer or use_afl a unit-test style binary would be built on |
| 23 | # linux and the whole target is a no-op otherwise. |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 24 | # |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 25 | # The template wraps test() target with appropriate dependencies. |
mmoroz | 344a75ae | 2016-03-02 16:57:17 | [diff] [blame] | 26 | # If any test run-time options are present (dict or libfuzzer_options), then a |
| 27 | # config (.options file) file would be generated or modified in root output |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 28 | # dir (next to test). |
| 29 | template("fuzzer_test") { |
Jonathan Metzman | d901d1b | 2017-10-09 23:07:28 | [diff] [blame^] | 30 | if (!disable_libfuzzer && (use_fuzzing_engine || use_drfuzz || is_linux)) { |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 31 | assert(defined(invoker.sources), "Need sources in $target_name.") |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 32 | |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 33 | test_deps = [ "//testing/libfuzzer:libfuzzer_main" ] |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 34 | |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 35 | if (defined(invoker.deps)) { |
| 36 | test_deps += invoker.deps |
| 37 | } |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 38 | |
mmoroz | 902ef43 | 2017-02-07 17:03:37 | [diff] [blame] | 39 | if (defined(invoker.seed_corpus) || defined(invoker.seed_corpuses)) { |
| 40 | assert(!(defined(invoker.seed_corpus) && defined(invoker.seed_corpuses)), |
| 41 | "Do not use both seed_corpus and seed_corpuses for $target_name.") |
| 42 | |
aizatsky | 198e302 | 2016-03-08 21:33:46 | [diff] [blame] | 43 | out = "$root_build_dir/$target_name" + "_seed_corpus.zip" |
| 44 | |
| 45 | action(target_name + "_seed_corpus") { |
| 46 | script = "//testing/libfuzzer/archive_corpus.py" |
mmoroz | 902ef43 | 2017-02-07 17:03:37 | [diff] [blame] | 47 | |
aizatsky | 198e302 | 2016-03-08 21:33:46 | [diff] [blame] | 48 | args = [ |
aizatsky | 198e302 | 2016-03-08 21:33:46 | [diff] [blame] | 49 | "--output", |
wychen | 5e1f725 | 2017-05-30 08:05:10 | [diff] [blame] | 50 | rebase_path(out, root_build_dir), |
aizatsky | 198e302 | 2016-03-08 21:33:46 | [diff] [blame] | 51 | ] |
| 52 | |
mmoroz | 902ef43 | 2017-02-07 17:03:37 | [diff] [blame] | 53 | if (defined(invoker.seed_corpus)) { |
wychen | 5e1f725 | 2017-05-30 08:05:10 | [diff] [blame] | 54 | args += [ rebase_path(invoker.seed_corpus, root_build_dir) ] |
mmoroz | 902ef43 | 2017-02-07 17:03:37 | [diff] [blame] | 55 | } |
| 56 | |
| 57 | if (defined(invoker.seed_corpuses)) { |
| 58 | foreach(seed_corpus_path, invoker.seed_corpuses) { |
wychen | 5e1f725 | 2017-05-30 08:05:10 | [diff] [blame] | 59 | args += [ rebase_path(seed_corpus_path, root_build_dir) ] |
mmoroz | 902ef43 | 2017-02-07 17:03:37 | [diff] [blame] | 60 | } |
| 61 | } |
| 62 | |
aizatsky | 198e302 | 2016-03-08 21:33:46 | [diff] [blame] | 63 | outputs = [ |
| 64 | out, |
| 65 | ] |
mmoroz | 902ef43 | 2017-02-07 17:03:37 | [diff] [blame] | 66 | |
aizatsky | 7951d34f | 2016-03-11 00:09:45 | [diff] [blame] | 67 | deps = [ |
| 68 | "//testing/libfuzzer:seed_corpus", |
| 69 | ] |
aizatsky | 198e302 | 2016-03-08 21:33:46 | [diff] [blame] | 70 | } |
| 71 | |
| 72 | test_deps += [ ":" + target_name + "_seed_corpus" ] |
| 73 | } |
| 74 | |
mmoroz | 062a4a6 | 2016-04-12 09:02:33 | [diff] [blame] | 75 | if (defined(invoker.dict) || defined(invoker.libfuzzer_options)) { |
| 76 | if (defined(invoker.dict)) { |
| 77 | # Copy dictionary to output. |
| 78 | copy(target_name + "_dict_copy") { |
| 79 | sources = [ |
| 80 | invoker.dict, |
| 81 | ] |
| 82 | outputs = [ |
| 83 | "$root_build_dir/" + target_name + ".dict", |
| 84 | ] |
| 85 | } |
| 86 | test_deps += [ ":" + target_name + "_dict_copy" ] |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 87 | } |
| 88 | |
mmoroz | 062a4a6 | 2016-04-12 09:02:33 | [diff] [blame] | 89 | # Generate .options file. |
mmoroz | 344a75ae | 2016-03-02 16:57:17 | [diff] [blame] | 90 | config_name = target_name + ".options" |
| 91 | action(config_name) { |
| 92 | script = "//testing/libfuzzer/gen_fuzzer_config.py" |
| 93 | args = [ |
| 94 | "--config", |
wychen | 5e1f725 | 2017-05-30 08:05:10 | [diff] [blame] | 95 | rebase_path("$root_build_dir/" + config_name, root_build_dir), |
mmoroz | 344a75ae | 2016-03-02 16:57:17 | [diff] [blame] | 96 | ] |
| 97 | |
mmoroz | 062a4a6 | 2016-04-12 09:02:33 | [diff] [blame] | 98 | if (defined(invoker.dict)) { |
mmoroz | 344a75ae | 2016-03-02 16:57:17 | [diff] [blame] | 99 | args += [ |
mmoroz | 062a4a6 | 2016-04-12 09:02:33 | [diff] [blame] | 100 | "--dict", |
wychen | 5e1f725 | 2017-05-30 08:05:10 | [diff] [blame] | 101 | rebase_path("$root_build_dir/" + invoker.target_name + ".dict", |
| 102 | root_build_dir), |
mmoroz | 344a75ae | 2016-03-02 16:57:17 | [diff] [blame] | 103 | ] |
| 104 | } |
mmoroz | 062a4a6 | 2016-04-12 09:02:33 | [diff] [blame] | 105 | |
| 106 | if (defined(invoker.libfuzzer_options)) { |
| 107 | args += [ "--libfuzzer_options" ] |
| 108 | args += invoker.libfuzzer_options |
| 109 | } |
| 110 | |
mmoroz | 344a75ae | 2016-03-02 16:57:17 | [diff] [blame] | 111 | outputs = [ |
| 112 | "$root_build_dir/$config_name", |
| 113 | ] |
| 114 | } |
| 115 | test_deps += [ ":" + config_name ] |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 116 | } |
| 117 | |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 118 | test(target_name) { |
| 119 | forward_variables_from(invoker, |
| 120 | [ |
[email protected] | 419d0f9 | 2017-09-14 12:07:47 | [diff] [blame] | 121 | "cflags", |
| 122 | "cflags_cc", |
brettw | 6b0712a | 2016-07-15 17:48:20 | [diff] [blame] | 123 | "check_includes", |
wfh | dee978f | 2016-09-01 22:18:18 | [diff] [blame] | 124 | "defines", |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 125 | "include_dirs", |
brettw | 6b0712a | 2016-07-15 17:48:20 | [diff] [blame] | 126 | "sources", |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 127 | ]) |
| 128 | deps = test_deps |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 129 | |
| 130 | if (defined(invoker.additional_configs)) { |
| 131 | configs += invoker.additional_configs |
| 132 | } |
aizatsky | 345732a | 2016-04-14 22:30:44 | [diff] [blame] | 133 | configs += [ "//testing/libfuzzer:fuzzer_test_config" ] |
katrielc | 2bfe7048 | 2016-06-16 13:43:00 | [diff] [blame] | 134 | |
| 135 | # Used by WebRTC to suppress some Clang warnings in their codebase. |
| 136 | if (defined(invoker.suppressed_configs)) { |
| 137 | configs -= invoker.suppressed_configs |
| 138 | } |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 139 | } |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 140 | } else { |
| 141 | # noop on unsupported platforms. |
| 142 | # mark attributes as used. |
| 143 | assert(invoker.sources == [] || invoker.sources != []) |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 144 | if (defined(invoker.additional_configs)) { |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 145 | assert( |
| 146 | invoker.additional_configs == [] || invoker.additional_configs != []) |
| 147 | } |
| 148 | if (defined(invoker.deps)) { |
| 149 | assert(invoker.deps == [] || invoker.deps != []) |
| 150 | } |
| 151 | if (defined(invoker.dict)) { |
| 152 | assert(invoker.dict == [] || invoker.dict != []) |
| 153 | } |
mmoroz | 344a75ae | 2016-03-02 16:57:17 | [diff] [blame] | 154 | if (defined(invoker.libfuzzer_options)) { |
| 155 | assert(invoker.libfuzzer_options == [] || invoker.libfuzzer_options != []) |
| 156 | } |
aizatsky | 198e302 | 2016-03-08 21:33:46 | [diff] [blame] | 157 | if (defined(invoker.seed_corpus)) { |
| 158 | assert(invoker.seed_corpus == [] || invoker.seed_corpus != []) |
| 159 | } |
mmoroz | 2d9411b | 2017-02-09 12:01:37 | [diff] [blame] | 160 | if (defined(invoker.seed_corpuses)) { |
| 161 | assert(invoker.seed_corpuses == [] || invoker.seed_corpuses != []) |
| 162 | } |
brettw | 6b0712a | 2016-07-15 17:48:20 | [diff] [blame] | 163 | assert(!defined(invoker.check_includes) || invoker.check_includes != []) |
wfh | dee978f | 2016-09-01 22:18:18 | [diff] [blame] | 164 | assert(!defined(invoker.include_dirs) || invoker.include_dirs != []) |
| 165 | assert(!defined(invoker.defines) || invoker.defines != []) |
aizatsky | 43d459a5 | 2016-02-13 01:22:18 | [diff] [blame] | 166 | |
| 167 | group(target_name) { |
aizatsky | cb1a4393 | 2015-12-14 20:59:14 | [diff] [blame] | 168 | } |
| 169 | } |
| 170 | } |