#!/usr/bin/env python
# Copyright 2014 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.

"""Removes ViewHostMsg_Close and alike from testcases. These messages are an
annoyance for corpus distillation. They cause the browser to exit, so no
further messages are processed. On the other hand, ViewHostMsg_Close is useful
for fuzzing - many found bugs are related to a renderer disappearing. So the
fuzzer should be crafting random ViewHostMsg_Close messages.
"""

import argparse
import os
import platform
import shutil
import subprocess
import sys
import tempfile

def create_temp_file():
  temp_file = tempfile.NamedTemporaryFile(delete=False)
  temp_file.close()
  return temp_file.name

def main():
  desc = 'Remove ViewHostMsg_Close and alike from the testcases.'
  parser = argparse.ArgumentParser(description=desc)
  parser.add_argument('--out-dir', dest='out_dir', default='out',
                      help='ouput directory under src/ directory')
  parser.add_argument('--build-type', dest='build_type', default='Release',
                      help='Debug vs. Release build')
  parser.add_argument('testcase_dir',
                      help='Directory containing testcases')
  parsed = parser.parse_args()

  message_util_binary = 'ipc_message_util'

  script_path = os.path.realpath(__file__)
  ipc_fuzzer_dir = os.path.dirname(script_path)
  src_dir = os.path.abspath(os.path.join(ipc_fuzzer_dir, os.pardir, os.pardir))
  out_dir =  os.path.join(src_dir, parsed.out_dir);
  build_dir = os.path.join(out_dir, parsed.build_type)

  message_util_path = os.path.join(build_dir, message_util_binary)
  if not os.path.exists(message_util_path):
    print 'ipc_message_util executable not found at ', message_util_path
    return 1

  filter_command = [
    message_util_path,
    '--invert',
    '--regexp=ViewHostMsg_Close|ViewHostMsg_ClosePage_ACK',
    'input',
    'output',
  ]

  testcase_list = os.listdir(parsed.testcase_dir)
  testcase_count = len(testcase_list)
  index = 0
  for testcase in testcase_list:
    index += 1
    print '[%d/%d] Processing %s' % (index, testcase_count, testcase)
    testcase_path = os.path.join(parsed.testcase_dir, testcase)
    filtered_path = create_temp_file()
    filter_command[-2] = testcase_path
    filter_command[-1] = filtered_path
    subprocess.call(filter_command)
    shutil.move(filtered_path, testcase_path)

  return 0


if __name__ == "__main__":
  sys.exit(main())
