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