Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2262)

Side by Side Diff: Tools/Scripts/webkitpy/bindings/main.py

Issue 557203002: Added core and modules to binding tests results for binding modularization. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Added s/b/tests/idls/modules/TestInterface5.idl Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 'TestPartialInterface.idl', 65 'TestPartialInterface.idl',
66 'TestPartialInterface2.idl', 66 'TestPartialInterface2.idl',
67 'TestPartialInterface3.idl', 67 'TestPartialInterface3.idl',
68 ]) 68 ])
69 69
70 COMPONENT_DIRECTORY = frozenset(['core', 'modules']) 70 COMPONENT_DIRECTORY = frozenset(['core', 'modules'])
71 71
72 test_input_directory = os.path.join(source_path, 'bindings', 'tests', 'idls') 72 test_input_directory = os.path.join(source_path, 'bindings', 'tests', 'idls')
73 reference_directory = os.path.join(source_path, 'bindings', 'tests', 'results') 73 reference_directory = os.path.join(source_path, 'bindings', 'tests', 'results')
74 74
75 PLY_LEX_YACC_FILES = frozenset([
76 'lextab.py', # PLY lex
77 'lextab.pyc',
78 'parsetab.pickle', # PLY yacc
79 ])
75 80
76 @contextmanager 81 @contextmanager
77 def TemporaryDirectory(): 82 def TemporaryDirectory():
78 """Wrapper for tempfile.mkdtemp() so it's usable with 'with' statement. 83 """Wrapper for tempfile.mkdtemp() so it's usable with 'with' statement.
79 84
80 Simple backport of tempfile.TemporaryDirectory from Python 3.2. 85 Simple backport of tempfile.TemporaryDirectory from Python 3.2.
81 """ 86 """
82 name = tempfile.mkdtemp() 87 name = tempfile.mkdtemp()
83 try: 88 try:
84 yield name 89 yield name
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 # than using a single component. 123 # than using a single component.
119 for idl_filename in idl_paths_recursive(source_path): 124 for idl_filename in idl_paths_recursive(source_path):
120 compute_info_individual(idl_filename, 'tests') 125 compute_info_individual(idl_filename, 'tests')
121 info_individuals = [info_individual()] 126 info_individuals = [info_individual()]
122 compute_interfaces_info_overall(info_individuals) 127 compute_interfaces_info_overall(info_individuals)
123 128
124 129
125 def bindings_tests(output_directory, verbose): 130 def bindings_tests(output_directory, verbose):
126 executive = Executive() 131 executive = Executive()
127 132
133 def listfiles(directory):
bashi 2014/09/10 07:39:53 listfiles -> list_files
tasak 2014/09/10 08:27:18 Done.
134 files = []
135 for component in os.listdir(directory):
136 if component not in COMPONENT_DIRECTORY:
137 continue
138 directory_with_component = os.path.join(directory, component)
139 for filename in os.listdir(directory_with_component):
140 files.append(os.path.join(directory_with_component, filename))
141 return files
142
128 def diff(filename1, filename2): 143 def diff(filename1, filename2):
129 # Python's difflib module is too slow, especially on long output, so 144 # Python's difflib module is too slow, especially on long output, so
130 # run external diff(1) command 145 # run external diff(1) command
131 cmd = ['diff', 146 cmd = ['diff',
132 '-u', # unified format 147 '-u', # unified format
133 '-N', # treat absent files as empty 148 '-N', # treat absent files as empty
134 filename1, 149 filename1,
135 filename2] 150 filename2]
136 # Return output and don't raise exception, even though diff(1) has 151 # Return output and don't raise exception, even though diff(1) has
137 # non-zero exit if files differ. 152 # non-zero exit if files differ.
138 return executive.run_command(cmd, error_handler=lambda x: None) 153 return executive.run_command(cmd, error_handler=lambda x: None)
139 154
155 def is_cache_file(filename):
156 if filename in PLY_LEX_YACC_FILES:
157 return True
158 if filename.endswith('.cache'): # Jinja
159 return True
160 return False
161
140 def delete_cache_files(): 162 def delete_cache_files():
141 # FIXME: Instead of deleting cache files, don't generate them. 163 # FIXME: Instead of deleting cache files, don't generate them.
142 cache_files = [os.path.join(output_directory, output_file) 164 cache_files = [path for path in listfiles(output_directory)
143 for output_file in os.listdir(output_directory) 165 if is_cache_file(os.path.basename(path))]
144 if (output_file in ('lextab.py', # PLY lex
145 'lextab.pyc',
146 'parsetab.pickle') or # PLY yacc
147 output_file.endswith('.cache'))] # Jinja
148 for cache_file in cache_files: 166 for cache_file in cache_files:
149 os.remove(cache_file) 167 os.remove(cache_file)
150 168
151 def identical_file(reference_filename, output_filename): 169 def identical_file(reference_filename, output_filename):
152 reference_basename = os.path.basename(reference_filename) 170 reference_basename = os.path.basename(reference_filename)
153 171
154 if not os.path.isfile(reference_filename): 172 if not os.path.isfile(reference_filename):
155 print 'Missing reference file!' 173 print 'Missing reference file!'
156 print '(if adding new test, update reference files)' 174 print '(if adding new test, update reference files)'
157 print reference_basename 175 print reference_basename
158 print 176 print
159 return False 177 return False
160 178
161 if not filecmp.cmp(reference_filename, output_filename): 179 if not filecmp.cmp(reference_filename, output_filename):
162 # cmp is much faster than diff, and usual case is "no differance", 180 # cmp is much faster than diff, and usual case is "no differance",
163 # so only run diff if cmp detects a difference 181 # so only run diff if cmp detects a difference
164 print 'FAIL: %s' % reference_basename 182 print 'FAIL: %s' % reference_basename
165 print diff(reference_filename, output_filename) 183 print diff(reference_filename, output_filename)
166 return False 184 return False
167 185
168 if verbose: 186 if verbose:
169 print 'PASS: %s' % reference_basename 187 print 'PASS: %s' % reference_basename
170 return True 188 return True
171 189
172 def identical_output_files(): 190 def identical_output_files():
173 file_pairs = [(os.path.join(reference_directory, output_file), 191 output_files = listfiles(output_directory)
174 os.path.join(output_directory, output_file)) 192 reference_files = [os.path.join(reference_directory,
175 for output_file in os.listdir(output_directory)] 193 os.path.relpath(path, output_directory))
194 for path in output_files]
176 return all([identical_file(reference_filename, output_filename) 195 return all([identical_file(reference_filename, output_filename)
177 for (reference_filename, output_filename) in file_pairs]) 196 for (reference_filename, output_filename) in zip(reference_f iles, output_files)])
178 197
179 def no_excess_files(): 198 def no_excess_files():
bashi 2014/09/10 07:39:53 You call listfiles() twice here. Maybe good to sto
tasak 2014/09/10 08:27:18 Done.
180 generated_files = set(os.listdir(output_directory)) 199 generated_files = set([os.path.relpath(path, output_directory)
181 generated_files.add('.svn') # Subversion working copy directory 200 for path in listfiles(output_directory)])
182 excess_files = [output_file 201 # Add subversion working copy directories in core and modules.
183 for output_file in os.listdir(reference_directory) 202 for component in COMPONENT_DIRECTORY:
184 if output_file not in generated_files] 203 generated_files.add(os.path.join(component, '.svn'))
204
205 excess_files = []
206 for path in listfiles(reference_directory):
207 relpath = os.path.relpath(path, reference_directory)
208 if relpath not in generated_files:
209 excess_files.append(relpath)
185 if excess_files: 210 if excess_files:
186 print ('Excess reference files! ' 211 print ('Excess reference files! '
187 '(probably cruft from renaming or deleting):\n' + 212 '(probably cruft from renaming or deleting):\n' +
188 '\n'.join(excess_files)) 213 '\n'.join(excess_files))
189 return False 214 return False
190 return True 215 return True
191 216
217 def makedir(path):
bashi 2014/09/10 07:39:53 Use os.path.exists() and os.makedirs(). if not os
tasak 2014/09/10 08:27:18 Done.
218 try:
219 os.mkdir(path)
220 except OSError as e:
221 if e.args[0] == os.errno.EEXIST:
222 return
223 raise e
224
192 try: 225 try:
193 generate_interface_dependencies() 226 generate_interface_dependencies()
194 idl_compiler = IdlCompilerV8(output_directory, 227 for component in COMPONENT_DIRECTORY:
195 interfaces_info=interfaces_info, 228 output_dir = os.path.join(output_directory, component)
196 only_if_changed=True) 229 makedir(output_dir)
197 dictionary_impl_compiler = IdlCompilerDictionaryImpl(
198 output_directory, interfaces_info=interfaces_info,
199 only_if_changed=True)
200 230
201 idl_filenames = [] 231 idl_compiler = IdlCompilerV8(output_dir,
202 for component in COMPONENT_DIRECTORY: 232 interfaces_info=interfaces_info,
233 only_if_changed=True)
234 dictionary_impl_compiler = IdlCompilerDictionaryImpl(
235 output_dir, interfaces_info=interfaces_info,
236 only_if_changed=True)
237
238 idl_filenames = []
203 input_directory = os.path.join(test_input_directory, component) 239 input_directory = os.path.join(test_input_directory, component)
204 for filename in os.listdir(input_directory): 240 for filename in os.listdir(input_directory):
205 if (filename.endswith('.idl') and 241 if (filename.endswith('.idl') and
206 # Dependencies aren't built 242 # Dependencies aren't built
207 # (they are used by the dependent) 243 # (they are used by the dependent)
208 filename not in DEPENDENCY_IDL_FILES): 244 filename not in DEPENDENCY_IDL_FILES):
209 idl_filenames.append( 245 idl_filenames.append(
210 os.path.realpath( 246 os.path.realpath(
211 os.path.join(input_directory, filename))) 247 os.path.join(input_directory, filename)))
212 for idl_path in idl_filenames: 248 for idl_path in idl_filenames:
213 idl_basename = os.path.basename(idl_path) 249 idl_basename = os.path.basename(idl_path)
214 idl_compiler.compile_file(idl_path) 250 idl_compiler.compile_file(idl_path)
215 definition_name, _ = os.path.splitext(idl_basename) 251 definition_name, _ = os.path.splitext(idl_basename)
216 if (definition_name in interfaces_info and 252 if (definition_name in interfaces_info and interfaces_info[defin ition_name]['is_dictionary']):
217 interfaces_info[definition_name]['is_dictionary']): 253 dictionary_impl_compiler.compile_file(idl_path)
218 dictionary_impl_compiler.compile_file(idl_path) 254 if verbose:
219 if verbose: 255 print 'Compiled: %s' % idl_path
220 print 'Compiled: %s' % idl_path
221 finally: 256 finally:
222 delete_cache_files() 257 delete_cache_files()
223 258
224 # Detect all changes 259 # Detect all changes
225 passed = identical_output_files() 260 passed = identical_output_files()
226 passed &= no_excess_files() 261 passed &= no_excess_files()
227 262
228 if passed: 263 if passed:
229 if verbose: 264 if verbose:
230 print 265 print
231 print PASS_MESSAGE 266 print PASS_MESSAGE
232 return 0 267 return 0
233 print 268 print
234 print FAIL_MESSAGE 269 print FAIL_MESSAGE
235 return 1 270 return 1
236 271
237 272
238 def run_bindings_tests(reset_results, verbose): 273 def run_bindings_tests(reset_results, verbose):
239 # Generate output into the reference directory if resetting results, or 274 # Generate output into the reference directory if resetting results, or
240 # a temp directory if not. 275 # a temp directory if not.
241 if reset_results: 276 if reset_results:
242 print 'Resetting results' 277 print 'Resetting results'
243 return bindings_tests(reference_directory, verbose) 278 return bindings_tests(reference_directory, verbose)
244 with TemporaryDirectory() as temp_dir: 279 with TemporaryDirectory() as temp_dir:
245 return bindings_tests(temp_dir, verbose) 280 return bindings_tests(temp_dir, verbose)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698