xref: /aosp_15_r20/external/cronet/testing/libfuzzer/fuzzer_test.gni (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker# Defines fuzzer_test.
6*6777b538SAndroid Build Coastguard Worker#
7*6777b538SAndroid Build Coastguard Workerimport("//build/config/features.gni")
8*6777b538SAndroid Build Coastguard Workerimport("//build/config/sanitizers/sanitizers.gni")
9*6777b538SAndroid Build Coastguard Workerimport("//testing/test.gni")
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker# fuzzer_test is used to define individual libfuzzer tests.
12*6777b538SAndroid Build Coastguard Worker#
13*6777b538SAndroid Build Coastguard Worker# Supported attributes:
14*6777b538SAndroid Build Coastguard Worker# - (required) sources - fuzzer test source files
15*6777b538SAndroid Build Coastguard Worker# - deps - test dependencies
16*6777b538SAndroid Build Coastguard Worker# - libs - Additional libraries to link.
17*6777b538SAndroid Build Coastguard Worker# - frameworks - Apple-only. Additional frameworks to link.
18*6777b538SAndroid Build Coastguard Worker# - additional_configs - additional configs to be used for compilation
19*6777b538SAndroid Build Coastguard Worker# - dict - a dictionary file for the fuzzer.
20*6777b538SAndroid Build Coastguard Worker# - environment_variables - certain whitelisted environment variables for the
21*6777b538SAndroid Build Coastguard Worker# fuzzer (AFL_DRIVER_DONT_DEFER is the only one allowed currently).
22*6777b538SAndroid Build Coastguard Worker# - libfuzzer_options - options for the fuzzer (e.g. close_fd_mask=N).
23*6777b538SAndroid Build Coastguard Worker#   These are mostly applied only when the fuzzer is being run using the
24*6777b538SAndroid Build Coastguard Worker#   libfuzzer fuzzing engine, but a few of these may be interpreted by
25*6777b538SAndroid Build Coastguard Worker#   other fuzzing engines too
26*6777b538SAndroid Build Coastguard Worker# - centipede_options - options for the fuzzer (e.g. shmem_size_mb=N)
27*6777b538SAndroid Build Coastguard Worker#   when running using the centipede fuzzing engine.
28*6777b538SAndroid Build Coastguard Worker# - asan_options - AddressSanitizer options (e.g. allow_user_segv_handler=1).
29*6777b538SAndroid Build Coastguard Worker# - msan_options - MemorySanitizer options.
30*6777b538SAndroid Build Coastguard Worker# - ubsan_options - UndefinedBehaviorSanitizer options.
31*6777b538SAndroid Build Coastguard Worker# - seed_corpus - a directory with seed corpus.
32*6777b538SAndroid Build Coastguard Worker# - seed_corpus_deps - dependencies for generating the seed corpus.
33*6777b538SAndroid Build Coastguard Worker# - grammar_options - defines a grammar used by a grammar based mutator.
34*6777b538SAndroid Build Coastguard Worker# - exclude_main - if you're going to provide your own 'main' function
35*6777b538SAndroid Build Coastguard Worker# - high_end_job_required - whether the fuzzer requires bigger machines to run.
36*6777b538SAndroid Build Coastguard Worker#   Optional argument.
37*6777b538SAndroid Build Coastguard Worker#
38*6777b538SAndroid Build Coastguard Worker# If use_libfuzzer gn flag is defined, then proper fuzzer would be build.
39*6777b538SAndroid Build Coastguard Worker# Without use_libfuzzer or use_afl a unit-test style binary would be built on
40*6777b538SAndroid Build Coastguard Worker# linux and the whole target is a no-op otherwise.
41*6777b538SAndroid Build Coastguard Worker#
42*6777b538SAndroid Build Coastguard Worker# The template wraps test() target with appropriate dependencies.
43*6777b538SAndroid Build Coastguard Worker# If any test run-time options are present (dict or libfuzzer_options), then a
44*6777b538SAndroid Build Coastguard Worker# config (.options file) file would be generated or modified in root output
45*6777b538SAndroid Build Coastguard Worker# dir (next to test).
46*6777b538SAndroid Build Coastguard Workertemplate("fuzzer_test") {
47*6777b538SAndroid Build Coastguard Worker  _high_end_job_required = false
48*6777b538SAndroid Build Coastguard Worker  if (defined(invoker.high_end_job_required)) {
49*6777b538SAndroid Build Coastguard Worker    _high_end_job_required = invoker.high_end_job_required
50*6777b538SAndroid Build Coastguard Worker  }
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker  # If the job is a high_end job and that we are currently building a high_end
53*6777b538SAndroid Build Coastguard Worker  # target, we should compile this fuzzer_test in. Otherwise, for now, we just
54*6777b538SAndroid Build Coastguard Worker  # compile everything in.
55*6777b538SAndroid Build Coastguard Worker  # TODO(crbug.com/333831251): Once CF supports high end jobs, do not compile
56*6777b538SAndroid Build Coastguard Worker  # high end targets except for high end jobs.
57*6777b538SAndroid Build Coastguard Worker  _should_build = (_high_end_job_required || !high_end_fuzzer_targets) &&
58*6777b538SAndroid Build Coastguard Worker                  !disable_libfuzzer && use_fuzzing_engine
59*6777b538SAndroid Build Coastguard Worker  if (_should_build) {
60*6777b538SAndroid Build Coastguard Worker    assert(defined(invoker.sources), "Need sources in $target_name.")
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker    test_deps = []
63*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.exclude_main) && invoker.exclude_main) {
64*6777b538SAndroid Build Coastguard Worker      test_deps += [ "//testing/libfuzzer:fuzzing_engine_no_main" ]
65*6777b538SAndroid Build Coastguard Worker    } else {
66*6777b538SAndroid Build Coastguard Worker      test_deps += [ "//testing/libfuzzer:fuzzing_engine_main" ]
67*6777b538SAndroid Build Coastguard Worker    }
68*6777b538SAndroid Build Coastguard Worker    test_data_deps = []
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.deps)) {
71*6777b538SAndroid Build Coastguard Worker      test_deps += invoker.deps
72*6777b538SAndroid Build Coastguard Worker    }
73*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.data_deps)) {
74*6777b538SAndroid Build Coastguard Worker      test_data_deps += invoker.data_deps
75*6777b538SAndroid Build Coastguard Worker    }
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker    supporting_file_test_deps = []
78*6777b538SAndroid Build Coastguard Worker    supporting_file_test_data_deps = []
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.seed_corpus) || defined(invoker.seed_corpuses)) {
81*6777b538SAndroid Build Coastguard Worker      assert(!(defined(invoker.seed_corpus) && defined(invoker.seed_corpuses)),
82*6777b538SAndroid Build Coastguard Worker             "Do not use both seed_corpus and seed_corpuses for $target_name.")
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker      out = "$root_build_dir/$target_name" + "_seed_corpus.zip"
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker      seed_corpus_deps = []
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.seed_corpus_deps)) {
89*6777b538SAndroid Build Coastguard Worker        seed_corpus_deps += invoker.seed_corpus_deps
90*6777b538SAndroid Build Coastguard Worker      }
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker      action(target_name + "_seed_corpus") {
93*6777b538SAndroid Build Coastguard Worker        script = "//testing/libfuzzer/archive_corpus.py"
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker        testonly = true
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker        args = [
98*6777b538SAndroid Build Coastguard Worker          "--output",
99*6777b538SAndroid Build Coastguard Worker          rebase_path(out, root_build_dir),
100*6777b538SAndroid Build Coastguard Worker        ]
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.seed_corpus)) {
103*6777b538SAndroid Build Coastguard Worker          args += [ rebase_path(invoker.seed_corpus, root_build_dir) ]
104*6777b538SAndroid Build Coastguard Worker        }
105*6777b538SAndroid Build Coastguard Worker
106*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.seed_corpuses)) {
107*6777b538SAndroid Build Coastguard Worker          foreach(seed_corpus_path, invoker.seed_corpuses) {
108*6777b538SAndroid Build Coastguard Worker            args += [ rebase_path(seed_corpus_path, root_build_dir) ]
109*6777b538SAndroid Build Coastguard Worker          }
110*6777b538SAndroid Build Coastguard Worker        }
111*6777b538SAndroid Build Coastguard Worker
112*6777b538SAndroid Build Coastguard Worker        outputs = [ out ]
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker        deps = [ "//testing/libfuzzer:seed_corpus" ] + seed_corpus_deps
115*6777b538SAndroid Build Coastguard Worker      }
116*6777b538SAndroid Build Coastguard Worker
117*6777b538SAndroid Build Coastguard Worker      if (archive_seed_corpus) {
118*6777b538SAndroid Build Coastguard Worker        supporting_file_test_deps += [ ":" + target_name + "_seed_corpus" ]
119*6777b538SAndroid Build Coastguard Worker      }
120*6777b538SAndroid Build Coastguard Worker    }
121*6777b538SAndroid Build Coastguard Worker
122*6777b538SAndroid Build Coastguard Worker    if (defined(invoker.dict) || defined(invoker.libfuzzer_options) ||
123*6777b538SAndroid Build Coastguard Worker        defined(invoker.centipede_options) || defined(invoker.asan_options) ||
124*6777b538SAndroid Build Coastguard Worker        defined(invoker.msan_options) || defined(invoker.ubsan_options) ||
125*6777b538SAndroid Build Coastguard Worker        defined(invoker.environment_variables) ||
126*6777b538SAndroid Build Coastguard Worker        defined(invoker.grammar_options)) {
127*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.dict)) {
128*6777b538SAndroid Build Coastguard Worker        # Copy dictionary to output.
129*6777b538SAndroid Build Coastguard Worker        copy(target_name + "_dict_copy") {
130*6777b538SAndroid Build Coastguard Worker          sources = [ invoker.dict ]
131*6777b538SAndroid Build Coastguard Worker          outputs = [ "$root_build_dir/" + target_name + ".dict" ]
132*6777b538SAndroid Build Coastguard Worker        }
133*6777b538SAndroid Build Coastguard Worker        supporting_file_test_deps += [ ":" + target_name + "_dict_copy" ]
134*6777b538SAndroid Build Coastguard Worker      }
135*6777b538SAndroid Build Coastguard Worker
136*6777b538SAndroid Build Coastguard Worker      fuzzer_name = target_name
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker      # Generate .options file.
139*6777b538SAndroid Build Coastguard Worker      config_file_name = target_name + ".options"
140*6777b538SAndroid Build Coastguard Worker      action(config_file_name) {
141*6777b538SAndroid Build Coastguard Worker        script = "//testing/libfuzzer/gen_fuzzer_config.py"
142*6777b538SAndroid Build Coastguard Worker        args = [
143*6777b538SAndroid Build Coastguard Worker          "--config",
144*6777b538SAndroid Build Coastguard Worker          rebase_path("$root_build_dir/" + config_file_name, root_build_dir),
145*6777b538SAndroid Build Coastguard Worker        ]
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.dict)) {
148*6777b538SAndroid Build Coastguard Worker          args += [
149*6777b538SAndroid Build Coastguard Worker            "--dict",
150*6777b538SAndroid Build Coastguard Worker            rebase_path("$root_build_dir/" + fuzzer_name + ".dict",
151*6777b538SAndroid Build Coastguard Worker                        root_build_dir),
152*6777b538SAndroid Build Coastguard Worker          ]
153*6777b538SAndroid Build Coastguard Worker        } else {
154*6777b538SAndroid Build Coastguard Worker          not_needed([ "fuzzer_name" ])
155*6777b538SAndroid Build Coastguard Worker        }
156*6777b538SAndroid Build Coastguard Worker
157*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.libfuzzer_options)) {
158*6777b538SAndroid Build Coastguard Worker          args += [ "--libfuzzer_options" ]
159*6777b538SAndroid Build Coastguard Worker          args += invoker.libfuzzer_options
160*6777b538SAndroid Build Coastguard Worker        }
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.centipede_options)) {
163*6777b538SAndroid Build Coastguard Worker          args += [ "--centipede_options" ]
164*6777b538SAndroid Build Coastguard Worker          args += invoker.centipede_options
165*6777b538SAndroid Build Coastguard Worker        }
166*6777b538SAndroid Build Coastguard Worker
167*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.asan_options)) {
168*6777b538SAndroid Build Coastguard Worker          args += [ "--asan_options" ]
169*6777b538SAndroid Build Coastguard Worker          args += invoker.asan_options
170*6777b538SAndroid Build Coastguard Worker        }
171*6777b538SAndroid Build Coastguard Worker
172*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.msan_options)) {
173*6777b538SAndroid Build Coastguard Worker          args += [ "--msan_options" ]
174*6777b538SAndroid Build Coastguard Worker          args += invoker.msan_options
175*6777b538SAndroid Build Coastguard Worker        }
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.ubsan_options)) {
178*6777b538SAndroid Build Coastguard Worker          args += [ "--ubsan_options" ]
179*6777b538SAndroid Build Coastguard Worker          args += invoker.ubsan_options
180*6777b538SAndroid Build Coastguard Worker        }
181*6777b538SAndroid Build Coastguard Worker
182*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.environment_variables)) {
183*6777b538SAndroid Build Coastguard Worker          args += [ "--environment_variables" ]
184*6777b538SAndroid Build Coastguard Worker          args += invoker.environment_variables
185*6777b538SAndroid Build Coastguard Worker        }
186*6777b538SAndroid Build Coastguard Worker
187*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.grammar_options)) {
188*6777b538SAndroid Build Coastguard Worker          args += [ "--grammar_options" ]
189*6777b538SAndroid Build Coastguard Worker          args += invoker.grammar_options
190*6777b538SAndroid Build Coastguard Worker        }
191*6777b538SAndroid Build Coastguard Worker
192*6777b538SAndroid Build Coastguard Worker        outputs = [ "$root_build_dir/$config_file_name" ]
193*6777b538SAndroid Build Coastguard Worker      }
194*6777b538SAndroid Build Coastguard Worker      test_data_deps += [ ":" + config_file_name ]
195*6777b538SAndroid Build Coastguard Worker      supporting_file_test_deps += [ ":" + config_file_name ]
196*6777b538SAndroid Build Coastguard Worker    }
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard Worker    if (generate_fuzzer_owners) {
199*6777b538SAndroid Build Coastguard Worker      # Generating owners files is slow, only enable when fuzzing engine is
200*6777b538SAndroid Build Coastguard Worker      # used.
201*6777b538SAndroid Build Coastguard Worker      owners_file_name = target_name + ".owners"
202*6777b538SAndroid Build Coastguard Worker      action(owners_file_name) {
203*6777b538SAndroid Build Coastguard Worker        script = "//testing/libfuzzer/gen_fuzzer_owners.py"
204*6777b538SAndroid Build Coastguard Worker        pool = "//testing/libfuzzer:fuzzer_owners_pool"
205*6777b538SAndroid Build Coastguard Worker        args = [
206*6777b538SAndroid Build Coastguard Worker          "--owners",
207*6777b538SAndroid Build Coastguard Worker          rebase_path("$root_build_dir/" + owners_file_name, root_build_dir),
208*6777b538SAndroid Build Coastguard Worker        ]
209*6777b538SAndroid Build Coastguard Worker
210*6777b538SAndroid Build Coastguard Worker        if (defined(invoker.sources) && invoker.sources != []) {
211*6777b538SAndroid Build Coastguard Worker          args += [ "--sources" ] + rebase_path(invoker.sources, "//")
212*6777b538SAndroid Build Coastguard Worker        } else if (defined(invoker.deps) && invoker.deps != []) {
213*6777b538SAndroid Build Coastguard Worker          _full_deps = []
214*6777b538SAndroid Build Coastguard Worker          foreach(_dep, invoker.deps) {
215*6777b538SAndroid Build Coastguard Worker            _full_deps += [ get_label_info(_dep, "dir") + ":" +
216*6777b538SAndroid Build Coastguard Worker                            get_label_info(_dep, "name") ]
217*6777b538SAndroid Build Coastguard Worker          }
218*6777b538SAndroid Build Coastguard Worker          args += [
219*6777b538SAndroid Build Coastguard Worker                    "--build-dir",
220*6777b538SAndroid Build Coastguard Worker                    rebase_path("$root_build_dir/", root_build_dir),
221*6777b538SAndroid Build Coastguard Worker                    "--deps",
222*6777b538SAndroid Build Coastguard Worker                  ] + _full_deps
223*6777b538SAndroid Build Coastguard Worker        }
224*6777b538SAndroid Build Coastguard Worker
225*6777b538SAndroid Build Coastguard Worker        outputs = [ "$root_build_dir/$owners_file_name" ]
226*6777b538SAndroid Build Coastguard Worker      }
227*6777b538SAndroid Build Coastguard Worker      supporting_file_test_data_deps += [ ":" + owners_file_name ]
228*6777b538SAndroid Build Coastguard Worker    }
229*6777b538SAndroid Build Coastguard Worker
230*6777b538SAndroid Build Coastguard Worker    # Copy to executable folder and codesign for catalyst
231*6777b538SAndroid Build Coastguard Worker    if (is_ios) {
232*6777b538SAndroid Build Coastguard Worker      # iOS only supports fuzzer in catalyst environment.
233*6777b538SAndroid Build Coastguard Worker      assert(target_environment == "catalyst")
234*6777b538SAndroid Build Coastguard Worker
235*6777b538SAndroid Build Coastguard Worker      # Loop over two kinds of deps to codesign these in two |action_foreach|s.
236*6777b538SAndroid Build Coastguard Worker      # Use the "test_deps", "test_data_deps" as identifiers in for loop.
237*6777b538SAndroid Build Coastguard Worker      foreach(_deps_type_label,
238*6777b538SAndroid Build Coastguard Worker              [
239*6777b538SAndroid Build Coastguard Worker                "test_deps",
240*6777b538SAndroid Build Coastguard Worker                "test_data_deps",
241*6777b538SAndroid Build Coastguard Worker              ]) {
242*6777b538SAndroid Build Coastguard Worker        _dep_list = []
243*6777b538SAndroid Build Coastguard Worker        if (_deps_type_label == "test_deps") {
244*6777b538SAndroid Build Coastguard Worker          _dep_list = supporting_file_test_deps
245*6777b538SAndroid Build Coastguard Worker        } else {
246*6777b538SAndroid Build Coastguard Worker          _dep_list = supporting_file_test_data_deps
247*6777b538SAndroid Build Coastguard Worker        }
248*6777b538SAndroid Build Coastguard Worker        _files_to_sign = []
249*6777b538SAndroid Build Coastguard Worker        foreach(dep, _dep_list) {
250*6777b538SAndroid Build Coastguard Worker          _files_to_sign += get_target_outputs(dep)
251*6777b538SAndroid Build Coastguard Worker        }
252*6777b538SAndroid Build Coastguard Worker        if (_files_to_sign != []) {
253*6777b538SAndroid Build Coastguard Worker          _codesign_action_name =
254*6777b538SAndroid Build Coastguard Worker              target_name + "_codesign_supporting_files_" + _deps_type_label
255*6777b538SAndroid Build Coastguard Worker          action_foreach(_codesign_action_name) {
256*6777b538SAndroid Build Coastguard Worker            testonly = true
257*6777b538SAndroid Build Coastguard Worker            script = "//build/config/ios/codesign.py"
258*6777b538SAndroid Build Coastguard Worker            sources = _files_to_sign
259*6777b538SAndroid Build Coastguard Worker            _codesign_output_path =
260*6777b538SAndroid Build Coastguard Worker                "${root_build_dir}/codesign/{{source_file_part}}"
261*6777b538SAndroid Build Coastguard Worker            outputs = [ _codesign_output_path ]
262*6777b538SAndroid Build Coastguard Worker            args = [
263*6777b538SAndroid Build Coastguard Worker              "code-sign-file",
264*6777b538SAndroid Build Coastguard Worker              "--identity=" + ios_code_signing_identity,
265*6777b538SAndroid Build Coastguard Worker              "--output=" + rebase_path(_codesign_output_path, root_build_dir),
266*6777b538SAndroid Build Coastguard Worker              "{{source}}",
267*6777b538SAndroid Build Coastguard Worker            ]
268*6777b538SAndroid Build Coastguard Worker            deps = _dep_list
269*6777b538SAndroid Build Coastguard Worker          }
270*6777b538SAndroid Build Coastguard Worker          _bundle_data_name = target_name + "_bundle_data_" + _deps_type_label
271*6777b538SAndroid Build Coastguard Worker          bundle_data(_bundle_data_name) {
272*6777b538SAndroid Build Coastguard Worker            testonly = true
273*6777b538SAndroid Build Coastguard Worker            sources = get_target_outputs(":${_codesign_action_name}")
274*6777b538SAndroid Build Coastguard Worker            outputs = [ "{{bundle_executable_dir}}/{{source_file_part}}" ]
275*6777b538SAndroid Build Coastguard Worker            public_deps = [ ":${_codesign_action_name}" ]
276*6777b538SAndroid Build Coastguard Worker          }
277*6777b538SAndroid Build Coastguard Worker          if (_deps_type_label == "test_deps") {
278*6777b538SAndroid Build Coastguard Worker            test_deps += [ ":${_bundle_data_name}" ]
279*6777b538SAndroid Build Coastguard Worker          } else {
280*6777b538SAndroid Build Coastguard Worker            test_data_deps += [ ":${_bundle_data_name}" ]
281*6777b538SAndroid Build Coastguard Worker          }
282*6777b538SAndroid Build Coastguard Worker        }
283*6777b538SAndroid Build Coastguard Worker      }
284*6777b538SAndroid Build Coastguard Worker    } else {
285*6777b538SAndroid Build Coastguard Worker      test_deps += supporting_file_test_deps
286*6777b538SAndroid Build Coastguard Worker      test_data_deps += supporting_file_test_data_deps
287*6777b538SAndroid Build Coastguard Worker    }
288*6777b538SAndroid Build Coastguard Worker
289*6777b538SAndroid Build Coastguard Worker    test(target_name) {
290*6777b538SAndroid Build Coastguard Worker      forward_variables_from(invoker,
291*6777b538SAndroid Build Coastguard Worker                             [
292*6777b538SAndroid Build Coastguard Worker                               "cflags",
293*6777b538SAndroid Build Coastguard Worker                               "cflags_cc",
294*6777b538SAndroid Build Coastguard Worker                               "check_includes",
295*6777b538SAndroid Build Coastguard Worker                               "defines",
296*6777b538SAndroid Build Coastguard Worker                               "include_dirs",
297*6777b538SAndroid Build Coastguard Worker                               "output_name",
298*6777b538SAndroid Build Coastguard Worker                               "sources",
299*6777b538SAndroid Build Coastguard Worker                               "libs",
300*6777b538SAndroid Build Coastguard Worker                               "frameworks",
301*6777b538SAndroid Build Coastguard Worker                             ])
302*6777b538SAndroid Build Coastguard Worker      deps = test_deps
303*6777b538SAndroid Build Coastguard Worker      data_deps = test_data_deps
304*6777b538SAndroid Build Coastguard Worker
305*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.additional_configs)) {
306*6777b538SAndroid Build Coastguard Worker        configs += invoker.additional_configs
307*6777b538SAndroid Build Coastguard Worker      }
308*6777b538SAndroid Build Coastguard Worker      configs += [ "//testing/libfuzzer:fuzzer_test_config" ]
309*6777b538SAndroid Build Coastguard Worker
310*6777b538SAndroid Build Coastguard Worker      # Used by WebRTC to suppress some Clang warnings in their codebase.
311*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.suppressed_configs)) {
312*6777b538SAndroid Build Coastguard Worker        configs -= invoker.suppressed_configs
313*6777b538SAndroid Build Coastguard Worker      }
314*6777b538SAndroid Build Coastguard Worker
315*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.generated_sources)) {
316*6777b538SAndroid Build Coastguard Worker        sources += invoker.generated_sources
317*6777b538SAndroid Build Coastguard Worker      }
318*6777b538SAndroid Build Coastguard Worker
319*6777b538SAndroid Build Coastguard Worker      if (is_ios) {
320*6777b538SAndroid Build Coastguard Worker        info_plist =
321*6777b538SAndroid Build Coastguard Worker            "//testing/libfuzzer/fuzzer_support_ios/fuzzer-engine-Info.plist"
322*6777b538SAndroid Build Coastguard Worker      }
323*6777b538SAndroid Build Coastguard Worker
324*6777b538SAndroid Build Coastguard Worker      if (is_mac) {
325*6777b538SAndroid Build Coastguard Worker        sources += [ "//testing/libfuzzer/libfuzzer_exports.h" ]
326*6777b538SAndroid Build Coastguard Worker      }
327*6777b538SAndroid Build Coastguard Worker    }
328*6777b538SAndroid Build Coastguard Worker  } else {
329*6777b538SAndroid Build Coastguard Worker    # noop on unsupported platforms.
330*6777b538SAndroid Build Coastguard Worker    # mark attributes as used.
331*6777b538SAndroid Build Coastguard Worker    not_needed(invoker, "*")
332*6777b538SAndroid Build Coastguard Worker    not_needed(invoker,
333*6777b538SAndroid Build Coastguard Worker               [
334*6777b538SAndroid Build Coastguard Worker                 "deps",
335*6777b538SAndroid Build Coastguard Worker                 "seed_corpus",
336*6777b538SAndroid Build Coastguard Worker                 "sources",
337*6777b538SAndroid Build Coastguard Worker               ])
338*6777b538SAndroid Build Coastguard Worker
339*6777b538SAndroid Build Coastguard Worker    group(target_name) {
340*6777b538SAndroid Build Coastguard Worker    }
341*6777b538SAndroid Build Coastguard Worker  }
342*6777b538SAndroid Build Coastguard Worker}
343