summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpje <pje@571e12c6-e1fa-0310-aee7-ff1267fa46bd>2006-06-05 19:09:31 +0000
committerpje <pje@571e12c6-e1fa-0310-aee7-ff1267fa46bd>2006-06-05 19:09:31 +0000
commitbb7d34cd07da18f48a0ad1e4af9ae65ce3ac79e1 (patch)
tree28b33562a40df1d4e6f278d6561b6643b57e3694
parentfbb0e3da4daecb0ff0d45d1a924e799fe4bad5c3 (diff)
downloadwsgiref-bb7d34cd07da18f48a0ad1e4af9ae65ce3ac79e1.tar.gz
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
-rwxr-xr-xtest_wsgiref.py125
-rw-r--r--wsgiref/simple_server.py24
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: <type 'tuple'>"
+ )
+
+
+
+
+
+
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"""
@@ -352,21 +408,6 @@ class TestHandler(ErrorHandler):
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
class HandlerTests(TestCase):
def checkEnvironAttrs(self, handler):
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__':
-
-
-
-
-
-
-
-