diff tests/dumbhttp.py @ 22959:10116463b0b1

tests: pull common http server setup out of individual tests There are currently two different tests using roughly the same code to create temporary scripts acting as HTTP servers. As there is going to be at least one more in an upcoming change, factor those out in a standalone dumbhttp.py script.
author Mike Hommey <mh@glandium.org>
date Thu, 16 Oct 2014 13:48:51 +0900
parents
children 6eab50a34fed
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/dumbhttp.py	Thu Oct 16 13:48:51 2014 +0900
@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+
+"""
+Small and dumb HTTP server for use in tests.
+"""
+
+from optparse import OptionParser
+import BaseHTTPServer, SimpleHTTPServer, os, signal, subprocess, sys
+
+
+def run(server_class=BaseHTTPServer.HTTPServer,
+        handler_class=SimpleHTTPServer.SimpleHTTPRequestHandler,
+        server_address=('localhost', 8000)):
+    httpd = server_class(server_address, handler_class)
+    httpd.serve_forever()
+
+
+if __name__ == '__main__':
+    parser = OptionParser()
+    parser.add_option('-p', '--port', dest='port', type='int', default=8000,
+        help='TCP port to listen on', metavar='PORT')
+    parser.add_option('-H', '--host', dest='host', default='localhost',
+        help='hostname or IP to listen on', metavar='HOST')
+    parser.add_option('--pid', dest='pid',
+        help='file name where the PID of the server is stored')
+    parser.add_option('-f', '--foreground', dest='foreground',
+        action='store_true',
+        help='do not start the HTTP server in the background')
+
+    (options, args) = parser.parse_args()
+
+    signal.signal(signal.SIGTERM, lambda x, y: sys.exit(0))
+
+    if options.foreground and options.pid:
+        parser.error("options --pid and --foreground are mutually exclusive")
+
+    if options.foreground:
+        run(server_address=(options.host, options.port))
+    else:
+        # This doesn't attempt to cleanly detach the process, as it's not
+        # meant to be a long-lived, independent process. As a consequence,
+        # it's still part of the same process group, and keeps any file
+        # descriptors it might have inherited besided stdin/stdout/stderr.
+        # Trying to do things cleanly is more complicated, requires
+        # OS-dependent code, and is not worth the effort.
+        proc = subprocess.Popen([sys.executable, __file__, '-f',
+            '-H', options.host, '-p', str(options.port)],
+            stdin=open(os.devnull, 'r'),
+            stdout=open(os.devnull, 'w'),
+            stderr=subprocess.STDOUT)
+        if options.pid:
+            fp = file(options.pid, 'wb')
+            fp.write(str(proc.pid) + '\n')
+            fp.close()