#!/usr/bin/env python # Copyright (c) 2012 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. """This script is used by chrome_tests.gypi's js2webui action to maintain the argument lists and to generate inlinable tests. """ import json import optparse import os import subprocess import sys import shutil def HasSameContent(filename, content): '''Returns true if the given file is readable and has the given content.''' try: with open(filename) as file: return file.read() == content except: # Ignore all errors and fall back on a safe bet. return False def main (): parser = optparse.OptionParser() parser.set_usage( "%prog v8_shell mock.js test_api.js js2webui.js " "testtype inputfile inputrelfile cxxoutfile jsoutfile") parser.add_option('-v', '--verbose', action='store_true') parser.add_option('-n', '--impotent', action='store_true', help="don't execute; just print (as if verbose)") parser.add_option('--deps_js', action="store", help=("Path to deps.js for dependency resolution, " + "optional.")) parser.add_option('--external', action='store', help="Load V8's initial snapshot from external files (y/n)") (opts, args) = parser.parse_args() if len(args) != 9: parser.error('all arguments are required.') (v8_shell, mock_js, test_api, js2webui, test_type, inputfile, inputrelfile, cxxoutfile, jsoutfile) = args cmd = [v8_shell] icudatafile = os.path.join(os.path.dirname(v8_shell), 'icudtl.dat') if os.path.exists(icudatafile): cmd.extend(['--icu-data-file=%s' % icudatafile]) v8nativesfile = os.path.join(os.path.dirname(v8_shell), 'natives_blob.bin') if opts.external == 'y' and os.path.exists(v8nativesfile): cmd.extend(['--natives_blob=%s' % v8nativesfile]) v8snapshotfile = os.path.join(os.path.dirname(v8_shell), 'snapshot_blob.bin') if opts.external == 'y' and os.path.exists(v8snapshotfile): cmd.extend(['--snapshot_blob=%s' % v8snapshotfile]) arguments = [js2webui, inputfile, inputrelfile, opts.deps_js, cxxoutfile, test_type] cmd.extend(['-e', "arguments=" + json.dumps(arguments), mock_js, test_api, js2webui]) if opts.verbose or opts.impotent: print cmd if not opts.impotent: try: p = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=0) out, err = p.communicate() if not HasSameContent(cxxoutfile, out): with open(cxxoutfile, 'wb') as f: f.write(out) shutil.copyfile(inputfile, jsoutfile) except Exception, ex: if os.path.exists(cxxoutfile): os.remove(cxxoutfile) if os.path.exists(jsoutfile): os.remove(jsoutfile) raise if __name__ == '__main__': sys.exit(main())