diff --git a/tests/dromaeo/run_dromaeo.py b/tests/dromaeo/run_dromaeo.py new file mode 100755 index 00000000000..1765cb6d18f --- /dev/null +++ b/tests/dromaeo/run_dromaeo.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os +import re +import subprocess +import sys +import BaseHTTPServer +import SimpleHTTPServer +import SocketServer +import threading +import urlparse + +# Port to run the HTTP server on for Dromaeo. +TEST_SERVER_PORT = 8192 + +# Run servo and print / parse the results for a specific jQuery test module. +def run_servo(servo_exe): + url = "http://localhost:{0}/?recommended&automated&post_json".format(TEST_SERVER_PORT) + #args = [servo_exe, url, "-z", "-f"] + args = [servo_exe, url, "-z"] + return subprocess.Popen(args) + +# Print usage if command line args are incorrect +def print_usage(): + print("USAGE: {0} test servo_binary dromaeo_base_dir".format(sys.argv[0])) + + +# A simple HTTP server to serve up the test suite +class Server(SocketServer.ThreadingMixIn, + BaseHTTPServer.HTTPServer): + allow_reuse_address = True + got_post = False + +class RequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): + # TODO(gw): HACK copy the fixed version from python + # main repo - due to https://bugs.python.org/issue23112 + def send_head(self): + path = self.translate_path(self.path) + f = None + if os.path.isdir(path): + parts = urlparse.urlsplit(self.path) + if not parts.path.endswith('/'): + # redirect browser - doing basically what apache does + self.send_response(301) + new_parts = (parts[0], parts[1], parts[2] + '/', + parts[3], parts[4]) + new_url = urlparse.urlunsplit(new_parts) + self.send_header("Location", new_url) + self.end_headers() + return None + for index in "index.html", "index.htm": + index = os.path.join(path, index) + if os.path.exists(index): + path = index + break + else: + return self.list_directory(path) + ctype = self.guess_type(path) + try: + # Always read in binary mode. Opening files in text mode may cause + # newline translations, making the actual size of the content + # transmitted *less* than the content-length! + f = open(path, 'rb') + except IOError: + self.send_error(404, "File not found") + return None + try: + self.send_response(200) + self.send_header("Content-type", ctype) + fs = os.fstat(f.fileno()) + self.send_header("Content-Length", str(fs[6])) + self.send_header("Last-Modified", self.date_time_string(fs.st_mtime)) + self.end_headers() + return f + except: + f.close() + raise + def do_POST(self): + self.send_response(200) + self.end_headers() + self.wfile.write("POST OK.

"); + length = int(self.headers.getheader('content-length')) + parameters = urlparse.parse_qs(self.rfile.read(length)) + self.server.got_post = True + self.server.post_data = parameters['data'] + def log_message(self, format, *args): + return + +if __name__ == '__main__': + if len(sys.argv) == 4: + cmd = sys.argv[1] + servo_exe = sys.argv[2] + base_dir = sys.argv[3] + os.chdir(base_dir) + + # Ensure servo binary can be found + if not os.path.isfile(servo_exe): + print("Unable to find {0}. This script expects an existing build of Servo.".format(servo_exe)) + sys.exit(1) + + # Start the test server + server = Server(('', TEST_SERVER_PORT), RequestHandler) + + if cmd == "test": + print("Testing Dromaeo on Servo!") + proc = run_servo(servo_exe) + while not server.got_post: + server.handle_request() + print("dromaeo: %s" % server.post_data) + proc.kill() + else: + print_usage() + else: + print_usage()