|  | # Copyright 2014 The Chromium Authors | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  | """Creates IPC fuzzer packages suitable for uploading to ClusterFuzz. Stores | 
|  | the packages into chrome build directory. See fuzzer_list below for the list of | 
|  | fuzzers. | 
|  | """ | 
|  |  | 
|  | from __future__ import print_function | 
|  |  | 
|  | import argparse | 
|  | import distutils.archive_util | 
|  | import os | 
|  | import shutil | 
|  | import sys | 
|  | import tempfile | 
|  |  | 
|  | FUZZER_LIST = [ | 
|  | 'ipc_fuzzer_mut', | 
|  | 'ipc_fuzzer_gen', | 
|  | ] | 
|  |  | 
|  |  | 
|  | class CFPackageBuilder: | 
|  |  | 
|  | def __init__(self): | 
|  | self.fuzzer_list = FUZZER_LIST | 
|  |  | 
|  | def parse_arguments(self): | 
|  | desc = 'Builder of IPC fuzzer packages for ClusterFuzz' | 
|  | parser = argparse.ArgumentParser(description=desc) | 
|  | parser.add_argument( | 
|  | '--out-dir', | 
|  | dest='out_dir', | 
|  | default='out', | 
|  | help='output directory under src/ directory') | 
|  | parser.add_argument( | 
|  | '--build-type', | 
|  | dest='build_type', | 
|  | default='Release', | 
|  | help='Debug vs. Release build') | 
|  | self.args = parser.parse_args() | 
|  |  | 
|  | def set_application_paths(self): | 
|  | script_path = os.path.realpath(__file__) | 
|  | self.mutate_dir = os.path.dirname(script_path) | 
|  | src_dir = os.path.join(self.mutate_dir, os.pardir, os.pardir, os.pardir) | 
|  | src_dir = os.path.abspath(src_dir) | 
|  | out_dir = os.path.join(src_dir, self.args.out_dir) | 
|  | self.build_dir = os.path.join(out_dir, self.args.build_type) | 
|  |  | 
|  | def switch_to_temp_work_directory(self): | 
|  | self.old_cwd = os.getcwd() | 
|  | self.work_dir = tempfile.mkdtemp() | 
|  | os.chdir(self.work_dir) | 
|  |  | 
|  | def remove_temp_work_directory(self): | 
|  | os.chdir(self.old_cwd) | 
|  | shutil.rmtree(self.work_dir) | 
|  |  | 
|  | def build_package(self, fuzzer): | 
|  | os.makedirs(fuzzer) | 
|  | fuzzer_src_path = os.path.join(self.mutate_dir, fuzzer + '.py') | 
|  | fuzzer_dst_path = os.path.join(fuzzer, 'run.py') | 
|  | shutil.copyfile(fuzzer_src_path, fuzzer_dst_path) | 
|  | utils_src_path = os.path.join(self.mutate_dir, 'utils.py') | 
|  | utils_dst_path = os.path.join(fuzzer, 'utils.py') | 
|  | shutil.copyfile(utils_src_path, utils_dst_path) | 
|  | distutils.archive_util.make_zipfile(fuzzer, fuzzer) | 
|  | package_name = fuzzer + '.zip' | 
|  | shutil.copy(package_name, self.build_dir) | 
|  | final_package_path = os.path.join(self.build_dir, package_name) | 
|  | print('Built %s.' % final_package_path) | 
|  |  | 
|  | def main(self): | 
|  | self.parse_arguments() | 
|  | self.set_application_paths() | 
|  | self.switch_to_temp_work_directory() | 
|  | for fuzzer in self.fuzzer_list: | 
|  | self.build_package(fuzzer) | 
|  | self.remove_temp_work_directory() | 
|  |  | 
|  | return 0 | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | builder = CFPackageBuilder() | 
|  | sys.exit(builder.main()) |