#!/usr/bin/env python import subprocess import requests import optparse import time import sys import os from os import path import glob # # In order to use remote casperjs debugging, pass the --remote-debug flag # This will start a remote debugging session listening on port 7777 # # See https://wiki.zulip.net/wiki/Testing_the_app for more information # on how to use remote debugging # os.environ["TORNADO_SERVER"] = "http://localhost:9983" parser = optparse.OptionParser(r""" %prog --remote-debug file1 file2 file3""") parser.add_option('--remote-debug', help='Whether or not to enable remote debugging on port 7777', action="store_true", default=False) (options, args) = parser.parse_args() test_files = [] for file in args: if not os.path.exists(file): file = path.join(path.dirname(__file__), 'tests', file) test_files.append(path.abspath(file)) os.chdir(path.join(path.dirname(path.realpath(__file__)), '../../..')) subprocess.check_call('tools/generate-fixtures') subprocess.check_call(['rm', '-f'] + glob.glob('/tmp/casper-failure*.png')) log = open('zerver/tests/frontend/server.log', 'w') # Run this not through the shell, so that we have the actual PID. server = subprocess.Popen(('tools/run-dev.py', '--test'), stdout=log, stderr=log) def assert_server_running(): # Get the exit code of the server, or None if it is still running. if server.poll() is not None: raise RuntimeError, 'Server died unexpectedly! Check zerver/tests/frontend/server.log' def server_is_up(): assert_server_running() try: # We could get a 501 error if the reverse proxy is up but the Django app isn't. return requests.get('http://localhost:9981/accounts/home').status_code == 200 except: return False ret = 1 try: # Wait for the server to start up. sys.stdout.write('Waiting for test server') while not server_is_up(): sys.stdout.write('.') sys.stdout.flush() time.sleep(0.1) sys.stdout.write('\n') remote_debug = "" if options.remote_debug: remote_debug = "--remote-debugger-port=7777 --remote-debugger-autorun=yes" cmd = "zerver/tests/frontend/casperjs/bin/casperjs %s test " % (remote_debug,) if test_files: cmd += ' '.join(test_files) else: cmd += 'zerver/tests/frontend/tests' print "Running %s" % (cmd,) ret = subprocess.call(cmd, shell=True) finally: assert_server_running() server.terminate() sys.exit(ret)