blob: ec3ed57dc3723c54e2fbaab07cbe19f0dbd74400 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001#!/usr/bin/env python
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00004from test import test_support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import time
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import thread, threading
10import Queue
Barry Warsawcf3d4b51997-01-03 20:03:32 +000011
Guido van Rossum24e4af82002-06-12 19:18:08 +000012PORT = 50007
13HOST = 'localhost'
14MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000015
Guido van Rossum24e4af82002-06-12 19:18:08 +000016class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Guido van Rossum24e4af82002-06-12 19:18:08 +000018 def setUp(self):
19 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
20 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
21 self.serv.bind((HOST, PORT))
22 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000023
Guido van Rossum24e4af82002-06-12 19:18:08 +000024 def tearDown(self):
25 self.serv.close()
26 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000027
Guido van Rossum24e4af82002-06-12 19:18:08 +000028class SocketUDPTest(unittest.TestCase):
29
30 def setUp(self):
31 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
32 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
33 self.serv.bind((HOST, PORT))
34
35 def tearDown(self):
36 self.serv.close()
37 self.serv = None
38
39class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000040 """Threadable Test class
41
42 The ThreadableTest class makes it easy to create a threaded
43 client/server pair from an existing unit test. To create a
44 new threaded class from an existing unit test, use multiple
45 inheritance:
46
47 class NewClass (OldClass, ThreadableTest):
48 pass
49
50 This class defines two new fixture functions with obvious
51 purposes for overriding:
52
53 clientSetUp ()
54 clientTearDown ()
55
56 Any new test functions within the class must then define
57 tests in pairs, where the test name is preceeded with a
58 '_' to indicate the client portion of the test. Ex:
59
60 def testFoo(self):
61 # Server portion
62
63 def _testFoo(self):
64 # Client portion
65
66 Any exceptions raised by the clients during their tests
67 are caught and transferred to the main thread to alert
68 the testing framework.
69
70 Note, the server setup function cannot call any blocking
71 functions that rely on the client thread during setup,
72 unless serverExplicityReady() is called just before
73 the blocking call (such as in setting up a client/server
74 connection and performing the accept() in setUp().
75 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000076
77 def __init__(self):
78 # Swap the true setup function
79 self.__setUp = self.setUp
80 self.__tearDown = self.tearDown
81 self.setUp = self._setUp
82 self.tearDown = self._tearDown
83
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000084 def serverExplicitReady(self):
85 """This method allows the server to explicitly indicate that
86 it wants the client thread to proceed. This is useful if the
87 server is about to execute a blocking routine that is
88 dependent upon the client thread during its setup routine."""
89 self.server_ready.set()
90
Guido van Rossum24e4af82002-06-12 19:18:08 +000091 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000092 self.server_ready = threading.Event()
93 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000094 self.done = threading.Event()
95 self.queue = Queue.Queue(1)
96
97 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +000098 methodname = self.id()
99 i = methodname.rfind('.')
100 methodname = methodname[i+1:]
101 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000102 self.client_thread = thread.start_new_thread(
103 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000104
105 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000106 if not self.server_ready.isSet():
107 self.server_ready.set()
108 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000109
110 def _tearDown(self):
111 self.__tearDown()
112 self.done.wait()
113
114 if not self.queue.empty():
115 msg = self.queue.get()
116 self.fail(msg)
117
118 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000119 self.server_ready.wait()
120 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121 self.clientSetUp()
122 if not callable(test_func):
123 raise TypeError, "test_func must be a callable function"
124 try:
125 test_func()
126 except Exception, strerror:
127 self.queue.put(strerror)
128 self.clientTearDown()
129
130 def clientSetUp(self):
131 raise NotImplementedError, "clientSetUp must be implemented."
132
133 def clientTearDown(self):
134 self.done.set()
135 thread.exit()
136
137class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
138
139 def __init__(self, methodName='runTest'):
140 SocketTCPTest.__init__(self, methodName=methodName)
141 ThreadableTest.__init__(self)
142
143 def clientSetUp(self):
144 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
145
146 def clientTearDown(self):
147 self.cli.close()
148 self.cli = None
149 ThreadableTest.clientTearDown(self)
150
151class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
152
153 def __init__(self, methodName='runTest'):
154 SocketUDPTest.__init__(self, methodName=methodName)
155 ThreadableTest.__init__(self)
156
157 def clientSetUp(self):
158 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
159
160class SocketConnectedTest(ThreadedTCPSocketTest):
161
162 def __init__(self, methodName='runTest'):
163 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
164
165 def setUp(self):
166 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000167 # Indicate explicitly we're ready for the client thread to
168 # proceed and then perform the blocking call to accept
169 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000170 conn, addr = self.serv.accept()
171 self.cli_conn = conn
172
173 def tearDown(self):
174 self.cli_conn.close()
175 self.cli_conn = None
176 ThreadedTCPSocketTest.tearDown(self)
177
178 def clientSetUp(self):
179 ThreadedTCPSocketTest.clientSetUp(self)
180 self.cli.connect((HOST, PORT))
181 self.serv_conn = self.cli
182
183 def clientTearDown(self):
184 self.serv_conn.close()
185 self.serv_conn = None
186 ThreadedTCPSocketTest.clientTearDown(self)
187
188#######################################################################
189## Begin Tests
190
191class GeneralModuleTests(unittest.TestCase):
192
193 def testSocketError(self):
194 """Testing that socket module exceptions."""
195 def raise_error(*args, **kwargs):
196 raise socket.error
197 def raise_herror(*args, **kwargs):
198 raise socket.herror
199 def raise_gaierror(*args, **kwargs):
200 raise socket.gaierror
201 self.failUnlessRaises(socket.error, raise_error,
202 "Error raising socket exception.")
203 self.failUnlessRaises(socket.error, raise_herror,
204 "Error raising socket exception.")
205 self.failUnlessRaises(socket.error, raise_gaierror,
206 "Error raising socket exception.")
207
208 def testCrucialConstants(self):
209 """Testing for mission critical constants."""
210 socket.AF_INET
211 socket.SOCK_STREAM
212 socket.SOCK_DGRAM
213 socket.SOCK_RAW
214 socket.SOCK_RDM
215 socket.SOCK_SEQPACKET
216 socket.SOL_SOCKET
217 socket.SO_REUSEADDR
218
Guido van Rossum654c11e2002-06-13 20:24:17 +0000219 def testHostnameRes(self):
220 """Testing hostname resolution mechanisms."""
221 hostname = socket.gethostname()
222 ip = socket.gethostbyname(hostname)
223 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
224 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
225 all_host_names = [hname] + aliases
226 fqhn = socket.getfqdn()
227 if not fqhn in all_host_names:
228 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000229
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000230 def testRefCountGetNameInfo(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 """Testing reference count for getnameinfo."""
232 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000233 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000234 try:
235 # On some versions, this loses a reference
236 orig = sys.getrefcount(__name__)
237 socket.getnameinfo(__name__,0)
238 except SystemError:
239 if sys.getrefcount(__name__) <> orig:
240 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000241
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242 def testInterpreterCrash(self):
243 """Making sure getnameinfo doesn't crash the interpreter."""
244 try:
245 # On some versions, this crashes the interpreter.
246 socket.getnameinfo(('x', 0, 0, 0), 0)
247 except socket.error:
248 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000249
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000250 def testNtoH(self):
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000251 for func in socket.htonl, socket.ntohl:
252 for i in (0, 1, 0xffff0000, 2L):
253 self.assertEqual(i, func(func(i)))
254
255 biglong = 2**32L - 1
256 swapped = func(biglong)
257 self.assert_(swapped == biglong or swapped == -1)
258 self.assertRaises(OverflowError, func, 2L**34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000259
Guido van Rossum24e4af82002-06-12 19:18:08 +0000260 def testGetServByName(self):
Guido van Rossum1c938012002-06-12 21:17:20 +0000261 """Testing getservbyname()."""
Skip Montanarof4433302002-08-02 15:52:30 +0000262 # try a few protocols - not everyone has telnet enabled
263 found = 0
264 for proto in ("telnet", "ssh", "www", "ftp"):
265 try:
266 socket.getservbyname(proto, 'tcp')
267 found = 1
268 break
269 except socket.error:
270 pass
271 try:
272 socket.getservbyname(proto, 'udp')
273 found = 1
274 break
275 except socket.error:
276 pass
277 if not found:
278 raise socket.error
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000280 def testDefaultTimeout(self):
281 """Testing default timeout."""
282 # The default timeout should initially be None
283 self.assertEqual(socket.getdefaulttimeout(), None)
284 s = socket.socket()
285 self.assertEqual(s.gettimeout(), None)
286 s.close()
287
288 # Set the default timeout to 10, and see if it propagates
289 socket.setdefaulttimeout(10)
290 self.assertEqual(socket.getdefaulttimeout(), 10)
291 s = socket.socket()
292 self.assertEqual(s.gettimeout(), 10)
293 s.close()
294
295 # Reset the default timeout to None, and see if it propagates
296 socket.setdefaulttimeout(None)
297 self.assertEqual(socket.getdefaulttimeout(), None)
298 s = socket.socket()
299 self.assertEqual(s.gettimeout(), None)
300 s.close()
301
302 # Check that setting it to an invalid value raises ValueError
303 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
304
305 # Check that setting it to an invalid type raises TypeError
306 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
307
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000308 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000309
Guido van Rossum24e4af82002-06-12 19:18:08 +0000310 def testSockName(self):
311 """Testing getsockname()."""
312 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000313 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000314 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000315 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000316
317 def testGetSockOpt(self):
318 """Testing getsockopt()."""
319 # We know a socket should start without reuse==0
320 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
321 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000322 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000323
324 def testSetSockOpt(self):
325 """Testing setsockopt()."""
326 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
327 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
328 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000329 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000330
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000331 def testSendAfterClose(self):
332 """testing send() after close() with timeout."""
333 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
334 sock.settimeout(1)
335 sock.close()
336 self.assertRaises(socket.error, sock.send, "spam")
337
Guido van Rossum24e4af82002-06-12 19:18:08 +0000338class BasicTCPTest(SocketConnectedTest):
339
340 def __init__(self, methodName='runTest'):
341 SocketConnectedTest.__init__(self, methodName=methodName)
342
343 def testRecv(self):
344 """Testing large receive over TCP."""
345 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000346 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000347
348 def _testRecv(self):
349 self.serv_conn.send(MSG)
350
351 def testOverFlowRecv(self):
352 """Testing receive in chunks over TCP."""
353 seg1 = self.cli_conn.recv(len(MSG) - 3)
354 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000355 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000356 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357
358 def _testOverFlowRecv(self):
359 self.serv_conn.send(MSG)
360
361 def testRecvFrom(self):
362 """Testing large recvfrom() over TCP."""
363 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000364 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000365
366 def _testRecvFrom(self):
367 self.serv_conn.send(MSG)
368
369 def testOverFlowRecvFrom(self):
370 """Testing recvfrom() in chunks over TCP."""
371 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
372 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000373 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000374 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375
376 def _testOverFlowRecvFrom(self):
377 self.serv_conn.send(MSG)
378
379 def testSendAll(self):
380 """Testing sendall() with a 2048 byte string over TCP."""
381 while 1:
382 read = self.cli_conn.recv(1024)
383 if not read:
384 break
385 self.assert_(len(read) == 1024, "Error performing sendall.")
386 read = filter(lambda x: x == 'f', read)
387 self.assert_(len(read) == 1024, "Error performing sendall.")
388
389 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000390 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000391 self.serv_conn.sendall(big_chunk)
392
393 def testFromFd(self):
394 """Testing fromfd()."""
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000395 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000396 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000397 fd = self.cli_conn.fileno()
398 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
399 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000400 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000401
402 def _testFromFd(self):
403 self.serv_conn.send(MSG)
404
405 def testShutdown(self):
406 """Testing shutdown()."""
407 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000408 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000409
410 def _testShutdown(self):
411 self.serv_conn.send(MSG)
412 self.serv_conn.shutdown(2)
413
414class BasicUDPTest(ThreadedUDPSocketTest):
415
416 def __init__(self, methodName='runTest'):
417 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
418
419 def testSendtoAndRecv(self):
420 """Testing sendto() and Recv() over UDP."""
421 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000422 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000423
424 def _testSendtoAndRecv(self):
425 self.cli.sendto(MSG, 0, (HOST, PORT))
426
Guido van Rossum1c938012002-06-12 21:17:20 +0000427 def testRecvFrom(self):
Guido van Rossumdfad1a92002-06-13 15:03:01 +0000428 """Testing recvfrom() over UDP."""
Guido van Rossum24e4af82002-06-12 19:18:08 +0000429 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000430 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000431
Guido van Rossum1c938012002-06-12 21:17:20 +0000432 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000433 self.cli.sendto(MSG, 0, (HOST, PORT))
434
435class NonBlockingTCPTests(ThreadedTCPSocketTest):
436
437 def __init__(self, methodName='runTest'):
438 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
439
440 def testSetBlocking(self):
441 """Testing whether set blocking works."""
442 self.serv.setblocking(0)
443 start = time.time()
444 try:
445 self.serv.accept()
446 except socket.error:
447 pass
448 end = time.time()
449 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
450
451 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000452 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000453
Guido van Rossum24e4af82002-06-12 19:18:08 +0000454 def testAccept(self):
455 """Testing non-blocking accept."""
456 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000457 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000458 conn, addr = self.serv.accept()
459 except socket.error:
460 pass
461 else:
462 self.fail("Error trying to do non-blocking accept.")
463 read, write, err = select.select([self.serv], [], [])
464 if self.serv in read:
465 conn, addr = self.serv.accept()
466 else:
467 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000468
Guido van Rossum24e4af82002-06-12 19:18:08 +0000469 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000470 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000471 self.cli.connect((HOST, PORT))
472
473 def testConnect(self):
474 """Testing non-blocking connect."""
Guido van Rossum24e4af82002-06-12 19:18:08 +0000475 conn, addr = self.serv.accept()
476
477 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000478 self.cli.settimeout(10)
479 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000480
481 def testRecv(self):
482 """Testing non-blocking recv."""
483 conn, addr = self.serv.accept()
484 conn.setblocking(0)
485 try:
486 msg = conn.recv(len(MSG))
487 except socket.error:
488 pass
489 else:
490 self.fail("Error trying to do non-blocking recv.")
491 read, write, err = select.select([conn], [], [])
492 if conn in read:
493 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000494 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495 else:
496 self.fail("Error during select call to non-blocking socket.")
497
498 def _testRecv(self):
499 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000500 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000501 self.cli.send(MSG)
502
503class FileObjectClassTestCase(SocketConnectedTest):
504
Guido van Rossume9f66142002-08-07 15:46:19 +0000505 bufsize = -1 # Use default buffer size
506
Guido van Rossum24e4af82002-06-12 19:18:08 +0000507 def __init__(self, methodName='runTest'):
508 SocketConnectedTest.__init__(self, methodName=methodName)
509
510 def setUp(self):
511 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000512 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513
514 def tearDown(self):
515 self.serv_file.close()
516 self.serv_file = None
517 SocketConnectedTest.tearDown(self)
518
519 def clientSetUp(self):
520 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000521 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522
523 def clientTearDown(self):
524 self.cli_file.close()
525 self.cli_file = None
526 SocketConnectedTest.clientTearDown(self)
527
528 def testSmallRead(self):
529 """Performing small file read test."""
530 first_seg = self.serv_file.read(len(MSG)-3)
531 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000532 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000533 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534
535 def _testSmallRead(self):
536 self.cli_file.write(MSG)
537 self.cli_file.flush()
538
539 def testUnbufferedRead(self):
540 """Performing unbuffered file read test."""
541 buf = ''
542 while 1:
543 char = self.serv_file.read(1)
Guido van Rossum76489682002-06-12 20:38:30 +0000544 self.failIf(not char)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000545 buf += char
546 if buf == MSG:
547 break
548
549 def _testUnbufferedRead(self):
550 self.cli_file.write(MSG)
551 self.cli_file.flush()
552
553 def testReadline(self):
554 """Performing file readline test."""
555 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000556 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557
558 def _testReadline(self):
559 self.cli_file.write(MSG)
560 self.cli_file.flush()
561
Guido van Rossume9f66142002-08-07 15:46:19 +0000562class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
563
564 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
565
566 In this case (and in this case only), it should be possible to
567 create a file object, read a line from it, create another file
568 object, read another line from it, without loss of data in the
569 first file object's buffer. Note that httplib relies on this
570 when reading multiple requests from the same socket."""
571
572 bufsize = 0 # Use unbuffered mode
573
574 def testUnbufferedReadline(self):
575 """Read a line, create a new file object, read another line with it."""
576 line = self.serv_file.readline() # first line
577 self.assertEqual(line, MSG) # first line
578 self.serv_file = self.cli_conn.makefile('rb', 0)
579 line = self.serv_file.readline() # second line
580 self.assertEqual(line, MSG) # second line
581
582 def _testUnbufferedReadline(self):
583 self.cli_file.write(MSG)
584 self.cli_file.write(MSG)
585 self.cli_file.flush()
586
587
Guido van Rossumb995eb72002-07-31 16:08:40 +0000588def test_main():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000589 suite = unittest.TestSuite()
Guido van Rossume9f66142002-08-07 15:46:19 +0000590 ##suite.addTest(unittest.makeSuite(GeneralModuleTests))
591 ##suite.addTest(unittest.makeSuite(BasicTCPTest))
592 ##suite.addTest(unittest.makeSuite(BasicUDPTest))
593 ##suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000594 suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
Guido van Rossume9f66142002-08-07 15:46:19 +0000595 suite.addTest(unittest.makeSuite(UnbufferedFileObjectClassTestCase))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000596 test_support.run_suite(suite)
597
598if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000599 test_main()