[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')