#!/usr/bin/env python2 # # Copyright 2019 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. """Archive corpus file into zip and generate .d depfile. Invoked by GN from fuzzer_test.gni. """ from __future__ import print_function import argparse import os import sys import warnings import zipfile SEED_CORPUS_LIMIT_MB = 100 def main(): parser = argparse.ArgumentParser(description="Generate fuzzer config.") parser.add_argument('corpus_directories', metavar='corpus_dir', type=str, nargs='+') parser.add_argument('--output', metavar='output_archive_name.zip', required=True) args = parser.parse_args() corpus_files = [] seed_corpus_path = args.output for directory in args.corpus_directories: if not os.path.exists(directory): raise Exception('The given seed_corpus directory (%s) does not exist.' % directory) for (dirpath, _, filenames) in os.walk(directory): for filename in filenames: full_filename = os.path.join(dirpath, filename) corpus_files.append(full_filename) with zipfile.ZipFile(seed_corpus_path, 'w') as z: # Turn warnings into errors to interrupt the build: crbug.com/653920. with warnings.catch_warnings(): warnings.simplefilter("error") for i, corpus_file in enumerate(corpus_files): # To avoid duplication of filenames inside the archive, use numbers. arcname = '%016d' % i z.write(corpus_file, arcname) if os.path.getsize(seed_corpus_path) > SEED_CORPUS_LIMIT_MB * 1024 * 1024: print('Seed corpus %s exceeds maximum allowed size (%d MB).' % (seed_corpus_path, SEED_CORPUS_LIMIT_MB)) sys.exit(-1) if __name__ == '__main__': main()