blob: ca3c4ff218190244a0accd3885b674abc895055c [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
Jack Jansen522e7692002-09-06 21:57:50 +000011import sys
Barry Warsawcf3d4b51997-01-03 20:03:32 +000012
Guido van Rossum24e4af82002-06-12 19:18:08 +000013PORT = 50007
14HOST = 'localhost'
15MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000016
Guido van Rossum24e4af82002-06-12 19:18:08 +000017class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Guido van Rossum24e4af82002-06-12 19:18:08 +000019 def setUp(self):
20 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
21 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
22 self.serv.bind((HOST, PORT))
23 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000024
Guido van Rossum24e4af82002-06-12 19:18:08 +000025 def tearDown(self):
26 self.serv.close()
27 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000028
Guido van Rossum24e4af82002-06-12 19:18:08 +000029class SocketUDPTest(unittest.TestCase):
30
31 def setUp(self):
32 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
33 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
34 self.serv.bind((HOST, PORT))
35
36 def tearDown(self):
37 self.serv.close()
38 self.serv = None
39
40class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000041 """Threadable Test class
42
43 The ThreadableTest class makes it easy to create a threaded
44 client/server pair from an existing unit test. To create a
45 new threaded class from an existing unit test, use multiple
46 inheritance:
47
48 class NewClass (OldClass, ThreadableTest):
49 pass
50
51 This class defines two new fixture functions with obvious
52 purposes for overriding:
53
54 clientSetUp ()
55 clientTearDown ()
56
57 Any new test functions within the class must then define
58 tests in pairs, where the test name is preceeded with a
59 '_' to indicate the client portion of the test. Ex:
60
61 def testFoo(self):
62 # Server portion
63
64 def _testFoo(self):
65 # Client portion
66
67 Any exceptions raised by the clients during their tests
68 are caught and transferred to the main thread to alert
69 the testing framework.
70
71 Note, the server setup function cannot call any blocking
72 functions that rely on the client thread during setup,
73 unless serverExplicityReady() is called just before
74 the blocking call (such as in setting up a client/server
75 connection and performing the accept() in setUp().
76 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000077
78 def __init__(self):
79 # Swap the true setup function
80 self.__setUp = self.setUp
81 self.__tearDown = self.tearDown
82 self.setUp = self._setUp
83 self.tearDown = self._tearDown
84
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000085 def serverExplicitReady(self):
86 """This method allows the server to explicitly indicate that
87 it wants the client thread to proceed. This is useful if the
88 server is about to execute a blocking routine that is
89 dependent upon the client thread during its setup routine."""
90 self.server_ready.set()
91
Guido van Rossum24e4af82002-06-12 19:18:08 +000092 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000093 self.server_ready = threading.Event()
94 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000095 self.done = threading.Event()
96 self.queue = Queue.Queue(1)
97
98 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +000099 methodname = self.id()
100 i = methodname.rfind('.')
101 methodname = methodname[i+1:]
102 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000103 self.client_thread = thread.start_new_thread(
104 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000105
106 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000107 if not self.server_ready.isSet():
108 self.server_ready.set()
109 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000110
111 def _tearDown(self):
112 self.__tearDown()
113 self.done.wait()
114
115 if not self.queue.empty():
116 msg = self.queue.get()
117 self.fail(msg)
118
119 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000120 self.server_ready.wait()
121 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122 self.clientSetUp()
123 if not callable(test_func):
124 raise TypeError, "test_func must be a callable function"
125 try:
126 test_func()
127 except Exception, strerror:
128 self.queue.put(strerror)
129 self.clientTearDown()
130
131 def clientSetUp(self):
132 raise NotImplementedError, "clientSetUp must be implemented."
133
134 def clientTearDown(self):
135 self.done.set()
136 thread.exit()
137
138class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
139
140 def __init__(self, methodName='runTest'):
141 SocketTCPTest.__init__(self, methodName=methodName)
142 ThreadableTest.__init__(self)
143
144 def clientSetUp(self):
145 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
146
147 def clientTearDown(self):
148 self.cli.close()
149 self.cli = None
150 ThreadableTest.clientTearDown(self)
151
152class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
153
154 def __init__(self, methodName='runTest'):
155 SocketUDPTest.__init__(self, methodName=methodName)
156 ThreadableTest.__init__(self)
157
158 def clientSetUp(self):
159 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
160
161class SocketConnectedTest(ThreadedTCPSocketTest):
162
163 def __init__(self, methodName='runTest'):
164 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
165
166 def setUp(self):
167 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000168 # Indicate explicitly we're ready for the client thread to
169 # proceed and then perform the blocking call to accept
170 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000171 conn, addr = self.serv.accept()
172 self.cli_conn = conn
173
174 def tearDown(self):
175 self.cli_conn.close()
176 self.cli_conn = None
177 ThreadedTCPSocketTest.tearDown(self)
178
179 def clientSetUp(self):
180 ThreadedTCPSocketTest.clientSetUp(self)
181 self.cli.connect((HOST, PORT))
182 self.serv_conn = self.cli
183
184 def clientTearDown(self):
185 self.serv_conn.close()
186 self.serv_conn = None
187 ThreadedTCPSocketTest.clientTearDown(self)
188
189#######################################################################
190## Begin Tests
191
192class GeneralModuleTests(unittest.TestCase):
193
194 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000195 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000196 def raise_error(*args, **kwargs):
197 raise socket.error
198 def raise_herror(*args, **kwargs):
199 raise socket.herror
200 def raise_gaierror(*args, **kwargs):
201 raise socket.gaierror
202 self.failUnlessRaises(socket.error, raise_error,
203 "Error raising socket exception.")
204 self.failUnlessRaises(socket.error, raise_herror,
205 "Error raising socket exception.")
206 self.failUnlessRaises(socket.error, raise_gaierror,
207 "Error raising socket exception.")
208
209 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000210 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211 socket.AF_INET
212 socket.SOCK_STREAM
213 socket.SOCK_DGRAM
214 socket.SOCK_RAW
215 socket.SOCK_RDM
216 socket.SOCK_SEQPACKET
217 socket.SOL_SOCKET
218 socket.SO_REUSEADDR
219
Guido van Rossum654c11e2002-06-13 20:24:17 +0000220 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000221 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000222 hostname = socket.gethostname()
223 ip = socket.gethostbyname(hostname)
224 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
225 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
226 all_host_names = [hname] + aliases
227 fqhn = socket.getfqdn()
228 if not fqhn in all_host_names:
229 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000230
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000231 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000232 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000234 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000235 try:
236 # On some versions, this loses a reference
237 orig = sys.getrefcount(__name__)
238 socket.getnameinfo(__name__,0)
239 except SystemError:
240 if sys.getrefcount(__name__) <> orig:
241 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000242
Guido van Rossum24e4af82002-06-12 19:18:08 +0000243 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000244 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000245 try:
246 # On some versions, this crashes the interpreter.
247 socket.getnameinfo(('x', 0, 0, 0), 0)
248 except socket.error:
249 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000250
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000251 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000252 # This just checks that htons etc. are their own inverse,
253 # when looking at the lower 16 or 32 bits.
254 sizes = {socket.htonl: 32, socket.ntohl: 32,
255 socket.htons: 16, socket.ntohs: 16}
256 for func, size in sizes.items():
257 mask = (1L<<size) - 1
258 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
259 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000260
Guido van Rossuma2627af2002-09-14 00:58:46 +0000261 swapped = func(mask)
262 self.assertEqual(swapped & mask, mask)
263 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000264
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265 def testGetServByName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000266 # Testing getservbyname()
Skip Montanarof4433302002-08-02 15:52:30 +0000267 # try a few protocols - not everyone has telnet enabled
268 found = 0
269 for proto in ("telnet", "ssh", "www", "ftp"):
270 try:
271 socket.getservbyname(proto, 'tcp')
272 found = 1
273 break
274 except socket.error:
275 pass
276 try:
277 socket.getservbyname(proto, 'udp')
278 found = 1
279 break
280 except socket.error:
281 pass
282 if not found:
283 raise socket.error
Guido van Rossum24e4af82002-06-12 19:18:08 +0000284
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000285 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000286 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000287 # The default timeout should initially be None
288 self.assertEqual(socket.getdefaulttimeout(), None)
289 s = socket.socket()
290 self.assertEqual(s.gettimeout(), None)
291 s.close()
292
293 # Set the default timeout to 10, and see if it propagates
294 socket.setdefaulttimeout(10)
295 self.assertEqual(socket.getdefaulttimeout(), 10)
296 s = socket.socket()
297 self.assertEqual(s.gettimeout(), 10)
298 s.close()
299
300 # Reset the default timeout to None, and see if it propagates
301 socket.setdefaulttimeout(None)
302 self.assertEqual(socket.getdefaulttimeout(), None)
303 s = socket.socket()
304 self.assertEqual(s.gettimeout(), None)
305 s.close()
306
307 # Check that setting it to an invalid value raises ValueError
308 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
309
310 # Check that setting it to an invalid type raises TypeError
311 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
312
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000313 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000314
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000316 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000317 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000318 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000319 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000320 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000321
322 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000323 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000324 # We know a socket should start without reuse==0
325 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
326 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000327 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000328
329 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000330 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
332 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
333 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000334 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000335
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000336 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000337 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000338 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
339 sock.settimeout(1)
340 sock.close()
341 self.assertRaises(socket.error, sock.send, "spam")
342
Guido van Rossum24e4af82002-06-12 19:18:08 +0000343class BasicTCPTest(SocketConnectedTest):
344
345 def __init__(self, methodName='runTest'):
346 SocketConnectedTest.__init__(self, methodName=methodName)
347
348 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000349 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000350 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000351 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000352
353 def _testRecv(self):
354 self.serv_conn.send(MSG)
355
356 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000357 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358 seg1 = self.cli_conn.recv(len(MSG) - 3)
359 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000360 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000361 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000362
363 def _testOverFlowRecv(self):
364 self.serv_conn.send(MSG)
365
366 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000367 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000368 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000369 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000370
371 def _testRecvFrom(self):
372 self.serv_conn.send(MSG)
373
374 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000375 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
377 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000378 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000379 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000380
381 def _testOverFlowRecvFrom(self):
382 self.serv_conn.send(MSG)
383
384 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000385 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000386 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000387 while 1:
388 read = self.cli_conn.recv(1024)
389 if not read:
390 break
Guido van Rossume531e292002-08-08 20:28:34 +0000391 msg += read
392 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000393
394 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000395 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000396 self.serv_conn.sendall(big_chunk)
397
398 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000399 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000400 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000401 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000402 fd = self.cli_conn.fileno()
403 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
404 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000405 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000406
407 def _testFromFd(self):
408 self.serv_conn.send(MSG)
409
410 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000411 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000412 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000413 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000414
415 def _testShutdown(self):
416 self.serv_conn.send(MSG)
417 self.serv_conn.shutdown(2)
418
419class BasicUDPTest(ThreadedUDPSocketTest):
420
421 def __init__(self, methodName='runTest'):
422 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
423
424 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000425 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000426 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000427 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000428
429 def _testSendtoAndRecv(self):
430 self.cli.sendto(MSG, 0, (HOST, PORT))
431
Guido van Rossum1c938012002-06-12 21:17:20 +0000432 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000433 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000434 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000435 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000436
Guido van Rossum1c938012002-06-12 21:17:20 +0000437 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000438 self.cli.sendto(MSG, 0, (HOST, PORT))
439
440class NonBlockingTCPTests(ThreadedTCPSocketTest):
441
442 def __init__(self, methodName='runTest'):
443 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
444
445 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000446 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000447 self.serv.setblocking(0)
448 start = time.time()
449 try:
450 self.serv.accept()
451 except socket.error:
452 pass
453 end = time.time()
454 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
455
456 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000457 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000458
Guido van Rossum24e4af82002-06-12 19:18:08 +0000459 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000460 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000461 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000462 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000463 conn, addr = self.serv.accept()
464 except socket.error:
465 pass
466 else:
467 self.fail("Error trying to do non-blocking accept.")
468 read, write, err = select.select([self.serv], [], [])
469 if self.serv in read:
470 conn, addr = self.serv.accept()
471 else:
472 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000473
Guido van Rossum24e4af82002-06-12 19:18:08 +0000474 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000475 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000476 self.cli.connect((HOST, PORT))
477
478 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000479 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000480 conn, addr = self.serv.accept()
481
482 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000483 self.cli.settimeout(10)
484 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000485
486 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000487 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488 conn, addr = self.serv.accept()
489 conn.setblocking(0)
490 try:
491 msg = conn.recv(len(MSG))
492 except socket.error:
493 pass
494 else:
495 self.fail("Error trying to do non-blocking recv.")
496 read, write, err = select.select([conn], [], [])
497 if conn in read:
498 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000499 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500 else:
501 self.fail("Error during select call to non-blocking socket.")
502
503 def _testRecv(self):
504 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000505 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000506 self.cli.send(MSG)
507
508class FileObjectClassTestCase(SocketConnectedTest):
509
Guido van Rossume9f66142002-08-07 15:46:19 +0000510 bufsize = -1 # Use default buffer size
511
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512 def __init__(self, methodName='runTest'):
513 SocketConnectedTest.__init__(self, methodName=methodName)
514
515 def setUp(self):
516 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000517 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000518
519 def tearDown(self):
520 self.serv_file.close()
521 self.serv_file = None
522 SocketConnectedTest.tearDown(self)
523
524 def clientSetUp(self):
525 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000526 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000527
528 def clientTearDown(self):
529 self.cli_file.close()
530 self.cli_file = None
531 SocketConnectedTest.clientTearDown(self)
532
533 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000534 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535 first_seg = self.serv_file.read(len(MSG)-3)
536 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000537 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000538 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539
540 def _testSmallRead(self):
541 self.cli_file.write(MSG)
542 self.cli_file.flush()
543
Guido van Rossum8c943832002-08-08 01:00:28 +0000544 def testFullRead(self):
545 # read until EOF
546 msg = self.serv_file.read()
547 self.assertEqual(msg, MSG)
548
549 def _testFullRead(self):
550 self.cli_file.write(MSG)
551 self.cli_file.close()
552
Guido van Rossum24e4af82002-06-12 19:18:08 +0000553 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000554 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000555 buf = ''
556 while 1:
557 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000558 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000559 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000560 buf += char
561 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562
563 def _testUnbufferedRead(self):
564 self.cli_file.write(MSG)
565 self.cli_file.flush()
566
567 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000568 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000569 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000570 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571
572 def _testReadline(self):
573 self.cli_file.write(MSG)
574 self.cli_file.flush()
575
Guido van Rossume9f66142002-08-07 15:46:19 +0000576class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
577
578 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000579
Guido van Rossume9f66142002-08-07 15:46:19 +0000580 In this case (and in this case only), it should be possible to
581 create a file object, read a line from it, create another file
582 object, read another line from it, without loss of data in the
583 first file object's buffer. Note that httplib relies on this
584 when reading multiple requests from the same socket."""
585
586 bufsize = 0 # Use unbuffered mode
587
588 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000589 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000590 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000591 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000592 self.serv_file = self.cli_conn.makefile('rb', 0)
593 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000594 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000595
596 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000597 self.cli_file.write("A. " + MSG)
598 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000599 self.cli_file.flush()
600
Guido van Rossum8c943832002-08-08 01:00:28 +0000601class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
602
603 bufsize = 1 # Default-buffered for reading; line-buffered for writing
604
605
606class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
607
608 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000609
Guido van Rossumb995eb72002-07-31 16:08:40 +0000610def test_main():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611 suite = unittest.TestSuite()
Guido van Rossum29bf9152002-08-07 16:03:06 +0000612 suite.addTest(unittest.makeSuite(GeneralModuleTests))
613 suite.addTest(unittest.makeSuite(BasicTCPTest))
Jack Jansen522e7692002-09-06 21:57:50 +0000614 if sys.platform != 'mac':
615 suite.addTest(unittest.makeSuite(BasicUDPTest))
Guido van Rossum29bf9152002-08-07 16:03:06 +0000616 suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617 suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
Guido van Rossume9f66142002-08-07 15:46:19 +0000618 suite.addTest(unittest.makeSuite(UnbufferedFileObjectClassTestCase))
Guido van Rossum8c943832002-08-08 01:00:28 +0000619 suite.addTest(unittest.makeSuite(LineBufferedFileObjectClassTestCase))
620 suite.addTest(unittest.makeSuite(SmallBufferedFileObjectClassTestCase))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621 test_support.run_suite(suite)
622
623if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000624 test_main()