#!/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 os import platform import subprocess import sys def main(): if len(sys.argv) <= 1: print 'Usage: play_testcase.py [chrome_flag...] testcase' return 1 script_path = os.path.realpath(__file__) ipc_fuzzer_dir = os.path.dirname(script_path) out_dir = os.path.abspath(os.path.join(ipc_fuzzer_dir, os.pardir, os.pardir, 'out')); build_dir = '' chrome_path = '' chrome_binary = 'chrome' for build in ['Debug', 'Release']: try_build = os.path.join(out_dir, build) try_chrome = os.path.join(try_build, chrome_binary) if os.path.exists(try_chrome): build_dir = try_build chrome_path = try_chrome if not chrome_path: print 'chrome executable not found.' return 1 fuzzer_path = os.path.join(build_dir, 'ipc_fuzzer_replay') if not os.path.exists(fuzzer_path): print fuzzer_path + ' not found.' print ('Please use enable_ipc_fuzzer=1 GYP define and ' 'build ipc_fuzzer target.') return 1 prefixes = { '--renderer-cmd-prefix', '--gpu-launcher', '--plugin-launcher', '--ppapi-plugin-launcher', '--utility-cmd-prefix', } args = [ chrome_path, '--ipc-fuzzer-testcase=' + sys.argv[-1], '--no-sandbox', '--disable-kill-after-bad-ipc', ] launchers = {} for prefix in prefixes: launchers[prefix] = fuzzer_path for arg in sys.argv[1:-1]: if arg.find('=') != -1: switch, value = arg.split('=', 1) if switch in prefixes: launchers[switch] = value + ' ' + launchers[switch] continue args.append(arg) for switch, value in launchers.items(): args.append(switch + '=' + value) print args return subprocess.call(args) if __name__ == "__main__": sys.exit(main())