121939df44de1705786c545cd1bf519d47250322dBen Murdoch#!/usr/bin/python 221939df44de1705786c545cd1bf519d47250322dBen Murdoch# Copyright (C) 2010 Google Inc. All rights reserved. 321939df44de1705786c545cd1bf519d47250322dBen Murdoch# 421939df44de1705786c545cd1bf519d47250322dBen Murdoch# Redistribution and use in source and binary forms, with or without 521939df44de1705786c545cd1bf519d47250322dBen Murdoch# modification, are permitted provided that the following conditions 621939df44de1705786c545cd1bf519d47250322dBen Murdoch# are met: 721939df44de1705786c545cd1bf519d47250322dBen Murdoch# 1. Redistributions of source code must retain the above copyright 821939df44de1705786c545cd1bf519d47250322dBen Murdoch# notice, this list of conditions and the following disclaimer. 921939df44de1705786c545cd1bf519d47250322dBen Murdoch# 2. Redistributions in binary form must reproduce the above copyright 1021939df44de1705786c545cd1bf519d47250322dBen Murdoch# notice, this list of conditions and the following disclaimer in the 1121939df44de1705786c545cd1bf519d47250322dBen Murdoch# documentation and/or other materials provided with the distribution. 1221939df44de1705786c545cd1bf519d47250322dBen Murdoch# 1321939df44de1705786c545cd1bf519d47250322dBen Murdoch# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 1421939df44de1705786c545cd1bf519d47250322dBen Murdoch# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1521939df44de1705786c545cd1bf519d47250322dBen Murdoch# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1621939df44de1705786c545cd1bf519d47250322dBen Murdoch# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 1721939df44de1705786c545cd1bf519d47250322dBen Murdoch# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 1821939df44de1705786c545cd1bf519d47250322dBen Murdoch# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 1921939df44de1705786c545cd1bf519d47250322dBen Murdoch# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2021939df44de1705786c545cd1bf519d47250322dBen Murdoch# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 2121939df44de1705786c545cd1bf519d47250322dBen Murdoch# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2221939df44de1705786c545cd1bf519d47250322dBen Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2321939df44de1705786c545cd1bf519d47250322dBen Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2421939df44de1705786c545cd1bf519d47250322dBen Murdoch# 2521939df44de1705786c545cd1bf519d47250322dBen Murdoch 2621939df44de1705786c545cd1bf519d47250322dBen Murdoch# This script generates h and cpp file for TestObj.idl using the V8 code 2721939df44de1705786c545cd1bf519d47250322dBen Murdoch# generator. Please execute the script whenever changes are made to 2821939df44de1705786c545cd1bf519d47250322dBen Murdoch# CodeGeneratorV8.pm, and submit the changes in V8TestObj.h/cpp in the same 2921939df44de1705786c545cd1bf519d47250322dBen Murdoch# patch. This makes it easier to track and review changes in generated code. 3021939df44de1705786c545cd1bf519d47250322dBen Murdoch# To execute, invoke: 'python run_tests.py' 3121939df44de1705786c545cd1bf519d47250322dBen Murdoch 3221939df44de1705786c545cd1bf519d47250322dBen Murdochimport os 3321939df44de1705786c545cd1bf519d47250322dBen Murdochimport os.path 3421939df44de1705786c545cd1bf519d47250322dBen Murdochimport subprocess 3521939df44de1705786c545cd1bf519d47250322dBen Murdochimport sys 3621939df44de1705786c545cd1bf519d47250322dBen Murdochimport tempfile 3721939df44de1705786c545cd1bf519d47250322dBen Murdochfrom webkitpy.common.checkout import scm 3821939df44de1705786c545cd1bf519d47250322dBen Murdoch 3921939df44de1705786c545cd1bf519d47250322dBen Murdoch 4021939df44de1705786c545cd1bf519d47250322dBen Murdochdef generate_from_idl(generator, idl_file, output_directory): 4121939df44de1705786c545cd1bf519d47250322dBen Murdoch cmd = ['perl', '-w', 42cad810f21b803229eb11403f9209855525a25d57Steve Block '-ISource/WebCore/bindings/scripts', 43cad810f21b803229eb11403f9209855525a25d57Steve Block 'Source/WebCore/bindings/scripts/generate-bindings.pl', 4421939df44de1705786c545cd1bf519d47250322dBen Murdoch # idl include directories (path relative to generate-bindings.pl) 4521939df44de1705786c545cd1bf519d47250322dBen Murdoch '--include', '.', 4621939df44de1705786c545cd1bf519d47250322dBen Murdoch '--defines', 'TESTING_%s' % generator, 4721939df44de1705786c545cd1bf519d47250322dBen Murdoch '--generator', generator, 4821939df44de1705786c545cd1bf519d47250322dBen Murdoch '--outputDir', output_directory, 4921939df44de1705786c545cd1bf519d47250322dBen Murdoch idl_file] 5021939df44de1705786c545cd1bf519d47250322dBen Murdoch return subprocess.call(cmd) == 0 5121939df44de1705786c545cd1bf519d47250322dBen Murdoch 5221939df44de1705786c545cd1bf519d47250322dBen Murdoch 5321939df44de1705786c545cd1bf519d47250322dBen Murdochdef detect_changes(work_directory, reference_directory): 5421939df44de1705786c545cd1bf519d47250322dBen Murdoch changes_found = False 5521939df44de1705786c545cd1bf519d47250322dBen Murdoch for output_file in os.listdir(work_directory): 5621939df44de1705786c545cd1bf519d47250322dBen Murdoch print 'Detecting changes in %s...' % output_file 5721939df44de1705786c545cd1bf519d47250322dBen Murdoch cmd = ['diff', 5821939df44de1705786c545cd1bf519d47250322dBen Murdoch '-u', 5921939df44de1705786c545cd1bf519d47250322dBen Murdoch os.path.join(reference_directory, output_file), 6021939df44de1705786c545cd1bf519d47250322dBen Murdoch os.path.join(work_directory, output_file)] 6121939df44de1705786c545cd1bf519d47250322dBen Murdoch if subprocess.call(cmd) != 0: 6221939df44de1705786c545cd1bf519d47250322dBen Murdoch print 'Detected changes in %s (see above)' % output_file 6321939df44de1705786c545cd1bf519d47250322dBen Murdoch changes_found = True 6421939df44de1705786c545cd1bf519d47250322dBen Murdoch else: 6521939df44de1705786c545cd1bf519d47250322dBen Murdoch print 'No changes found.' 6621939df44de1705786c545cd1bf519d47250322dBen Murdoch 6721939df44de1705786c545cd1bf519d47250322dBen Murdoch return changes_found 6821939df44de1705786c545cd1bf519d47250322dBen Murdoch 6921939df44de1705786c545cd1bf519d47250322dBen Murdoch 7021939df44de1705786c545cd1bf519d47250322dBen Murdochdef run_tests(generator, input_directory, reference_directory, reset_results): 7121939df44de1705786c545cd1bf519d47250322dBen Murdoch work_directory = reference_directory 7221939df44de1705786c545cd1bf519d47250322dBen Murdoch 7321939df44de1705786c545cd1bf519d47250322dBen Murdoch passed = True 7421939df44de1705786c545cd1bf519d47250322dBen Murdoch for input_file in os.listdir(input_directory): 7521939df44de1705786c545cd1bf519d47250322dBen Murdoch (name, extension) = os.path.splitext(input_file) 7621939df44de1705786c545cd1bf519d47250322dBen Murdoch if extension != '.idl': 7721939df44de1705786c545cd1bf519d47250322dBen Murdoch continue 7821939df44de1705786c545cd1bf519d47250322dBen Murdoch print 'Testing the %s generator on %s' % (generator, input_file) 7921939df44de1705786c545cd1bf519d47250322dBen Murdoch # Generate output into the work directory (either the given one or a 8021939df44de1705786c545cd1bf519d47250322dBen Murdoch # temp one if not reset_results is performed) 8121939df44de1705786c545cd1bf519d47250322dBen Murdoch if not reset_results: 8221939df44de1705786c545cd1bf519d47250322dBen Murdoch work_directory = tempfile.mkdtemp() 8321939df44de1705786c545cd1bf519d47250322dBen Murdoch if not generate_from_idl(generator, os.path.join(input_directory, 8421939df44de1705786c545cd1bf519d47250322dBen Murdoch input_file), 8521939df44de1705786c545cd1bf519d47250322dBen Murdoch work_directory): 8621939df44de1705786c545cd1bf519d47250322dBen Murdoch passed = False 8721939df44de1705786c545cd1bf519d47250322dBen Murdoch if reset_results: 8821939df44de1705786c545cd1bf519d47250322dBen Murdoch print "Overwrote reference files" 8921939df44de1705786c545cd1bf519d47250322dBen Murdoch continue 9021939df44de1705786c545cd1bf519d47250322dBen Murdoch # Detect changes 9121939df44de1705786c545cd1bf519d47250322dBen Murdoch if detect_changes(work_directory, reference_directory): 9221939df44de1705786c545cd1bf519d47250322dBen Murdoch passed = False 9321939df44de1705786c545cd1bf519d47250322dBen Murdoch 9421939df44de1705786c545cd1bf519d47250322dBen Murdoch if not passed: 9521939df44de1705786c545cd1bf519d47250322dBen Murdoch print '%s generator failed.' % generator 9621939df44de1705786c545cd1bf519d47250322dBen Murdoch return passed 9721939df44de1705786c545cd1bf519d47250322dBen Murdoch 9821939df44de1705786c545cd1bf519d47250322dBen Murdoch 9921939df44de1705786c545cd1bf519d47250322dBen Murdochdef main(argv): 10021939df44de1705786c545cd1bf519d47250322dBen Murdoch """Runs WebCore bindings code generators on test IDL files and compares 10121939df44de1705786c545cd1bf519d47250322dBen Murdoch the results with reference files. 10221939df44de1705786c545cd1bf519d47250322dBen Murdoch 10321939df44de1705786c545cd1bf519d47250322dBen Murdoch Options: 10421939df44de1705786c545cd1bf519d47250322dBen Murdoch --reset-results: Overwrites the reference files with the generated results. 10521939df44de1705786c545cd1bf519d47250322dBen Murdoch 10621939df44de1705786c545cd1bf519d47250322dBen Murdoch """ 10721939df44de1705786c545cd1bf519d47250322dBen Murdoch reset_results = "--reset-results" in argv 10821939df44de1705786c545cd1bf519d47250322dBen Murdoch 10921939df44de1705786c545cd1bf519d47250322dBen Murdoch current_scm = scm.detect_scm_system(os.curdir) 11021939df44de1705786c545cd1bf519d47250322dBen Murdoch os.chdir(current_scm.checkout_root) 11121939df44de1705786c545cd1bf519d47250322dBen Murdoch 11221939df44de1705786c545cd1bf519d47250322dBen Murdoch all_tests_passed = True 11321939df44de1705786c545cd1bf519d47250322dBen Murdoch 11421939df44de1705786c545cd1bf519d47250322dBen Murdoch generators = [ 11521939df44de1705786c545cd1bf519d47250322dBen Murdoch 'JS', 11621939df44de1705786c545cd1bf519d47250322dBen Murdoch 'V8', 11721939df44de1705786c545cd1bf519d47250322dBen Murdoch 'ObjC', 11821939df44de1705786c545cd1bf519d47250322dBen Murdoch 'GObject', 119545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 'CPP' 12021939df44de1705786c545cd1bf519d47250322dBen Murdoch ] 12121939df44de1705786c545cd1bf519d47250322dBen Murdoch 12221939df44de1705786c545cd1bf519d47250322dBen Murdoch for generator in generators: 123cad810f21b803229eb11403f9209855525a25d57Steve Block input_directory = os.path.join('Source', 'WebCore', 'bindings', 'scripts', 'test') 124cad810f21b803229eb11403f9209855525a25d57Steve Block reference_directory = os.path.join('Source', 'WebCore', 'bindings', 'scripts', 'test', generator) 12521939df44de1705786c545cd1bf519d47250322dBen Murdoch if not run_tests(generator, input_directory, reference_directory, reset_results): 12621939df44de1705786c545cd1bf519d47250322dBen Murdoch all_tests_passed = False 12721939df44de1705786c545cd1bf519d47250322dBen Murdoch 12821939df44de1705786c545cd1bf519d47250322dBen Murdoch if all_tests_passed: 12921939df44de1705786c545cd1bf519d47250322dBen Murdoch print 'All tests passed!' 13021939df44de1705786c545cd1bf519d47250322dBen Murdoch return 0 13121939df44de1705786c545cd1bf519d47250322dBen Murdoch else: 132545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch print '(To update the reference files, execute "run-bindings-tests --reset-results")' 13321939df44de1705786c545cd1bf519d47250322dBen Murdoch return -1 13421939df44de1705786c545cd1bf519d47250322dBen Murdoch 13521939df44de1705786c545cd1bf519d47250322dBen Murdoch 13621939df44de1705786c545cd1bf519d47250322dBen Murdochif __name__ == '__main__': 13721939df44de1705786c545cd1bf519d47250322dBen Murdoch sys.exit(main(sys.argv)) 138