From bb7d34cd07da18f48a0ad1e4af9ae65ce3ac79e1 Mon Sep 17 00:00:00 2001 From: pje Date: Mon, 5 Jun 2006 19:09:31 +0000 Subject: Add 'make_server()' convenience factory, and tests for simple_server and validate modules. git-svn-id: svn://svn.eby-sarna.com/svnroot/wsgiref@2170 571e12c6-e1fa-0310-aee7-ff1267fa46bd --- test_wsgiref.py | 125 +++++++++++++++++++++++++++++++---------------- wsgiref/simple_server.py | 24 ++++----- 2 files changed, 95 insertions(+), 54 deletions(-) diff --git a/test_wsgiref.py b/test_wsgiref.py index bb176f4..da9b180 100755 --- a/test_wsgiref.py +++ b/test_wsgiref.py @@ -4,18 +4,59 @@ from wsgiref.util import setup_testing_defaults from wsgiref.headers import Headers from wsgiref.handlers import BaseHandler, BaseCGIHandler from wsgiref import util +from wsgiref.validate import middleware +from wsgiref.simple_server import WSGIServer, WSGIRequestHandler, demo_app +from wsgiref.simple_server import make_server from StringIO import StringIO -import re +from SocketServer import BaseServer +import re, sys +class MockServer(WSGIServer): + """Non-socket HTTP server""" + def __init__(self, server_address, RequestHandlerClass): + BaseServer.__init__(self, server_address, RequestHandlerClass) + self.server_bind() + def server_bind(self): + host, port = self.server_address + self.server_name = host + self.server_port = port + self.setup_environ() + + +class MockHandler(WSGIRequestHandler): + """Non-socket HTTP handler""" + def setup(self): + self.connection = self.request + self.rfile, self.wfile = self.connection + + def finish(self): + pass +def hello_app(environ,start_response): + start_response("200 OK", [ + ('Content-Type','text/plain'), + ('Date','Mon, 05 Jun 2006 18:49:54 GMT') + ]) + return ["Hello, world!"] +def run_amock(app=hello_app, data="GET / HTTP/1.0\n\n"): + server = make_server("", 80, app, MockServer, MockHandler) + inp, out, err, olderr = StringIO(data), StringIO(), StringIO(), sys.stderr + sys.stderr = err + + try: + server.finish_request((inp,out), ("127.0.0.1",8888)) + finally: + sys.stderr = olderr + + return out.getvalue(), err.getvalue() @@ -80,6 +121,47 @@ def compare_generic_iter(make_it,match): +class IntegrationTests(TestCase): + + def check_hello(self, out, has_length=True): + self.assertEqual(out, + "HTTP/1.0 200 OK\r\n" + "Server: WSGIServer/0.1 Python/"+sys.version.split()[0]+"\r\n" + "Content-Type: text/plain\r\n" + "Date: Mon, 05 Jun 2006 18:49:54 GMT\r\n" + + (has_length and "Content-Length: 13\r\n" or "") + + "\r\n" + "Hello, world!" + ) + + def test_plain_hello(self): + out, err = run_amock() + self.check_hello(out) + + def test_validated_hello(self): + out, err = run_amock(middleware(hello_app)) + # the middleware doesn't support len(), so content-length isn't there + self.check_hello(out, has_length=False) + + def test_simple_validation_error(self): + def bad_app(environ,start_response): + start_response("200 OK", ('Content-Type','text/plain')) + return ["Hello, world!"] + out, err = run_amock(middleware(bad_app)) + self.failUnless(out.endswith( + "A server error occurred. Please contact the administrator." + )) + self.assertEqual( + err.splitlines()[-2], + "AssertionError: Headers (('Content-Type', 'text/plain')) must" + " be of type list: " + ) + + + + + + class UtilityTests(TestCase): def checkShift(self,sn_in,pi_in,part,sn_out,pi_out): @@ -300,32 +382,6 @@ class HeaderTests(TestCase): ) - - - - - - - - - - - - - - - - - - - - - - - - - - class ErrorHandler(BaseCGIHandler): """Simple handler subclass for testing BaseHandler""" @@ -346,21 +402,6 @@ class TestHandler(ErrorHandler): - - - - - - - - - - - - - - - diff --git a/wsgiref/simple_server.py b/wsgiref/simple_server.py index d226359..e171686 100644 --- a/wsgiref/simple_server.py +++ b/wsgiref/simple_server.py @@ -15,7 +15,7 @@ import urllib, sys from wsgiref.handlers import SimpleHandler __version__ = "0.1" -__all__ = ['WSGIServer','WSGIRequestHandler','demo_app'] +__all__ = ['WSGIServer', 'WSGIRequestHandler', 'demo_app', 'make_server'] server_version = "WSGIServer/" + __version__ @@ -35,7 +35,7 @@ class ServerHandler(SimpleHandler): finally: SimpleHandler.close(self) - + @@ -174,10 +174,18 @@ def demo_app(environ,start_response): return [stdout.getvalue()] +def make_server( + host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler +): + """Create a new WSGI server listening on `host` and `port` for `app`""" + server = server_class((host, port), handler_class) + server.set_app(app) + return server + + if __name__ == '__main__': server_address = ('', 8000) - httpd = WSGIServer(server_address, WSGIRequestHandler) - httpd.set_app(demo_app) + httpd = make_server('', 8000, demo_app) sa = httpd.socket.getsockname() print "Serving HTTP on", sa[0], "port", sa[1], "..." import webbrowser @@ -195,11 +203,3 @@ if __name__ == '__main__': - - - - - - - - -- cgit v1.2.1