2 # Copyright 2014 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
6 """Generational ClusterFuzz fuzzer. It generates IPC messages using
7 GenerateTraits. Support of GenerateTraits for different types will be gradually
17 FUZZER_NAME_OPTION
= '--fuzzer-name=generate'
18 MAX_IPC_MESSAGES_PER_TESTCASE
= 1500
21 class GenerationalFuzzer
:
22 def parse_arguments(self
):
23 self
.args
= utils
.parse_arguments()
25 def set_application_paths(self
):
26 chrome_application_path
= utils
.get_application_path()
27 chrome_application_directory
= os
.path
.dirname(chrome_application_path
)
28 self
.ipc_fuzzer_binary
= utils
.get_fuzzer_application_name()
29 self
.ipc_replay_binary
= utils
.get_replay_application_name()
30 self
.ipc_fuzzer_binary_path
= os
.path
.join(
31 chrome_application_directory
, self
.ipc_fuzzer_binary
)
32 self
.ipc_replay_binary_path
= os
.path
.join(
33 chrome_application_directory
, self
.ipc_replay_binary
)
35 def generate_ipcdump_testcase(self
):
36 ipcdump_testcase_path
= (
37 utils
.random_ipcdump_testcase_path(self
.args
.output_dir
))
38 num_ipc_messages
= random
.randint(1, MAX_IPC_MESSAGES_PER_TESTCASE
)
39 count_option
= '--count=%d' % num_ipc_messages
42 self
.ipc_fuzzer_binary_path
,
45 ipcdump_testcase_path
,
48 if subprocess
.call(cmd
):
49 sys
.exit('%s failed.' % self
.ipc_fuzzer_binary
)
51 utils
.create_flags_file(ipcdump_testcase_path
, self
.ipc_replay_binary_path
)
54 self
.parse_arguments()
55 self
.set_application_paths()
56 for _
in xrange(self
.args
.no_of_files
):
57 self
.generate_ipcdump_testcase()
61 if __name__
== "__main__":
62 fuzzer
= GenerationalFuzzer()
63 sys
.exit(fuzzer
.main())