blob: 0b36136330140753f4426944a49664935091f623 [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
219 def testNonCrucialConstants(self):
220 """Testing for existance of non-crucial constants."""
221 for const in (
222 "AF_UNIX",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000223
Guido van Rossum41360a41998-03-26 19:42:58 +0000224 "SO_DEBUG", "SO_ACCEPTCONN", "SO_REUSEADDR", "SO_KEEPALIVE",
225 "SO_DONTROUTE", "SO_BROADCAST", "SO_USELOOPBACK", "SO_LINGER",
226 "SO_OOBINLINE", "SO_REUSEPORT", "SO_SNDBUF", "SO_RCVBUF",
227 "SO_SNDLOWAT", "SO_RCVLOWAT", "SO_SNDTIMEO", "SO_RCVTIMEO",
228 "SO_ERROR", "SO_TYPE", "SOMAXCONN",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000229
Guido van Rossum41360a41998-03-26 19:42:58 +0000230 "MSG_OOB", "MSG_PEEK", "MSG_DONTROUTE", "MSG_EOR",
231 "MSG_TRUNC", "MSG_CTRUNC", "MSG_WAITALL", "MSG_BTAG",
232 "MSG_ETAG",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000233
Guido van Rossum41360a41998-03-26 19:42:58 +0000234 "SOL_SOCKET",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000235
Guido van Rossum41360a41998-03-26 19:42:58 +0000236 "IPPROTO_IP", "IPPROTO_ICMP", "IPPROTO_IGMP",
237 "IPPROTO_GGP", "IPPROTO_TCP", "IPPROTO_EGP",
238 "IPPROTO_PUP", "IPPROTO_UDP", "IPPROTO_IDP",
239 "IPPROTO_HELLO", "IPPROTO_ND", "IPPROTO_TP",
240 "IPPROTO_XTP", "IPPROTO_EON", "IPPROTO_BIP",
241 "IPPROTO_RAW", "IPPROTO_MAX",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000242
Guido van Rossum41360a41998-03-26 19:42:58 +0000243 "IPPORT_RESERVED", "IPPORT_USERRESERVED",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000244
Guido van Rossum41360a41998-03-26 19:42:58 +0000245 "INADDR_ANY", "INADDR_BROADCAST", "INADDR_LOOPBACK",
246 "INADDR_UNSPEC_GROUP", "INADDR_ALLHOSTS_GROUP",
247 "INADDR_MAX_LOCAL_GROUP", "INADDR_NONE",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000248
Guido van Rossum41360a41998-03-26 19:42:58 +0000249 "IP_OPTIONS", "IP_HDRINCL", "IP_TOS", "IP_TTL",
250 "IP_RECVOPTS", "IP_RECVRETOPTS", "IP_RECVDSTADDR",
251 "IP_RETOPTS", "IP_MULTICAST_IF", "IP_MULTICAST_TTL",
252 "IP_MULTICAST_LOOP", "IP_ADD_MEMBERSHIP",
253 "IP_DROP_MEMBERSHIP",
Guido van Rossum24e4af82002-06-12 19:18:08 +0000254 ):
255 try:
256 getattr(socket, const)
257 except AttributeError:
258 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000259
Guido van Rossum654c11e2002-06-13 20:24:17 +0000260 def testHostnameRes(self):
261 """Testing hostname resolution mechanisms."""
262 hostname = socket.gethostname()
263 ip = socket.gethostbyname(hostname)
264 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
265 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
266 all_host_names = [hname] + aliases
267 fqhn = socket.getfqdn()
268 if not fqhn in all_host_names:
269 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000270
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000271 def testRefCountGetNameInfo(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272 """Testing reference count for getnameinfo."""
273 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000274 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 try:
276 # On some versions, this loses a reference
277 orig = sys.getrefcount(__name__)
278 socket.getnameinfo(__name__,0)
279 except SystemError:
280 if sys.getrefcount(__name__) <> orig:
281 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000282
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283 def testInterpreterCrash(self):
284 """Making sure getnameinfo doesn't crash the interpreter."""
285 try:
286 # On some versions, this crashes the interpreter.
287 socket.getnameinfo(('x', 0, 0, 0), 0)
288 except socket.error:
289 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000290
Guido van Rossum24e4af82002-06-12 19:18:08 +0000291 def testGetServByName(self):
Guido van Rossum1c938012002-06-12 21:17:20 +0000292 """Testing getservbyname()."""
Guido van Rossum24e4af82002-06-12 19:18:08 +0000293 if hasattr(socket, 'getservbyname'):
294 socket.getservbyname('telnet', 'tcp')
295 try:
296 socket.getservbyname('telnet', 'udp')
297 except socket.error:
298 pass
299
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000300 def testDefaultTimeout(self):
301 """Testing default timeout."""
302 # The default timeout should initially be None
303 self.assertEqual(socket.getdefaulttimeout(), None)
304 s = socket.socket()
305 self.assertEqual(s.gettimeout(), None)
306 s.close()
307
308 # Set the default timeout to 10, and see if it propagates
309 socket.setdefaulttimeout(10)
310 self.assertEqual(socket.getdefaulttimeout(), 10)
311 s = socket.socket()
312 self.assertEqual(s.gettimeout(), 10)
313 s.close()
314
315 # Reset the default timeout to None, and see if it propagates
316 socket.setdefaulttimeout(None)
317 self.assertEqual(socket.getdefaulttimeout(), None)
318 s = socket.socket()
319 self.assertEqual(s.gettimeout(), None)
320 s.close()
321
322 # Check that setting it to an invalid value raises ValueError
323 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
324
325 # Check that setting it to an invalid type raises TypeError
326 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
327
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000328 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000329
Guido van Rossum24e4af82002-06-12 19:18:08 +0000330 def testSockName(self):
331 """Testing getsockname()."""
332 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000333 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000334 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000335 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000336
337 def testGetSockOpt(self):
338 """Testing getsockopt()."""
339 # We know a socket should start without reuse==0
340 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
341 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000342 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000343
344 def testSetSockOpt(self):
345 """Testing setsockopt()."""
346 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
347 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
348 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000349 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000350
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000351 def testSendAfterClose(self):
352 """testing send() after close() with timeout."""
353 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
354 sock.settimeout(1)
355 sock.close()
356 self.assertRaises(socket.error, sock.send, "spam")
357
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358class BasicTCPTest(SocketConnectedTest):
359
360 def __init__(self, methodName='runTest'):
361 SocketConnectedTest.__init__(self, methodName=methodName)
362
363 def testRecv(self):
364 """Testing large receive over TCP."""
365 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000366 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000367
368 def _testRecv(self):
369 self.serv_conn.send(MSG)
370
371 def testOverFlowRecv(self):
372 """Testing receive in chunks over TCP."""
373 seg1 = self.cli_conn.recv(len(MSG) - 3)
374 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000375 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000376 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000377
378 def _testOverFlowRecv(self):
379 self.serv_conn.send(MSG)
380
381 def testRecvFrom(self):
382 """Testing large recvfrom() over TCP."""
383 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000384 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000385
386 def _testRecvFrom(self):
387 self.serv_conn.send(MSG)
388
389 def testOverFlowRecvFrom(self):
390 """Testing recvfrom() in chunks over TCP."""
391 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
392 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000393 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000394 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000395
396 def _testOverFlowRecvFrom(self):
397 self.serv_conn.send(MSG)
398
399 def testSendAll(self):
400 """Testing sendall() with a 2048 byte string over TCP."""
401 while 1:
402 read = self.cli_conn.recv(1024)
403 if not read:
404 break
405 self.assert_(len(read) == 1024, "Error performing sendall.")
406 read = filter(lambda x: x == 'f', read)
407 self.assert_(len(read) == 1024, "Error performing sendall.")
408
409 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000410 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000411 self.serv_conn.sendall(big_chunk)
412
413 def testFromFd(self):
414 """Testing fromfd()."""
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000415 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000416 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000417 fd = self.cli_conn.fileno()
418 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
419 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000420 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000421
422 def _testFromFd(self):
423 self.serv_conn.send(MSG)
424
425 def testShutdown(self):
426 """Testing shutdown()."""
427 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000428 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000429
430 def _testShutdown(self):
431 self.serv_conn.send(MSG)
432 self.serv_conn.shutdown(2)
433
434class BasicUDPTest(ThreadedUDPSocketTest):
435
436 def __init__(self, methodName='runTest'):
437 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
438
439 def testSendtoAndRecv(self):
440 """Testing sendto() and Recv() over UDP."""
441 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000442 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000443
444 def _testSendtoAndRecv(self):
445 self.cli.sendto(MSG, 0, (HOST, PORT))
446
Guido van Rossum1c938012002-06-12 21:17:20 +0000447 def testRecvFrom(self):
Guido van Rossumdfad1a92002-06-13 15:03:01 +0000448 """Testing recvfrom() over UDP."""
Guido van Rossum24e4af82002-06-12 19:18:08 +0000449 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000450 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000451
Guido van Rossum1c938012002-06-12 21:17:20 +0000452 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000453 self.cli.sendto(MSG, 0, (HOST, PORT))
454
455class NonBlockingTCPTests(ThreadedTCPSocketTest):
456
457 def __init__(self, methodName='runTest'):
458 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
459
460 def testSetBlocking(self):
461 """Testing whether set blocking works."""
462 self.serv.setblocking(0)
463 start = time.time()
464 try:
465 self.serv.accept()
466 except socket.error:
467 pass
468 end = time.time()
469 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
470
471 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000472 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000473
Guido van Rossum24e4af82002-06-12 19:18:08 +0000474 def testAccept(self):
475 """Testing non-blocking accept."""
476 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000477 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000478 conn, addr = self.serv.accept()
479 except socket.error:
480 pass
481 else:
482 self.fail("Error trying to do non-blocking accept.")
483 read, write, err = select.select([self.serv], [], [])
484 if self.serv in read:
485 conn, addr = self.serv.accept()
486 else:
487 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000488
Guido van Rossum24e4af82002-06-12 19:18:08 +0000489 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000490 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000491 self.cli.connect((HOST, PORT))
492
493 def testConnect(self):
494 """Testing non-blocking connect."""
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495 conn, addr = self.serv.accept()
496
497 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000498 self.cli.settimeout(10)
499 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500
501 def testRecv(self):
502 """Testing non-blocking recv."""
503 conn, addr = self.serv.accept()
504 conn.setblocking(0)
505 try:
506 msg = conn.recv(len(MSG))
507 except socket.error:
508 pass
509 else:
510 self.fail("Error trying to do non-blocking recv.")
511 read, write, err = select.select([conn], [], [])
512 if conn in read:
513 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000514 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000515 else:
516 self.fail("Error during select call to non-blocking socket.")
517
518 def _testRecv(self):
519 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000520 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521 self.cli.send(MSG)
522
523class FileObjectClassTestCase(SocketConnectedTest):
524
525 def __init__(self, methodName='runTest'):
526 SocketConnectedTest.__init__(self, methodName=methodName)
527
528 def setUp(self):
529 SocketConnectedTest.setUp(self)
530 self.serv_file = socket._fileobject(self.cli_conn, 'rb', 8192)
531
532 def tearDown(self):
533 self.serv_file.close()
534 self.serv_file = None
535 SocketConnectedTest.tearDown(self)
536
537 def clientSetUp(self):
538 SocketConnectedTest.clientSetUp(self)
539 self.cli_file = socket._fileobject(self.serv_conn, 'rb', 8192)
540
541 def clientTearDown(self):
542 self.cli_file.close()
543 self.cli_file = None
544 SocketConnectedTest.clientTearDown(self)
545
546 def testSmallRead(self):
547 """Performing small file read test."""
548 first_seg = self.serv_file.read(len(MSG)-3)
549 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000550 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000551 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552
553 def _testSmallRead(self):
554 self.cli_file.write(MSG)
555 self.cli_file.flush()
556
557 def testUnbufferedRead(self):
558 """Performing unbuffered file read test."""
559 buf = ''
560 while 1:
561 char = self.serv_file.read(1)
Guido van Rossum76489682002-06-12 20:38:30 +0000562 self.failIf(not char)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563 buf += char
564 if buf == MSG:
565 break
566
567 def _testUnbufferedRead(self):
568 self.cli_file.write(MSG)
569 self.cli_file.flush()
570
571 def testReadline(self):
572 """Performing file readline test."""
573 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000574 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575
576 def _testReadline(self):
577 self.cli_file.write(MSG)
578 self.cli_file.flush()
579
Guido van Rossum3875e902002-06-20 03:40:16 +0000580def main():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000581 suite = unittest.TestSuite()
582 suite.addTest(unittest.makeSuite(GeneralModuleTests))
583 suite.addTest(unittest.makeSuite(BasicTCPTest))
584 suite.addTest(unittest.makeSuite(BasicUDPTest))
585 suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
586 suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
587 test_support.run_suite(suite)
588
589if __name__ == "__main__":
Guido van Rossum3875e902002-06-20 03:40:16 +0000590 main()