Index: git_cl/PRESUBMIT.py |
diff --git a/git_cl/PRESUBMIT.py b/git_cl/PRESUBMIT.py |
index 6c7506929c3f45926d66fdefbc95f5a473ba6ddd..aaeafaf38b9e72359dabf6583ec3ac110d179f3b 100644 |
--- a/git_cl/PRESUBMIT.py |
+++ b/git_cl/PRESUBMIT.py |
@@ -19,106 +19,52 @@ def CheckChangeOnCommit(input_api, output_api): |
def RunTests(input_api, output_api): |
"""Run all the shells scripts in the directory test. |
- |
- Also verify the GAE python SDK is available, fetches Rietveld if necessary and |
- start a test instance to test against. |
""" |
- # They are not exposed from InputApi. |
- from os import listdir, pathsep |
- import socket |
- import time |
- |
- # Shortcuts |
- join = input_api.os_path.join |
- error = output_api.PresubmitError |
- |
- # Paths |
- sdk_path = input_api.os_path.abspath(join('..', '..', 'google_appengine')) |
- dev_app = join(sdk_path, 'dev_appserver.py') |
- rietveld = join('test', 'rietveld') |
- django_path = join(rietveld, 'django') |
- |
- # Generate a friendly environment. |
- env = input_api.environ.copy() |
- env['LANGUAGE'] = 'en' |
- if env.get('PYTHONPATH'): |
- env['PYTHONPATH'] = (env['PYTHONPATH'].rstrip(pathsep) + pathsep + |
- django_path) |
- else: |
- env['PYTHONPATH'] = django_path |
- |
- def call(*args, **kwargs): |
- kwargs['env'] = env |
- x = input_api.subprocess.Popen(*args, **kwargs) |
- x.communicate() |
- return x.returncode == 0 |
- |
- def test_port(port): |
- s = socket.socket() |
- try: |
- return s.connect_ex(('127.0.0.1', port)) == 0 |
- finally: |
- s.close() |
+ # Not exposed from InputApi. |
+ from os import listdir |
- # First, verify the Google AppEngine SDK is available. |
- if not input_api.os_path.isfile(dev_app): |
- return [error('Install google_appengine sdk in %s' % sdk_path)] |
- |
- # Second, checkout rietveld and django if not available. |
- if not input_api.os_path.isdir(rietveld): |
- print('Checking out rietveld...') |
- if not call(['svn', 'co', '-q', |
- 'http://rietveld.googlecode.com/svn/trunk@563', |
- rietveld]): |
- return [error('Failed to checkout rietveld')] |
- if not input_api.os_path.isdir(django_path): |
- print('Checking out django...') |
- if not call( |
- ['svn', 'co', '-q', |
- 'http://code.djangoproject.com/' |
- 'svn/django/branches/releases/1.0.X/django@13637', |
- django_path]): |
- return [error('Failed to checkout django')] |
- |
- |
- # Test to find an available port starting at 8080. |
- port = 8080 |
- while test_port(port) and port < 65000: |
- port += 1 |
- if port == 65000: |
- return [error('Having issues finding an available port')] |
+ # First loads a local Rietveld instance. |
+ import sys |
+ old_sys_path = sys.path |
+ try: |
+ sys.path = [input_api.PresubmitLocalPath()] + sys.path |
+ from test import local_rietveld |
+ server = local_rietveld.LocalRietveld() |
+ finally: |
+ sys.path = old_sys_path |
+ # Set to True for testing. |
verbose = False |
if verbose: |
stdout = None |
stderr = None |
else: |
stdout = input_api.subprocess.PIPE |
- stderr = input_api.subprocess.PIPE |
+ stderr = input_api.subprocess.STDOUT |
output = [] |
- test_server = input_api.subprocess.Popen( |
- [dev_app, rietveld, '--port=%d' % port, |
- '--datastore_path=' + join(rietveld, 'tmp.db'), '-c'], |
- stdout=stdout, stderr=stderr, env=env) |
try: |
- # Loop until port 127.0.0.1:port opens or the process dies. |
- while not test_port(port): |
- test_server.poll() |
- if test_server.returncode is not None: |
- output.append(error('Test rietveld instance failed early')) |
- break |
- time.sleep(0.001) |
- |
- test_path = input_api.os_path.abspath('test') |
+ # Start a local rietveld instance to test against. |
+ server.start_server() |
+ test_path = input_api.os_path.abspath( |
+ input_api.os_path.join(input_api.PresubmitLocalPath(), 'test')) |
for test in listdir(test_path): |
- # push-from-logs and rename fails for now. Remove from this list once they |
- # work. |
+ # push-from-logs and rename fails for now. Remove from this list once |
+ # they work. |
if (test in ('push-from-logs.sh', 'rename.sh', 'test-lib.sh') or |
not test.endswith('.sh')): |
continue |
+ |
print('Running %s' % test) |
- if not call([join(test_path, test)], cwd=test_path, stdout=stdout): |
- output.append(error('%s failed' % test)) |
+ proc = input_api.subprocess.Popen( |
+ [input_api.os_path.join(test_path, test)], |
+ cwd=test_path, |
+ stdout=stdout, |
+ stderr=stderr) |
+ proc.communicate() |
+ if proc.returncode != 0: |
+ output.append(output_api.PresubmitError('%s failed' % test)) |
+ except setup_mock.Failure, e: |
+ output.append(output_api.PresubmitError('\n'.join(str(i) for i in e.args))) |
finally: |
- test_server.kill() |
+ server.stop_server() |
return output |