# 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())
