| OLD | NEW | 
|    1 # Copyright (C) 2011 Google Inc.  All rights reserved. |    1 # Copyright (C) 2011 Google Inc.  All rights reserved. | 
|    2 # |    2 # | 
|    3 # Redistribution and use in source and binary forms, with or without |    3 # Redistribution and use in source and binary forms, with or without | 
|    4 # modification, are permitted provided that the following conditions |    4 # modification, are permitted provided that the following conditions | 
|    5 # are met: |    5 # are met: | 
|    6 # 1. Redistributions of source code must retain the above copyright |    6 # 1. Redistributions of source code must retain the above copyright | 
|    7 #    notice, this list of conditions and the following disclaimer. |    7 #    notice, this list of conditions and the following disclaimer. | 
|    8 # 2. Redistributions in binary form must reproduce the above copyright |    8 # 2. Redistributions in binary form must reproduce the above copyright | 
|    9 #    notice, this list of conditions and the following disclaimer in the |    9 #    notice, this list of conditions and the following disclaimer in the | 
|   10 #    documentation and/or other materials provided with the distribution. |   10 #    documentation and/or other materials provided with the distribution. | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|   38 module_path = os.path.dirname(__file__) |   38 module_path = os.path.dirname(__file__) | 
|   39 source_path = os.path.normpath(os.path.join(module_path, os.pardir, os.pardir, |   39 source_path = os.path.normpath(os.path.join(module_path, os.pardir, os.pardir, | 
|   40                                             os.pardir, os.pardir, 'Source')) |   40                                             os.pardir, os.pardir, 'Source')) | 
|   41 sys.path.append(source_path)  # for Source/bindings imports |   41 sys.path.append(source_path)  # for Source/bindings imports | 
|   42  |   42  | 
|   43 import bindings.scripts.compute_interfaces_info_individual |   43 import bindings.scripts.compute_interfaces_info_individual | 
|   44 from bindings.scripts.compute_interfaces_info_individual import compute_info_ind
     ividual, info_individual |   44 from bindings.scripts.compute_interfaces_info_individual import compute_info_ind
     ividual, info_individual | 
|   45 import bindings.scripts.compute_interfaces_info_overall |   45 import bindings.scripts.compute_interfaces_info_overall | 
|   46 from bindings.scripts.compute_interfaces_info_overall import compute_interfaces_
     info_overall, interfaces_info |   46 from bindings.scripts.compute_interfaces_info_overall import compute_interfaces_
     info_overall, interfaces_info | 
|   47 from bindings.scripts.idl_compiler import IdlCompilerDictionaryImpl, IdlCompiler
     V8 |   47 from bindings.scripts.idl_compiler import IdlCompilerDictionaryImpl, IdlCompiler
     V8 | 
 |   48 from bindings.scripts.idl_reader import IdlReader | 
|   48 from bindings.scripts.utilities import idl_filename_to_component |   49 from bindings.scripts.utilities import idl_filename_to_component | 
|   49  |   50  | 
|   50  |   51  | 
|   51 PASS_MESSAGE = 'All tests PASS!' |   52 PASS_MESSAGE = 'All tests PASS!' | 
|   52 FAIL_MESSAGE = """Some tests FAIL! |   53 FAIL_MESSAGE = """Some tests FAIL! | 
|   53 To update the reference files, execute: |   54 To update the reference files, execute: | 
|   54     run-bindings-tests --reset-results |   55     run-bindings-tests --reset-results | 
|   55  |   56  | 
|   56 If the failures are not due to your changes, test results may be out of sync; |   57 If the failures are not due to your changes, test results may be out of sync; | 
|   57 please rebaseline them in a separate CL, after checking that tests fail in ToT. |   58 please rebaseline them in a separate CL, after checking that tests fail in ToT. | 
|   58 In CL, please set: |   59 In CL, please set: | 
|   59 NOTRY=true |   60 NOTRY=true | 
|   60 TBR=(someone in Source/bindings/OWNERS or WATCHLISTS:bindings) |   61 TBR=(someone in Source/bindings/OWNERS or WATCHLISTS:bindings) | 
|   61 """ |   62 """ | 
|   62  |   63  | 
|   63 DEPENDENCY_IDL_FILES = frozenset([ |   64 DEPENDENCY_IDL_FILES = frozenset([ | 
|   64     'TestImplements.idl', |   65     'TestImplements.idl', | 
|   65     'TestImplements2.idl', |   66     'TestImplements2.idl', | 
|   66     'TestImplements3.idl', |   67     'TestImplements3.idl', | 
|   67     'TestPartialInterface.idl', |   68     'TestPartialInterface.idl', | 
|   68     'TestPartialInterface2.idl', |   69     'TestPartialInterface2.idl', | 
|   69     'TestPartialInterface3.idl', |   70     'TestPartialInterface3.idl', | 
|   70 ]) |   71 ]) | 
|   71  |   72  | 
 |   73 # core/inspector/InspectorInstrumentation.idl is not a valid Blink IDL. | 
 |   74 NON_BLINK_IDL_FILES = frozenset([ | 
 |   75     'InspectorInstrumentation.idl', | 
 |   76 ]) | 
 |   77  | 
