#!/usr/bin/env python # Copyright 2013 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. """Wrapper around chrome. Replaces all the child processes (renderer, GPU, plugins and utility) with the IPC fuzzer. The fuzzer will then play back a specified testcase. Depends on ipc_fuzzer being available on the same directory as chrome. """ import argparse import os import platform import subprocess import sys def main(): desc = 'Wrapper to run chrome with child processes replaced by IPC fuzzers' 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') parser.add_argument('--gdb-browser', dest='gdb_browser', default=False, action='store_true', help='run browser process inside gdb') parser.add_argument('testcase', help='IPC file to be replayed') parser.add_argument('chrome_args', nargs=argparse.REMAINDER, help='any additional arguments are passed to chrome') args = parser.parse_args() chrome_binary = 'chrome' fuzzer_binary = 'ipc_fuzzer_replay' 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, args.out_dir) build_dir = os.path.join(out_dir, args.build_type) chrome_path = os.path.join(build_dir, chrome_binary) if not os.path.exists(chrome_path): print 'chrome executable not found at ', chrome_path return 1 fuzzer_path = os.path.join(build_dir, fuzzer_binary) if not os.path.exists(fuzzer_path): print 'fuzzer executable not found at ', fuzzer_path print ('ensure GYP_DEFINES="enable_ipc_fuzzer=1" and build target ' + fuzzer_binary + '.') return 1 prefixes = { '--renderer-cmd-prefix', '--gpu-launcher', '--plugin-launcher', '--ppapi-plugin-launcher', '--utility-cmd-prefix', } chrome_command = [ chrome_path, '--ipc-fuzzer-testcase=' + args.testcase, '--no-sandbox', '--disable-kill-after-bad-ipc', ] if args.gdb_browser: chrome_command = ['gdb', '--args'] + chrome_command launchers = {} for prefix in prefixes: launchers[prefix] = fuzzer_path for arg in args.chrome_args: if arg.find('=') != -1: switch, value = arg.split('=', 1) if switch in prefixes: launchers[switch] = value + ' ' + launchers[switch] continue chrome_command.append(arg) for switch, value in launchers.items(): chrome_command.append(switch + '=' + value) command_line = ' '.join(['\'' + arg + '\'' for arg in chrome_command]) print 'Executing: ' + command_line return subprocess.call(chrome_command) if __name__ == "__main__": sys.exit(main())