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

Side by Side Diff: presubmit_canned_checks.py

Issue 147035: Change RunPythonUnitTests() to run the unit tests in a separate process. (Closed)
Patch Set: Created 11 years, 6 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
« no previous file with comments | « no previous file | presubmit_support.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Generic presubmit checks that can be reused by other presubmit checks.""" 6 """Generic presubmit checks that can be reused by other presubmit checks."""
7 7
8 8
9 ### Description checks 9 ### Description checks
10 10
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 connection.close() 249 connection.close()
250 if input_api.re.match(closed, status): 250 if input_api.re.match(closed, status):
251 long_text = status + '\n' + url 251 long_text = status + '\n' + url
252 return [output_api.PresubmitPromptWarning("The tree is closed.", 252 return [output_api.PresubmitPromptWarning("The tree is closed.",
253 long_text=long_text)] 253 long_text=long_text)]
254 except IOError: 254 except IOError:
255 pass 255 pass
256 return [] 256 return []
257 257
258 258
259 def _RunPythonUnitTests_LoadTests(input_api, module_name):
260 """Meant to be stubbed out during unit testing."""
261 module = __import__(module_name)
262 for part in module_name.split('.')[1:]:
263 module = getattr(module, part)
264 return input_api.unittest.TestLoader().loadTestsFromModule(module)._tests
265
266
267 def RunPythonUnitTests(input_api, output_api, unit_tests): 259 def RunPythonUnitTests(input_api, output_api, unit_tests):
268 """Imports the unit_tests modules and run them.""" 260 """Run the unit tests out of process, capture the output and use the result
261 code to determine success.
262 """
269 # We don't want to hinder users from uploading incomplete patches. 263 # We don't want to hinder users from uploading incomplete patches.
270 if input_api.is_committing: 264 if input_api.is_committing:
271 message_type = output_api.PresubmitError 265 message_type = output_api.PresubmitError
272 else: 266 else:
273 message_type = output_api.PresubmitNotifyResult 267 message_type = output_api.PresubmitNotifyResult
274 tests_suite = []
275 outputs = [] 268 outputs = []
276 for unit_test in unit_tests: 269 for unit_test in unit_tests:
277 try: 270 # Run the unit tests out of process. This is because some unit tests
278 tests_suite.extend(_RunPythonUnitTests_LoadTests(input_api, unit_test)) 271 # stub out base libraries and don't clean up their mess. It's too easy to
279 except ImportError: 272 # get subtle bugs.
280 outputs.append(message_type("Failed to load %s" % unit_test, 273 cwd = None
281 long_text=input_api.traceback.format_exc())) 274 env = None
282 275 unit_test_name = unit_test
283 buffer = input_api.cStringIO.StringIO() 276 # "python -m test.unit_test" doesn't work. We need to change to the right
284 results = input_api.unittest.TextTestRunner(stream=buffer, verbosity=0).run( 277 # directory instead.
285 input_api.unittest.TestSuite(tests_suite)) 278 if '.' in unit_test:
286 if not results.wasSuccessful(): 279 # Tests imported in submodules (subdirectories) assume that the current
287 outputs.append(message_type("%d unit tests failed." % 280 # directory is in the PYTHONPATH. Manually fix that.
288 (len(results.failures) + len(results.errors)), 281 unit_test = unit_test.replace('.', '/')
289 long_text=buffer.getvalue())) 282 cwd = input_api.os_path.dirname(unit_test)
290 return outputs 283 unit_test = input_api.os_path.basename(unit_test)
284 env = input_api.environ.copy()
285 backpath = [';'.join(['..'] * (cwd.count('/') + 1))]
286 if env.get('PYTHONPATH'):
287 backpath.append(env.get('PYTHONPATH'))
288 env['PYTHONPATH'] = ';'.join((backpath))
289 subproc = input_api.subprocess.Popen(
290 [
291 input_api.python_executable,
292 "-m",
293 "%s" % unit_test
294 ],
295 cwd=cwd,
296 env=env,
297 stdin=input_api.subprocess.PIPE,
298 stdout=input_api.subprocess.PIPE,
299 stderr=input_api.subprocess.PIPE)
300 stdoutdata, stderrdata = subproc.communicate()
301 # Discard the output if returncode != 0
Jói Sigurðsson 2009/06/23 20:03:51 != -> ==
302 if subproc.returncode:
303 outputs.append("Test '%s' failed with code %d\n%s\n%s\n" % (
304 unit_test_name, subproc.returncode, stdoutdata, stderrdata))
305 if outputs:
306 return [message_type("%d unit tests failed." % len(outputs),
307 long_text='\n'.join(outputs))]
308 return []
OLDNEW
« no previous file with comments | « no previous file | presubmit_support.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698