|   72 COMPONENT_DIRECTORY = frozenset(['core', 'modules']) |   78 COMPONENT_DIRECTORY = frozenset(['core', 'modules']) | 
|   73  |   79  | 
|   74 test_input_directory = os.path.join(source_path, 'bindings', 'tests', 'idls') |   80 test_input_directory = os.path.join(source_path, 'bindings', 'tests', 'idls') | 
|   75 reference_directory = os.path.join(source_path, 'bindings', 'tests', 'results') |   81 reference_directory = os.path.join(source_path, 'bindings', 'tests', 'results') | 
|   76  |   82  | 
|   77 PLY_LEX_YACC_FILES = frozenset([ |   83 PLY_LEX_YACC_FILES = frozenset([ | 
|   78     'lextab.py',  # PLY lex |   84     'lextab.py',  # PLY lex | 
|   79     'lextab.pyc', |   85     'lextab.pyc', | 
|   80     'parsetab.pickle',  # PLY yacc |   86     'parsetab.pickle',  # PLY yacc | 
|   81 ]) |   87 ]) | 
|   82  |   88  | 
|   83 @contextmanager |   89 @contextmanager | 
|   84 def TemporaryDirectory(): |   90 def TemporaryDirectory(): | 
|   85     """Wrapper for tempfile.mkdtemp() so it's usable with 'with' statement. |   91     """Wrapper for tempfile.mkdtemp() so it's usable with 'with' statement. | 
|   86  |   92  | 
|   87     Simple backport of tempfile.TemporaryDirectory from Python 3.2. |   93     Simple backport of tempfile.TemporaryDirectory from Python 3.2. | 
|   88     """ |   94     """ | 
|   89     name = tempfile.mkdtemp() |   95     name = tempfile.mkdtemp() | 
|   90     try: |   96     try: | 
|   91         yield name |   97         yield name | 
|   92     finally: |   98     finally: | 
|   93         shutil.rmtree(name) |   99         shutil.rmtree(name) | 
|   94  |  100  | 
|   95  |  101  | 
|   96 def generate_interface_dependencies(): |  102 def generate_interface_dependencies(output_directory): | 
|   97     def idl_paths_recursive(directory): |  103     def idl_paths_recursive(directory): | 
|   98         # This is slow, especially on Windows, due to os.walk making |  104         # This is slow, especially on Windows, due to os.walk making | 
|   99         # excess stat() calls. Faster versions may appear in Python 3.5 or |  105         # excess stat() calls. Faster versions may appear in Python 3.5 or | 
|  100         # later: |  106         # later: | 
|  101         # https://github.com/benhoyt/scandir |  107         # https://github.com/benhoyt/scandir | 
|  102         # http://bugs.python.org/issue11406 |  108         # http://bugs.python.org/issue11406 | 
|  103         idl_paths = [] |  109         idl_paths = [] | 
|  104         for dirpath, _, files in os.walk(directory): |  110         for dirpath, _, files in os.walk(directory): | 
|  105             idl_paths.extend(os.path.join(dirpath, filename) |  111             idl_paths.extend(os.path.join(dirpath, filename) | 
|  106                              for filename in fnmatch.filter(files, '*.idl')) |  112                              for filename in fnmatch.filter(files, '*.idl')) | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
|  127     # 2-stage computation: individual, then overall |  133     # 2-stage computation: individual, then overall | 
|  128     # |  134     # | 
|  129     # Properly should compute separately by component (currently test |  135     # Properly should compute separately by component (currently test | 
|  130     # includes are invalid), but that's brittle (would need to update this file |  136     # includes are invalid), but that's brittle (would need to update this file | 
|  131     # for each new component) and doesn't test the code generator any better |  137     # for each new component) and doesn't test the code generator any better | 
|  132     # than using a single component. |  138     # than using a single component. | 
|  133     # |  139     # | 
|  134     # In order to allow test IDL files to override the production IDL files if |  140     # In order to allow test IDL files to override the production IDL files if | 
|  135     # they have the same interface name, process the test IDL files after the |  141     # they have the same interface name, process the test IDL files after the | 
|  136     # non-test IDL files. |  142     # non-test IDL files. | 
 |  143     reader = IdlReader(outputdir=output_directory) | 
