blob: 180d965b09ddf69d52fc3d90d055b2d98555d9e8 [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
Raymond Hettinger027bb632004-05-31 03:09:25 +000012from weakref import proxy
Barry Warsawcf3d4b51997-01-03 20:03:32 +000013
Guido van Rossum24e4af82002-06-12 19:18:08 +000014PORT = 50007
15HOST = 'localhost'
16MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Guido van Rossum24e4af82002-06-12 19:18:08 +000018class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000019
Guido van Rossum24e4af82002-06-12 19:18:08 +000020 def setUp(self):
21 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
22 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
23 self.serv.bind((HOST, PORT))
24 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Guido van Rossum24e4af82002-06-12 19:18:08 +000026 def tearDown(self):
27 self.serv.close()
28 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Guido van Rossum24e4af82002-06-12 19:18:08 +000030class SocketUDPTest(unittest.TestCase):
31
32 def setUp(self):
33 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
34 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
35 self.serv.bind((HOST, PORT))
36
37 def tearDown(self):
38 self.serv.close()
39 self.serv = None
40
41class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000042 """Threadable Test class
43
44 The ThreadableTest class makes it easy to create a threaded
45 client/server pair from an existing unit test. To create a
46 new threaded class from an existing unit test, use multiple
47 inheritance:
48
49 class NewClass (OldClass, ThreadableTest):
50 pass
51
52 This class defines two new fixture functions with obvious
53 purposes for overriding:
54
55 clientSetUp ()
56 clientTearDown ()
57
58 Any new test functions within the class must then define
59 tests in pairs, where the test name is preceeded with a
60 '_' to indicate the client portion of the test. Ex:
61
62 def testFoo(self):
63 # Server portion
64
65 def _testFoo(self):
66 # Client portion
67
68 Any exceptions raised by the clients during their tests
69 are caught and transferred to the main thread to alert
70 the testing framework.
71
72 Note, the server setup function cannot call any blocking
73 functions that rely on the client thread during setup,
74 unless serverExplicityReady() is called just before
75 the blocking call (such as in setting up a client/server
76 connection and performing the accept() in setUp().
77 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000078
79 def __init__(self):
80 # Swap the true setup function
81 self.__setUp = self.setUp
82 self.__tearDown = self.tearDown
83 self.setUp = self._setUp
84 self.tearDown = self._tearDown
85
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000086 def serverExplicitReady(self):
87 """This method allows the server to explicitly indicate that
88 it wants the client thread to proceed. This is useful if the
89 server is about to execute a blocking routine that is
90 dependent upon the client thread during its setup routine."""
91 self.server_ready.set()
92
Guido van Rossum24e4af82002-06-12 19:18:08 +000093 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000094 self.server_ready = threading.Event()
95 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000096 self.done = threading.Event()
97 self.queue = Queue.Queue(1)
98
99 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000100 methodname = self.id()
101 i = methodname.rfind('.')
102 methodname = methodname[i+1:]
103 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000104 self.client_thread = thread.start_new_thread(
105 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000106
107 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000108 if not self.server_ready.isSet():
109 self.server_ready.set()
110 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000111
112 def _tearDown(self):
113 self.__tearDown()
114 self.done.wait()
115
116 if not self.queue.empty():
117 msg = self.queue.get()
118 self.fail(msg)
119
120 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000121 self.server_ready.wait()
122 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123 self.clientSetUp()
124 if not callable(test_func):
125 raise TypeError, "test_func must be a callable function"
126 try:
127 test_func()
128 except Exception, strerror:
129 self.queue.put(strerror)
130 self.clientTearDown()
131
132 def clientSetUp(self):
133 raise NotImplementedError, "clientSetUp must be implemented."
134
135 def clientTearDown(self):
136 self.done.set()
137 thread.exit()
138
139class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
140
141 def __init__(self, methodName='runTest'):
142 SocketTCPTest.__init__(self, methodName=methodName)
143 ThreadableTest.__init__(self)
144
145 def clientSetUp(self):
146 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
147
148 def clientTearDown(self):
149 self.cli.close()
150 self.cli = None
151 ThreadableTest.clientTearDown(self)
152
153class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
154
155 def __init__(self, methodName='runTest'):
156 SocketUDPTest.__init__(self, methodName=methodName)
157 ThreadableTest.__init__(self)
158
159 def clientSetUp(self):
160 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
161
162class SocketConnectedTest(ThreadedTCPSocketTest):
163
164 def __init__(self, methodName='runTest'):
165 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
166
167 def setUp(self):
168 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000169 # Indicate explicitly we're ready for the client thread to
170 # proceed and then perform the blocking call to accept
171 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172 conn, addr = self.serv.accept()
173 self.cli_conn = conn
174
175 def tearDown(self):
176 self.cli_conn.close()
177 self.cli_conn = None
178 ThreadedTCPSocketTest.tearDown(self)
179
180 def clientSetUp(self):
181 ThreadedTCPSocketTest.clientSetUp(self)
182 self.cli.connect((HOST, PORT))
183 self.serv_conn = self.cli
184
185 def clientTearDown(self):
186 self.serv_conn.close()
187 self.serv_conn = None
188 ThreadedTCPSocketTest.clientTearDown(self)
189
190#######################################################################
191## Begin Tests
192
193class GeneralModuleTests(unittest.TestCase):
194
Raymond Hettinger027bb632004-05-31 03:09:25 +0000195 def test_weakref(self):
196 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
197 p = proxy(s)
198 self.assertEqual(p.fileno(), s.fileno())
199 s.close()
200 s = None
201 try:
202 p.fileno()
203 except ReferenceError:
204 pass
205 else:
206 self.fail('Socket proxy still exists')
207
Guido van Rossum24e4af82002-06-12 19:18:08 +0000208 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000209 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000210 def raise_error(*args, **kwargs):
211 raise socket.error
212 def raise_herror(*args, **kwargs):
213 raise socket.herror
214 def raise_gaierror(*args, **kwargs):
215 raise socket.gaierror
216 self.failUnlessRaises(socket.error, raise_error,
217 "Error raising socket exception.")
218 self.failUnlessRaises(socket.error, raise_herror,
219 "Error raising socket exception.")
220 self.failUnlessRaises(socket.error, raise_gaierror,
221 "Error raising socket exception.")
222
223 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000224 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000225 socket.AF_INET
226 socket.SOCK_STREAM
227 socket.SOCK_DGRAM
228 socket.SOCK_RAW
229 socket.SOCK_RDM
230 socket.SOCK_SEQPACKET
231 socket.SOL_SOCKET
232 socket.SO_REUSEADDR
233
Guido van Rossum654c11e2002-06-13 20:24:17 +0000234 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000235 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000236 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000237 try:
238 ip = socket.gethostbyname(hostname)
239 except socket.error:
240 # Probably name lookup wasn't set up right; skip this test
241 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000242 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000243 try:
244 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
245 except socket.error:
246 # Probably a similar problem as above; skip this test
247 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000248 all_host_names = [hname] + aliases
249 fqhn = socket.getfqdn()
250 if not fqhn in all_host_names:
251 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000252
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000253 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000254 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000255 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000256 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000257 try:
258 # On some versions, this loses a reference
259 orig = sys.getrefcount(__name__)
260 socket.getnameinfo(__name__,0)
261 except SystemError:
262 if sys.getrefcount(__name__) <> orig:
263 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000264
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000266 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267 try:
268 # On some versions, this crashes the interpreter.
269 socket.getnameinfo(('x', 0, 0, 0), 0)
270 except socket.error:
271 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000272
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000273 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000274 # This just checks that htons etc. are their own inverse,
275 # when looking at the lower 16 or 32 bits.
276 sizes = {socket.htonl: 32, socket.ntohl: 32,
277 socket.htons: 16, socket.ntohs: 16}
278 for func, size in sizes.items():
279 mask = (1L<<size) - 1
280 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
281 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000282
Guido van Rossuma2627af2002-09-14 00:58:46 +0000283 swapped = func(mask)
284 self.assertEqual(swapped & mask, mask)
285 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000286
Barry Warsaw11b91a02004-06-28 00:50:43 +0000287 def testGetServBy(self):
288 eq = self.assertEqual
289 # Find one service that exists, then check all the related interfaces.
290 # I've ordered this by protocols that have both a tcp and udp
291 # protocol, at least for modern Linuxes.
Barry Warsaw7ff7d2c2004-07-06 16:48:25 +0000292 for service in ('echo', 'daytime', 'domain'):
Skip Montanarof4433302002-08-02 15:52:30 +0000293 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000294 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000295 break
296 except socket.error:
297 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000298 else:
299 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000300 # Try same call with optional protocol omitted
301 port2 = socket.getservbyname(service)
302 eq(port, port2)
303 # Try udp, but don't barf it it doesn't exist
304 try:
305 udpport = socket.getservbyname(service, 'udp')
306 except socket.error:
307 udpport = None
308 else:
309 eq(udpport, port)
310 # Now make sure the lookup by port returns the same service name
311 eq(socket.getservbyport(port2), service)
312 eq(socket.getservbyport(port, 'tcp'), service)
313 if udpport is not None:
314 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000316 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000317 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000318 # The default timeout should initially be None
319 self.assertEqual(socket.getdefaulttimeout(), None)
320 s = socket.socket()
321 self.assertEqual(s.gettimeout(), None)
322 s.close()
323
324 # Set the default timeout to 10, and see if it propagates
325 socket.setdefaulttimeout(10)
326 self.assertEqual(socket.getdefaulttimeout(), 10)
327 s = socket.socket()
328 self.assertEqual(s.gettimeout(), 10)
329 s.close()
330
331 # Reset the default timeout to None, and see if it propagates
332 socket.setdefaulttimeout(None)
333 self.assertEqual(socket.getdefaulttimeout(), None)
334 s = socket.socket()
335 self.assertEqual(s.gettimeout(), None)
336 s.close()
337
338 # Check that setting it to an invalid value raises ValueError
339 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
340
341 # Check that setting it to an invalid type raises TypeError
342 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
343
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000344 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000345 if not hasattr(socket, 'inet_pton'):
346 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000347 from socket import inet_aton as f, inet_pton, AF_INET
348 g = lambda a: inet_pton(AF_INET, a)
349
350 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
351 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
352 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
353 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
354
355 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
356 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
357 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000358
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000359 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000360 if not hasattr(socket, 'inet_pton'):
361 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000362 try:
363 from socket import inet_pton, AF_INET6, has_ipv6
364 if not has_ipv6:
365 return
366 except ImportError:
367 return
368 f = lambda a: inet_pton(AF_INET6, a)
369
370 self.assertEquals('\x00' * 16, f('::'))
371 self.assertEquals('\x00' * 16, f('0::0'))
372 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
373 self.assertEquals(
374 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
375 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
376 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000377
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000378 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000379 if not hasattr(socket, 'inet_ntop'):
380 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000381 from socket import inet_ntoa as f, inet_ntop, AF_INET
382 g = lambda a: inet_ntop(AF_INET, a)
383
384 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
385 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
386 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
387 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000388
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000389 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
390 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
391 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
392
393 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000394 if not hasattr(socket, 'inet_ntop'):
395 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000396 try:
397 from socket import inet_ntop, AF_INET6, has_ipv6
398 if not has_ipv6:
399 return
400 except ImportError:
401 return
402 f = lambda a: inet_ntop(AF_INET6, a)
403
404 self.assertEquals('::', f('\x00' * 16))
405 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
406 self.assertEquals(
407 'aef:b01:506:1001:ffff:9997:55:170',
408 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
409 )
410
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000411 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000412
Guido van Rossum24e4af82002-06-12 19:18:08 +0000413 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000414 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000415 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000416 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000417 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000418 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000419
420 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000421 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000422 # We know a socket should start without reuse==0
423 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
424 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000425 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000426
427 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000428 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000429 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
430 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
431 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000432 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000433
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000434 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000435 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000436 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
437 sock.settimeout(1)
438 sock.close()
439 self.assertRaises(socket.error, sock.send, "spam")
440
Guido van Rossum24e4af82002-06-12 19:18:08 +0000441class BasicTCPTest(SocketConnectedTest):
442
443 def __init__(self, methodName='runTest'):
444 SocketConnectedTest.__init__(self, methodName=methodName)
445
446 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000447 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000448 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000449 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000450
451 def _testRecv(self):
452 self.serv_conn.send(MSG)
453
454 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000455 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000456 seg1 = self.cli_conn.recv(len(MSG) - 3)
457 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000458 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000459 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000460
461 def _testOverFlowRecv(self):
462 self.serv_conn.send(MSG)
463
464 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000465 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000466 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000467 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000468
469 def _testRecvFrom(self):
470 self.serv_conn.send(MSG)
471
472 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000473 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000474 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
475 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000476 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000477 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000478
479 def _testOverFlowRecvFrom(self):
480 self.serv_conn.send(MSG)
481
482 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000483 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000484 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000485 while 1:
486 read = self.cli_conn.recv(1024)
487 if not read:
488 break
Guido van Rossume531e292002-08-08 20:28:34 +0000489 msg += read
490 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000491
492 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000493 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000494 self.serv_conn.sendall(big_chunk)
495
496 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000497 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000498 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000499 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500 fd = self.cli_conn.fileno()
501 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
502 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000503 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000504
505 def _testFromFd(self):
506 self.serv_conn.send(MSG)
507
508 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000509 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000511 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512
513 def _testShutdown(self):
514 self.serv_conn.send(MSG)
515 self.serv_conn.shutdown(2)
516
517class BasicUDPTest(ThreadedUDPSocketTest):
518
519 def __init__(self, methodName='runTest'):
520 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
521
522 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000523 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000524 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000525 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526
527 def _testSendtoAndRecv(self):
528 self.cli.sendto(MSG, 0, (HOST, PORT))
529
Guido van Rossum1c938012002-06-12 21:17:20 +0000530 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000531 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000533 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534
Guido van Rossum1c938012002-06-12 21:17:20 +0000535 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000536 self.cli.sendto(MSG, 0, (HOST, PORT))
537
538class NonBlockingTCPTests(ThreadedTCPSocketTest):
539
540 def __init__(self, methodName='runTest'):
541 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
542
543 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000544 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000545 self.serv.setblocking(0)
546 start = time.time()
547 try:
548 self.serv.accept()
549 except socket.error:
550 pass
551 end = time.time()
552 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
553
554 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000555 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000556
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000558 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000559 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000560 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000561 conn, addr = self.serv.accept()
562 except socket.error:
563 pass
564 else:
565 self.fail("Error trying to do non-blocking accept.")
566 read, write, err = select.select([self.serv], [], [])
567 if self.serv in read:
568 conn, addr = self.serv.accept()
569 else:
570 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000571
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000573 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000574 self.cli.connect((HOST, PORT))
575
576 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000577 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 conn, addr = self.serv.accept()
579
580 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000581 self.cli.settimeout(10)
582 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000583
584 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000585 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000586 conn, addr = self.serv.accept()
587 conn.setblocking(0)
588 try:
589 msg = conn.recv(len(MSG))
590 except socket.error:
591 pass
592 else:
593 self.fail("Error trying to do non-blocking recv.")
594 read, write, err = select.select([conn], [], [])
595 if conn in read:
596 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000597 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000598 else:
599 self.fail("Error during select call to non-blocking socket.")
600
601 def _testRecv(self):
602 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000603 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 self.cli.send(MSG)
605
606class FileObjectClassTestCase(SocketConnectedTest):
607
Guido van Rossume9f66142002-08-07 15:46:19 +0000608 bufsize = -1 # Use default buffer size
609
Guido van Rossum24e4af82002-06-12 19:18:08 +0000610 def __init__(self, methodName='runTest'):
611 SocketConnectedTest.__init__(self, methodName=methodName)
612
613 def setUp(self):
614 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000615 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616
617 def tearDown(self):
618 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000619 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000620 self.serv_file = None
621 SocketConnectedTest.tearDown(self)
622
623 def clientSetUp(self):
624 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000625 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000626
627 def clientTearDown(self):
628 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000629 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000630 self.cli_file = None
631 SocketConnectedTest.clientTearDown(self)
632
633 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000634 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000635 first_seg = self.serv_file.read(len(MSG)-3)
636 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000637 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000638 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000639
640 def _testSmallRead(self):
641 self.cli_file.write(MSG)
642 self.cli_file.flush()
643
Guido van Rossum8c943832002-08-08 01:00:28 +0000644 def testFullRead(self):
645 # read until EOF
646 msg = self.serv_file.read()
647 self.assertEqual(msg, MSG)
648
649 def _testFullRead(self):
650 self.cli_file.write(MSG)
651 self.cli_file.close()
652
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000654 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000655 buf = ''
656 while 1:
657 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000658 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000660 buf += char
661 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000662
663 def _testUnbufferedRead(self):
664 self.cli_file.write(MSG)
665 self.cli_file.flush()
666
667 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000668 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000670 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000671
672 def _testReadline(self):
673 self.cli_file.write(MSG)
674 self.cli_file.flush()
675
Tim Peters116d83c2004-03-28 02:20:45 +0000676 def testClosedAttr(self):
677 self.assert_(not self.serv_file.closed)
678
679 def _testClosedAttr(self):
680 self.assert_(not self.cli_file.closed)
681
Guido van Rossume9f66142002-08-07 15:46:19 +0000682class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
683
684 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000685
Guido van Rossume9f66142002-08-07 15:46:19 +0000686 In this case (and in this case only), it should be possible to
687 create a file object, read a line from it, create another file
688 object, read another line from it, without loss of data in the
689 first file object's buffer. Note that httplib relies on this
690 when reading multiple requests from the same socket."""
691
692 bufsize = 0 # Use unbuffered mode
693
694 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000695 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000696 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000697 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000698 self.serv_file = self.cli_conn.makefile('rb', 0)
699 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000700 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000701
702 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000703 self.cli_file.write("A. " + MSG)
704 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000705 self.cli_file.flush()
706
Guido van Rossum8c943832002-08-08 01:00:28 +0000707class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
708
709 bufsize = 1 # Default-buffered for reading; line-buffered for writing
710
711
712class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
713
714 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000715
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000716class TCPTimeoutTest(SocketTCPTest):
717
718 def testTCPTimeout(self):
719 def raise_timeout(*args, **kwargs):
720 self.serv.settimeout(1.0)
721 self.serv.accept()
722 self.failUnlessRaises(socket.timeout, raise_timeout,
723 "Error generating a timeout exception (TCP)")
724
725 def testTimeoutZero(self):
726 ok = False
727 try:
728 self.serv.settimeout(0.0)
729 foo = self.serv.accept()
730 except socket.timeout:
731 self.fail("caught timeout instead of error (TCP)")
732 except socket.error:
733 ok = True
734 except:
735 self.fail("caught unexpected exception (TCP)")
736 if not ok:
737 self.fail("accept() returned success when we did not expect it")
738
739class UDPTimeoutTest(SocketTCPTest):
740
741 def testUDPTimeout(self):
742 def raise_timeout(*args, **kwargs):
743 self.serv.settimeout(1.0)
744 self.serv.recv(1024)
745 self.failUnlessRaises(socket.timeout, raise_timeout,
746 "Error generating a timeout exception (UDP)")
747
748 def testTimeoutZero(self):
749 ok = False
750 try:
751 self.serv.settimeout(0.0)
752 foo = self.serv.recv(1024)
753 except socket.timeout:
754 self.fail("caught timeout instead of error (UDP)")
755 except socket.error:
756 ok = True
757 except:
758 self.fail("caught unexpected exception (UDP)")
759 if not ok:
760 self.fail("recv() returned success when we did not expect it")
761
762class TestExceptions(unittest.TestCase):
763
764 def testExceptionTree(self):
765 self.assert_(issubclass(socket.error, Exception))
766 self.assert_(issubclass(socket.herror, socket.error))
767 self.assert_(issubclass(socket.gaierror, socket.error))
768 self.assert_(issubclass(socket.timeout, socket.error))
769
770
Guido van Rossumb995eb72002-07-31 16:08:40 +0000771def test_main():
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000772 tests = [GeneralModuleTests, BasicTCPTest, TCPTimeoutTest, TestExceptions]
Jack Jansen522e7692002-09-06 21:57:50 +0000773 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000774 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000775
776 tests.extend([
777 NonBlockingTCPTests,
778 FileObjectClassTestCase,
779 UnbufferedFileObjectClassTestCase,
780 LineBufferedFileObjectClassTestCase,
781 SmallBufferedFileObjectClassTestCase
782 ])
783 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784
785if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000786 test_main()