#!/usr/bin/python2
#
# Copyright 2016 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()
