From 62d3c625ed9a63c0bd2eeadac6d287e2802231bb Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Mon, 3 Feb 2014 23:15:50 +0400 Subject: [PATCH] Support for internal webserver in tests. --- system/lib.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ system/run.py | 2 ++ 2 files changed, 64 insertions(+) diff --git a/system/lib.py b/system/lib.py index 7317f65d..1706797a 100644 --- a/system/lib.py +++ b/system/lib.py @@ -7,9 +7,46 @@ import inspect import json import subprocess import os +import posixpath import shlex import shutil import string +import threading +import urllib +import SocketServer +import SimpleHTTPServer + + +class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): + pass + + +class FileHTTPServerRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): + def translate_path(self, path): + """Translate a /-separated PATH to the local filename syntax. + + Components that mean special things to the local file system + (e.g. drive or directory names) are ignored. (XXX They should + probably be diagnosed.) + + """ + # abandon query parameters + path = path.split('?', 1)[0] + path = path.split('#', 1)[0] + path = posixpath.normpath(urllib.unquote(path)) + words = path.split('/') + words = filter(None, words) + path = self.rootPath + for word in words: + drive, word = os.path.splitdrive(word) + head, word = os.path.split(word) + if word in (os.curdir, os.pardir): + continue + path = os.path.join(path, word) + return path + + def log_message(self, format, *args): + pass class BaseTest(object): @@ -20,6 +57,7 @@ class BaseTest(object): longTest = False fixturePool = False fixtureDB = False + fixtureWebServer = False expectedCode = 0 configFile = { @@ -71,7 +109,14 @@ class BaseTest(object): if self.fixtureDB: shutil.copytree(self.fixtureDBDir, os.path.join(os.environ["HOME"], ".aptly", "db")) + if self.fixtureWebServer: + self.webServerUrl = self.start_webserver(os.path.join(os.path.dirname(inspect.getsourcefile(self.__class__)), + self.fixtureWebServer)) + if hasattr(self, "fixtureCmds"): + if self.fixtureWebServer: + params = {'url': self.webServerUrl} + self.fixtureCmds = [string.Template(cmd).substitute(params) for cmd in self.fixtureCmds] for cmd in self.fixtureCmds: self.run_cmd(cmd) @@ -145,3 +190,20 @@ class BaseTest(object): self.prepare_remove_all() self.prepare_default_config() self.prepare_fixture() + + def start_webserver(self, directory): + FileHTTPServerRequestHandler.rootPath = directory + self.webserver = ThreadedTCPServer(("localhost", 0), FileHTTPServerRequestHandler) + + server_thread = threading.Thread(target=self.webserver.serve_forever) + server_thread.daemon = True + server_thread.start() + + return "http://%s:%d/" % self.webserver.server_address + + def shutdown(self): + if hasattr(self, 'webserver'): + self.shutdown_webserver() + + def shutdown_webserver(self): + self.webserver.shutdown() diff --git a/system/run.py b/system/run.py index 638943d6..2b6aef24 100755 --- a/system/run.py +++ b/system/run.py @@ -51,6 +51,8 @@ def run(include_long_tests=False): else: sys.stdout.write(colored("OK\n", color="green")) + t.shutdown() + print "TESTS: %d SUCCESS: %d FAIL: %d SKIP: %d" % (numTests, numTests - numFailed, numFailed, numSkipped) if len(fails) > 0: