[Zope-Checkins] CVS: Zope3/lib/python/Zope/Server/tests - testHTTPServer2.py:1.1.2.3

Shane Hathaway shane@digicool.com
Tue, 27 Nov 2001 14:20:34 -0500


Update of /cvs-repository/Zope3/lib/python/Zope/Server/tests
In directory cvs.zope.org:/tmp/cvs-serv30098/tests

Modified Files:
      Tag: Zope-3x-branch
	testHTTPServer2.py 
Log Message:
Expanded tests and fixed found bugs


=== Zope3/lib/python/Zope/Server/tests/testHTTPServer2.py 1.1.2.2 => 1.1.2.3 ===
 from threading import Thread
 from Zope.Server.TaskThreads import ThreadedTaskDispatcher
-from Zope.Server.HTTPServer import http_server
+from Zope.Server.HTTPServer import http_task, http_channel, http_server
 from Zope.Server.dual_mode_channel import pull_trigger
+from Zope.Server.Adjustments import Adjustments
+
 
 from httplib import HTTPConnection
 
@@ -24,19 +26,52 @@
 
 tasks = ThreadedTaskDispatcher()
 
+LOCALHOST = '127.0.0.1'
+
+my_adj = Adjustments()
+# Reduce overflows to make testing easier.
+my_adj.outbuf_overflow = 10000
+my_adj.inbuf_overflow = 10000
+
+
+class EchoHTTPTask (http_task):
+
+    def execute(self):
+        headers = self.request_data.headers
+        if headers.has_key('CONTENT_LENGTH'):
+            cl = headers['CONTENT_LENGTH']
+            self.response_headers['Content-Length'] = cl
+        instream = self.request_data.getBodyStream()
+        while 1:
+            data = instream.read(8192)
+            if not data:
+                break
+            self.write(data)
+
+
+class EchoHTTPChannel (http_channel):
+
+    task_class = EchoHTTPTask
+
+
+class EchoHTTPServer (http_server):
+
+    channel_class = EchoHTTPChannel
+
+
 
 class Tests(unittest.TestCase):
 
     def setUp(self):
         tasks.setThreadCount(4)
-        # Select any port on localhost
-        self.server = http_server('127.0.0.1', 0, tasks=tasks)
+        # Bind to any port on localhost.
+        self.server = EchoHTTPServer(LOCALHOST, 0, tasks=tasks, adj=my_adj)
         self.port = self.server.socket.getsockname()[1]
         self.run_loop = 1
         self.counter = 0
         self.thread = Thread(target=self.loop)
         self.thread.start()
-        sleep(0.1)  # Let the thread start.
+        sleep(0.1)  # Give the thread some time to start.
 
     def tearDown(self):
         self.run_loop = 0
@@ -48,34 +83,55 @@
         while self.run_loop:
             self.counter = self.counter + 1
             #print 'loop', self.counter
-            poll(2.0, socket_map)
+            poll(0.1, socket_map)
 
-    def testOkResponse(self, h=None, add_headers=None):
+    def testEchoResponse(self, h=None, add_headers=None, body=''):
         if h is None:
-            h = HTTPConnection('127.0.0.1', self.port)
+            h = HTTPConnection(LOCALHOST, self.port)
         h.putrequest('GET', '/')
         h.putheader('Accept', 'text/plain')
         if add_headers:
             for k, v in add_headers.items():
                 h.putheader(k, v)
+        if body:
+            h.putheader('Content-Length', str(int(len(body))))
         h.endheaders()
+        if body:
+            h.send(body)
         response = h.getresponse()
         self.failUnlessEqual(int(response.status), 200)
-        length = int(response.getheader('Content-Length'))
-        data = response.read()
-        self.failUnlessEqual(length, len(data))
+        length = int(response.getheader('Content-Length', '0'))
+        response_body = response.read()
+        self.failUnlessEqual(length, len(response_body))
+        self.failUnlessEqual(response_body, body)
+
+    def testMultipleRequestsWithoutBody(self):
+        # Tests the use of multiple requests in a single connection.
+        h = HTTPConnection(LOCALHOST, self.port)
+        for n in range(3):
+            self.testEchoResponse(h)
+        self.testEchoResponse(h, {'Connection': 'close'})
 
-    def testMultipleRequests(self):
-        h = HTTPConnection('127.0.0.1', self.port)
+    def testMultipleRequestsWithBody(self):
+        # Tests the use of multiple requests in a single connection.
+        h = HTTPConnection(LOCALHOST, self.port)
         for n in range(3):
-            self.testOkResponse(h)
-        self.testOkResponse(h, {'Connection': 'close'})
+            self.testEchoResponse(h, body='Hello, world!')
+        self.testEchoResponse(h, {'Connection': 'close'})
+
+    def testLargeBody(self):
+        # Tests the use of multiple requests in a single connection.
+        h = HTTPConnection(LOCALHOST, self.port)
+        s = 'This string has 32 characters.\r\n' * 32  # 1024 characters.
+        self.testEchoResponse(h, body=(s * 1024))  # 1 MB
+        self.testEchoResponse(h, {'Connection': 'close'},
+                            body=(s * 100))  # 100 KB
 
     def testManyClients(self):
         conns = []
-        for n in range(120):  # Linux kernel (2.4.8) doesn't like > 128 ?
+        for n in range(50):  # Linux kernel (2.4.8) doesn't like > 128 ?
             #print 'open', n, clock()
-            h = HTTPConnection('127.0.0.1', self.port)
+            h = HTTPConnection(LOCALHOST, self.port)
             #h.debuglevel = 1
             h.putrequest('GET', '/')
             h.putheader('Accept', 'text/plain')