|  137     for idl_path_list in (non_test_idl_paths, test_idl_paths): |  144     for idl_path_list in (non_test_idl_paths, test_idl_paths): | 
|  138         for idl_path in idl_path_list: |  145         for idl_path in idl_path_list: | 
|  139             compute_info_individual(idl_path) |  146             if os.path.basename(idl_path) in NON_BLINK_IDL_FILES: | 
 |  147                 continue | 
 |  148             compute_info_individual(idl_path, reader) | 
|  140     info_individuals = [info_individual()] |  149     info_individuals = [info_individual()] | 
|  141     # TestDictionary.{h,cpp} are placed under Source/bindings/tests/idls/core. |  150     # TestDictionary.{h,cpp} are placed under Source/bindings/tests/idls/core. | 
|  142     # However, IdlCompiler generates TestDictionary.{h,cpp} by using relative_di
     r. |  151     # However, IdlCompiler generates TestDictionary.{h,cpp} by using relative_di
     r. | 
|  143     # So the files will be generated under output_dir/core/bindings/tests/idls/c
     ore. |  152     # So the files will be generated under output_dir/core/bindings/tests/idls/c
     ore. | 
|  144     # To avoid this issue, we need to clear relative_dir here. |  153     # To avoid this issue, we need to clear relative_dir here. | 
|  145     for info in info_individuals: |  154     for info in info_individuals: | 
|  146         for value in info['interfaces_info'].itervalues(): |  155         for value in info['interfaces_info'].itervalues(): | 
|  147             value['relative_dir'] = '' |  156             value['relative_dir'] = '' | 
|  148     compute_interfaces_info_overall(info_individuals) |  157     compute_interfaces_info_overall(info_individuals) | 
|  149  |  158  | 
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  228             if relpath not in generated_files: |  237             if relpath not in generated_files: | 
|  229                 excess_files.append(relpath) |  238                 excess_files.append(relpath) | 
|  230         if excess_files: |  239         if excess_files: | 
|  231             print ('Excess reference files! ' |  240             print ('Excess reference files! ' | 
|  232                   '(probably cruft from renaming or deleting):\n' + |  241                   '(probably cruft from renaming or deleting):\n' + | 
|  233                   '\n'.join(excess_files)) |  242                   '\n'.join(excess_files)) | 
|  234             return False |  243             return False | 
|  235         return True |  244         return True | 
|  236  |  245  | 
|  237     try: |  246     try: | 
|  238         generate_interface_dependencies() |  247         generate_interface_dependencies(output_directory) | 
|  239         for component in COMPONENT_DIRECTORY: |  248         for component in COMPONENT_DIRECTORY: | 
|  240             output_dir = os.path.join(output_directory, component) |  249             output_dir = os.path.join(output_directory, component) | 
|  241             if not os.path.exists(output_dir): |  250             if not os.path.exists(output_dir): | 
|  242                 os.makedirs(output_dir) |  251                 os.makedirs(output_dir) | 
|  243  |  252  | 
|  244             idl_compiler = IdlCompilerV8(output_dir, |  253             idl_compiler = IdlCompilerV8(output_dir, | 
|  245                                          interfaces_info=interfaces_info, |  254                                          interfaces_info=interfaces_info, | 
|  246                                          only_if_changed=True) |  255                                          only_if_changed=True) | 
|  247             if component == 'core': |  256             if component == 'core': | 
|  248                 partial_interface_output_dir = os.path.join(output_directory, |  257                 partial_interface_output_dir = os.path.join(output_directory, | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  302  |  311  | 
|  303  |  312  | 
|  304 def run_bindings_tests(reset_results, verbose): |  313 def run_bindings_tests(reset_results, verbose): | 
|  305     # Generate output into the reference directory if resetting results, or |  314     # Generate output into the reference directory if resetting results, or | 
|  306     # a temp directory if not. |  315     # a temp directory if not. | 
|  307     if reset_results: |  316     if reset_results: | 
|  308         print 'Resetting results' |  317         print 'Resetting results' | 
|  309         return bindings_tests(reference_directory, verbose) |  318         return bindings_tests(reference_directory, verbose) | 
|  310     with TemporaryDirectory() as temp_dir: |  319     with TemporaryDirectory() as temp_dir: | 
|  311         return bindings_tests(temp_dir, verbose) |  320         return bindings_tests(temp_dir, verbose) | 
| OLD | NEW |