blob: 614096228a882481f39837e19829d0c45eafad5b [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
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import thread, threading
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00009import time
10import traceback
Guido van Rossum24e4af82002-06-12 19:18:08 +000011import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000012import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000013import os
Martin Blais2856e5f2006-05-26 12:03:27 +000014import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000015from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000016import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Guido van Rossum24e4af82002-06-12 19:18:08 +000018PORT = 50007
19HOST = 'localhost'
20MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000021
Guido van Rossum24e4af82002-06-12 19:18:08 +000022class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000023
Guido van Rossum24e4af82002-06-12 19:18:08 +000024 def setUp(self):
25 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
26 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000027 global PORT
28 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000029 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000030
Guido van Rossum24e4af82002-06-12 19:18:08 +000031 def tearDown(self):
32 self.serv.close()
33 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000034
Guido van Rossum24e4af82002-06-12 19:18:08 +000035class SocketUDPTest(unittest.TestCase):
36
37 def setUp(self):
38 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
39 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000040 global PORT
41 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000042
43 def tearDown(self):
44 self.serv.close()
45 self.serv = None
46
47class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000048 """Threadable Test class
49
50 The ThreadableTest class makes it easy to create a threaded
51 client/server pair from an existing unit test. To create a
52 new threaded class from an existing unit test, use multiple
53 inheritance:
54
55 class NewClass (OldClass, ThreadableTest):
56 pass
57
58 This class defines two new fixture functions with obvious
59 purposes for overriding:
60
61 clientSetUp ()
62 clientTearDown ()
63
64 Any new test functions within the class must then define
65 tests in pairs, where the test name is preceeded with a
66 '_' to indicate the client portion of the test. Ex:
67
68 def testFoo(self):
69 # Server portion
70
71 def _testFoo(self):
72 # Client portion
73
74 Any exceptions raised by the clients during their tests
75 are caught and transferred to the main thread to alert
76 the testing framework.
77
78 Note, the server setup function cannot call any blocking
79 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000080 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000081 the blocking call (such as in setting up a client/server
82 connection and performing the accept() in setUp().
83 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000084
85 def __init__(self):
86 # Swap the true setup function
87 self.__setUp = self.setUp
88 self.__tearDown = self.tearDown
89 self.setUp = self._setUp
90 self.tearDown = self._tearDown
91
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000092 def serverExplicitReady(self):
93 """This method allows the server to explicitly indicate that
94 it wants the client thread to proceed. This is useful if the
95 server is about to execute a blocking routine that is
96 dependent upon the client thread during its setup routine."""
97 self.server_ready.set()
98
Guido van Rossum24e4af82002-06-12 19:18:08 +000099 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000100 self.server_ready = threading.Event()
101 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000102 self.done = threading.Event()
103 self.queue = Queue.Queue(1)
104
105 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000106 methodname = self.id()
107 i = methodname.rfind('.')
108 methodname = methodname[i+1:]
109 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000110 self.client_thread = thread.start_new_thread(
111 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000112
113 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000114 if not self.server_ready.isSet():
115 self.server_ready.set()
116 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000117
118 def _tearDown(self):
119 self.__tearDown()
120 self.done.wait()
121
122 if not self.queue.empty():
123 msg = self.queue.get()
124 self.fail(msg)
125
126 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000127 self.server_ready.wait()
128 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000129 self.clientSetUp()
130 if not callable(test_func):
131 raise TypeError, "test_func must be a callable function"
132 try:
133 test_func()
134 except Exception, strerror:
135 self.queue.put(strerror)
136 self.clientTearDown()
137
138 def clientSetUp(self):
139 raise NotImplementedError, "clientSetUp must be implemented."
140
141 def clientTearDown(self):
142 self.done.set()
143 thread.exit()
144
145class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
146
147 def __init__(self, methodName='runTest'):
148 SocketTCPTest.__init__(self, methodName=methodName)
149 ThreadableTest.__init__(self)
150
151 def clientSetUp(self):
152 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
153
154 def clientTearDown(self):
155 self.cli.close()
156 self.cli = None
157 ThreadableTest.clientTearDown(self)
158
159class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
160
161 def __init__(self, methodName='runTest'):
162 SocketUDPTest.__init__(self, methodName=methodName)
163 ThreadableTest.__init__(self)
164
165 def clientSetUp(self):
166 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
167
168class SocketConnectedTest(ThreadedTCPSocketTest):
169
170 def __init__(self, methodName='runTest'):
171 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
172
173 def setUp(self):
174 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000175 # Indicate explicitly we're ready for the client thread to
176 # proceed and then perform the blocking call to accept
177 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000178 conn, addr = self.serv.accept()
179 self.cli_conn = conn
180
181 def tearDown(self):
182 self.cli_conn.close()
183 self.cli_conn = None
184 ThreadedTCPSocketTest.tearDown(self)
185
186 def clientSetUp(self):
187 ThreadedTCPSocketTest.clientSetUp(self)
188 self.cli.connect((HOST, PORT))
189 self.serv_conn = self.cli
190
191 def clientTearDown(self):
192 self.serv_conn.close()
193 self.serv_conn = None
194 ThreadedTCPSocketTest.clientTearDown(self)
195
Dave Cole331708b2004-08-09 04:51:41 +0000196class SocketPairTest(unittest.TestCase, ThreadableTest):
197
198 def __init__(self, methodName='runTest'):
199 unittest.TestCase.__init__(self, methodName=methodName)
200 ThreadableTest.__init__(self)
201
202 def setUp(self):
203 self.serv, self.cli = socket.socketpair()
204
205 def tearDown(self):
206 self.serv.close()
207 self.serv = None
208
209 def clientSetUp(self):
210 pass
211
212 def clientTearDown(self):
213 self.cli.close()
214 self.cli = None
215 ThreadableTest.clientTearDown(self)
216
Tim Peters494aaee2004-08-09 18:54:11 +0000217
Guido van Rossum24e4af82002-06-12 19:18:08 +0000218#######################################################################
219## Begin Tests
220
221class GeneralModuleTests(unittest.TestCase):
222
Raymond Hettinger027bb632004-05-31 03:09:25 +0000223 def test_weakref(self):
224 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
225 p = proxy(s)
226 self.assertEqual(p.fileno(), s.fileno())
227 s.close()
228 s = None
229 try:
230 p.fileno()
231 except ReferenceError:
232 pass
233 else:
234 self.fail('Socket proxy still exists')
235
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000237 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000238 def raise_error(*args, **kwargs):
239 raise socket.error
240 def raise_herror(*args, **kwargs):
241 raise socket.herror
242 def raise_gaierror(*args, **kwargs):
243 raise socket.gaierror
244 self.failUnlessRaises(socket.error, raise_error,
245 "Error raising socket exception.")
246 self.failUnlessRaises(socket.error, raise_herror,
247 "Error raising socket exception.")
248 self.failUnlessRaises(socket.error, raise_gaierror,
249 "Error raising socket exception.")
250
251 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000252 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000253 socket.AF_INET
254 socket.SOCK_STREAM
255 socket.SOCK_DGRAM
256 socket.SOCK_RAW
257 socket.SOCK_RDM
258 socket.SOCK_SEQPACKET
259 socket.SOL_SOCKET
260 socket.SO_REUSEADDR
261
Guido van Rossum654c11e2002-06-13 20:24:17 +0000262 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000263 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000264 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000265 try:
266 ip = socket.gethostbyname(hostname)
267 except socket.error:
268 # Probably name lookup wasn't set up right; skip this test
269 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000270 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000271 try:
272 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
273 except socket.error:
274 # Probably a similar problem as above; skip this test
275 return
Brett Cannon01668a12005-03-11 00:04:17 +0000276 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000277 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000278 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000279 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000280
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000281 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000282 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000283 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000284 try:
285 # On some versions, this loses a reference
286 orig = sys.getrefcount(__name__)
287 socket.getnameinfo(__name__,0)
288 except SystemError:
289 if sys.getrefcount(__name__) <> orig:
290 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000291
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000293 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 try:
295 # On some versions, this crashes the interpreter.
296 socket.getnameinfo(('x', 0, 0, 0), 0)
297 except socket.error:
298 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000299
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000300 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000301 # This just checks that htons etc. are their own inverse,
302 # when looking at the lower 16 or 32 bits.
303 sizes = {socket.htonl: 32, socket.ntohl: 32,
304 socket.htons: 16, socket.ntohs: 16}
305 for func, size in sizes.items():
306 mask = (1L<<size) - 1
307 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
308 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000309
Guido van Rossuma2627af2002-09-14 00:58:46 +0000310 swapped = func(mask)
311 self.assertEqual(swapped & mask, mask)
312 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000313
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000314 def testNtoHErrors(self):
315 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
316 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
317 for k in good_values:
318 socket.ntohl(k)
319 socket.ntohs(k)
320 socket.htonl(k)
321 socket.htons(k)
322 for k in bad_values:
323 self.assertRaises(OverflowError, socket.ntohl, k)
324 self.assertRaises(OverflowError, socket.ntohs, k)
325 self.assertRaises(OverflowError, socket.htonl, k)
326 self.assertRaises(OverflowError, socket.htons, k)
327
Barry Warsaw11b91a02004-06-28 00:50:43 +0000328 def testGetServBy(self):
329 eq = self.assertEqual
330 # Find one service that exists, then check all the related interfaces.
331 # I've ordered this by protocols that have both a tcp and udp
332 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000333 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000334 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000335 # avoid the 'echo' service on this platform, as there is an
336 # assumption breaking non-standard port/protocol entry
337 services = ('daytime', 'qotd', 'domain')
338 else:
339 services = ('echo', 'daytime', 'domain')
340 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000341 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000342 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000343 break
344 except socket.error:
345 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000346 else:
347 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000348 # Try same call with optional protocol omitted
349 port2 = socket.getservbyname(service)
350 eq(port, port2)
351 # Try udp, but don't barf it it doesn't exist
352 try:
353 udpport = socket.getservbyname(service, 'udp')
354 except socket.error:
355 udpport = None
356 else:
357 eq(udpport, port)
358 # Now make sure the lookup by port returns the same service name
359 eq(socket.getservbyport(port2), service)
360 eq(socket.getservbyport(port, 'tcp'), service)
361 if udpport is not None:
362 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000363
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000364 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000365 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000366 # The default timeout should initially be None
367 self.assertEqual(socket.getdefaulttimeout(), None)
368 s = socket.socket()
369 self.assertEqual(s.gettimeout(), None)
370 s.close()
371
372 # Set the default timeout to 10, and see if it propagates
373 socket.setdefaulttimeout(10)
374 self.assertEqual(socket.getdefaulttimeout(), 10)
375 s = socket.socket()
376 self.assertEqual(s.gettimeout(), 10)
377 s.close()
378
379 # Reset the default timeout to None, and see if it propagates
380 socket.setdefaulttimeout(None)
381 self.assertEqual(socket.getdefaulttimeout(), None)
382 s = socket.socket()
383 self.assertEqual(s.gettimeout(), None)
384 s.close()
385
386 # Check that setting it to an invalid value raises ValueError
387 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
388
389 # Check that setting it to an invalid type raises TypeError
390 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
391
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000392 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000393 if not hasattr(socket, 'inet_pton'):
394 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000395 from socket import inet_aton as f, inet_pton, AF_INET
396 g = lambda a: inet_pton(AF_INET, a)
397
398 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
399 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
400 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
401 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000402 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000403
404 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
405 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
406 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000407 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000408
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000409 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000410 if not hasattr(socket, 'inet_pton'):
411 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000412 try:
413 from socket import inet_pton, AF_INET6, has_ipv6
414 if not has_ipv6:
415 return
416 except ImportError:
417 return
418 f = lambda a: inet_pton(AF_INET6, a)
419
420 self.assertEquals('\x00' * 16, f('::'))
421 self.assertEquals('\x00' * 16, f('0::0'))
422 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
423 self.assertEquals(
424 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
425 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
426 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000427
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000428 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000429 if not hasattr(socket, 'inet_ntop'):
430 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000431 from socket import inet_ntoa as f, inet_ntop, AF_INET
432 g = lambda a: inet_ntop(AF_INET, a)
433
434 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
435 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
436 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
437 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000438
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000439 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
440 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
441 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
442
443 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000444 if not hasattr(socket, 'inet_ntop'):
445 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000446 try:
447 from socket import inet_ntop, AF_INET6, has_ipv6
448 if not has_ipv6:
449 return
450 except ImportError:
451 return
452 f = lambda a: inet_ntop(AF_INET6, a)
453
454 self.assertEquals('::', f('\x00' * 16))
455 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
456 self.assertEquals(
457 'aef:b01:506:1001:ffff:9997:55:170',
458 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
459 )
460
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000461 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000462
Guido van Rossum24e4af82002-06-12 19:18:08 +0000463 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000464 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000466 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000467 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000468 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
469 # it reasonable to get the host's addr in addition to 0.0.0.0.
470 # At least for eCos. This is required for the S/390 to pass.
471 my_ip_addr = socket.gethostbyname(socket.gethostname())
472 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
473 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000474
475 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000476 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000477 # We know a socket should start without reuse==0
478 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
479 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000480 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000481
482 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000483 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000484 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
485 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
486 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000487 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000489 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000490 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000491 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
492 sock.settimeout(1)
493 sock.close()
494 self.assertRaises(socket.error, sock.send, "spam")
495
Georg Brandlbb03ac02006-03-21 18:17:25 +0000496 def testNewAttributes(self):
497 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000498 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000499 self.assertEqual(sock.family, socket.AF_INET)
500 self.assertEqual(sock.type, socket.SOCK_STREAM)
501 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000502 sock.close()
503
Christian Heimesa47b75b2008-01-04 15:48:06 +0000504 def test_sock_ioctl(self):
505 if os.name != "nt":
506 return
507 self.assert_(hasattr(socket.socket, 'ioctl'))
508 self.assert_(hasattr(socket, 'SIO_RCVALL'))
509 self.assert_(hasattr(socket, 'RCVALL_ON'))
510 self.assert_(hasattr(socket, 'RCVALL_OFF'))
511
512
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513class BasicTCPTest(SocketConnectedTest):
514
515 def __init__(self, methodName='runTest'):
516 SocketConnectedTest.__init__(self, methodName=methodName)
517
518 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000519 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000520 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000521 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522
523 def _testRecv(self):
524 self.serv_conn.send(MSG)
525
526 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000527 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000528 seg1 = self.cli_conn.recv(len(MSG) - 3)
529 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000530 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000531 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532
533 def _testOverFlowRecv(self):
534 self.serv_conn.send(MSG)
535
536 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000537 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000539 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540
541 def _testRecvFrom(self):
542 self.serv_conn.send(MSG)
543
544 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000545 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000546 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
547 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000548 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000549 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000550
551 def _testOverFlowRecvFrom(self):
552 self.serv_conn.send(MSG)
553
554 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000555 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000556 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557 while 1:
558 read = self.cli_conn.recv(1024)
559 if not read:
560 break
Guido van Rossume531e292002-08-08 20:28:34 +0000561 msg += read
562 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563
564 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000565 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000566 self.serv_conn.sendall(big_chunk)
567
568 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000569 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000570 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000571 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572 fd = self.cli_conn.fileno()
573 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
574 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000575 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000576
577 def _testFromFd(self):
578 self.serv_conn.send(MSG)
579
580 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000581 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000582 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000583 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584
585 def _testShutdown(self):
586 self.serv_conn.send(MSG)
587 self.serv_conn.shutdown(2)
588
589class BasicUDPTest(ThreadedUDPSocketTest):
590
591 def __init__(self, methodName='runTest'):
592 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
593
594 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000595 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000596 msg = self.serv.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
599 def _testSendtoAndRecv(self):
600 self.cli.sendto(MSG, 0, (HOST, PORT))
601
Guido van Rossum1c938012002-06-12 21:17:20 +0000602 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000603 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000605 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000606
Guido van Rossum1c938012002-06-12 21:17:20 +0000607 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000608 self.cli.sendto(MSG, 0, (HOST, PORT))
609
Facundo Batista1fe9f962007-03-28 03:45:20 +0000610 def testRecvFromNegative(self):
611 # Negative lengths passed to recvfrom should give ValueError.
612 self.assertRaises(ValueError, self.serv.recvfrom, -1)
613
614 def _testRecvFromNegative(self):
615 self.cli.sendto(MSG, 0, (HOST, PORT))
616
Martin v. Löwis7596e832006-07-01 15:33:37 +0000617class TCPCloserTest(ThreadedTCPSocketTest):
618
619 def testClose(self):
620 conn, addr = self.serv.accept()
621 conn.close()
622
623 sd = self.cli
624 read, write, err = select.select([sd], [], [], 1.0)
625 self.assertEqual(read, [sd])
626 self.assertEqual(sd.recv(1), '')
627
628 def _testClose(self):
629 self.cli.connect((HOST, PORT))
630 time.sleep(1.0)
631
Dave Cole331708b2004-08-09 04:51:41 +0000632class BasicSocketPairTest(SocketPairTest):
633
634 def __init__(self, methodName='runTest'):
635 SocketPairTest.__init__(self, methodName=methodName)
636
637 def testRecv(self):
638 msg = self.serv.recv(1024)
639 self.assertEqual(msg, MSG)
640
641 def _testRecv(self):
642 self.cli.send(MSG)
643
644 def testSend(self):
645 self.serv.send(MSG)
646
647 def _testSend(self):
648 msg = self.cli.recv(1024)
649 self.assertEqual(msg, MSG)
650
Guido van Rossum24e4af82002-06-12 19:18:08 +0000651class NonBlockingTCPTests(ThreadedTCPSocketTest):
652
653 def __init__(self, methodName='runTest'):
654 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
655
656 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000657 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000658 self.serv.setblocking(0)
659 start = time.time()
660 try:
661 self.serv.accept()
662 except socket.error:
663 pass
664 end = time.time()
665 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
666
667 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000668 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000669
Guido van Rossum24e4af82002-06-12 19:18:08 +0000670 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000671 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000672 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000673 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000674 conn, addr = self.serv.accept()
675 except socket.error:
676 pass
677 else:
678 self.fail("Error trying to do non-blocking accept.")
679 read, write, err = select.select([self.serv], [], [])
680 if self.serv in read:
681 conn, addr = self.serv.accept()
682 else:
683 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000684
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000686 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000687 self.cli.connect((HOST, PORT))
688
689 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000690 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000691 conn, addr = self.serv.accept()
692
693 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000694 self.cli.settimeout(10)
695 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696
697 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000698 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000699 conn, addr = self.serv.accept()
700 conn.setblocking(0)
701 try:
702 msg = conn.recv(len(MSG))
703 except socket.error:
704 pass
705 else:
706 self.fail("Error trying to do non-blocking recv.")
707 read, write, err = select.select([conn], [], [])
708 if conn in read:
709 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000710 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 else:
712 self.fail("Error during select call to non-blocking socket.")
713
714 def _testRecv(self):
715 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000716 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000717 self.cli.send(MSG)
718
719class FileObjectClassTestCase(SocketConnectedTest):
720
Guido van Rossume9f66142002-08-07 15:46:19 +0000721 bufsize = -1 # Use default buffer size
722
Guido van Rossum24e4af82002-06-12 19:18:08 +0000723 def __init__(self, methodName='runTest'):
724 SocketConnectedTest.__init__(self, methodName=methodName)
725
726 def setUp(self):
727 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000728 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729
730 def tearDown(self):
731 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000732 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733 self.serv_file = None
734 SocketConnectedTest.tearDown(self)
735
736 def clientSetUp(self):
737 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000738 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000739
740 def clientTearDown(self):
741 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000742 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743 self.cli_file = None
744 SocketConnectedTest.clientTearDown(self)
745
746 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000747 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748 first_seg = self.serv_file.read(len(MSG)-3)
749 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000750 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000751 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000752
753 def _testSmallRead(self):
754 self.cli_file.write(MSG)
755 self.cli_file.flush()
756
Guido van Rossum8c943832002-08-08 01:00:28 +0000757 def testFullRead(self):
758 # read until EOF
759 msg = self.serv_file.read()
760 self.assertEqual(msg, MSG)
761
762 def _testFullRead(self):
763 self.cli_file.write(MSG)
764 self.cli_file.close()
765
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768 buf = ''
769 while 1:
770 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000771 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000772 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000773 buf += char
774 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775
776 def _testUnbufferedRead(self):
777 self.cli_file.write(MSG)
778 self.cli_file.flush()
779
780 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000781 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000783 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784
785 def _testReadline(self):
786 self.cli_file.write(MSG)
787 self.cli_file.flush()
788
Tim Peters116d83c2004-03-28 02:20:45 +0000789 def testClosedAttr(self):
790 self.assert_(not self.serv_file.closed)
791
792 def _testClosedAttr(self):
793 self.assert_(not self.cli_file.closed)
794
Guido van Rossume9f66142002-08-07 15:46:19 +0000795class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
796
797 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000798
Guido van Rossume9f66142002-08-07 15:46:19 +0000799 In this case (and in this case only), it should be possible to
800 create a file object, read a line from it, create another file
801 object, read another line from it, without loss of data in the
802 first file object's buffer. Note that httplib relies on this
803 when reading multiple requests from the same socket."""
804
805 bufsize = 0 # Use unbuffered mode
806
807 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000808 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000809 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000810 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000811 self.serv_file = self.cli_conn.makefile('rb', 0)
812 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000813 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000814
815 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000816 self.cli_file.write("A. " + MSG)
817 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000818 self.cli_file.flush()
819
Guido van Rossum8c943832002-08-08 01:00:28 +0000820class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
821
822 bufsize = 1 # Default-buffered for reading; line-buffered for writing
823
824
825class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
826
827 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000828
Georg Brandldd7b0522007-01-21 10:35:10 +0000829
Facundo Batista07c78be2007-03-23 18:54:07 +0000830class NetworkConnectionTest(object):
831 """Prove network connection."""
832 def clientSetUp(self):
833 self.cli = socket.create_connection((HOST, PORT))
834 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000835
Facundo Batista07c78be2007-03-23 18:54:07 +0000836class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
837 """Tests that NetworkConnection does not break existing TCP functionality.
838 """
839
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000840class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000841 def testWithoutServer(self):
Facundo Batista07c78be2007-03-23 18:54:07 +0000842 self.failUnlessRaises(socket.error, lambda: socket.create_connection((HOST, PORT)))
843
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000844class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
845
846 def __init__(self, methodName='runTest'):
847 SocketTCPTest.__init__(self, methodName=methodName)
848 ThreadableTest.__init__(self)
849
850 def clientSetUp(self):
851 pass
852
853 def clientTearDown(self):
854 self.cli.close()
855 self.cli = None
856 ThreadableTest.clientTearDown(self)
857
858 def _justAccept(self):
859 conn, addr = self.serv.accept()
860
861 testFamily = _justAccept
862 def _testFamily(self):
863 self.cli = socket.create_connection((HOST, PORT), timeout=30)
864 self.assertEqual(self.cli.family, 2)
865
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000866 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000867 def _testTimeoutDefault(self):
868 self.cli = socket.create_connection((HOST, PORT))
869 self.assertTrue(self.cli.gettimeout() is None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000870
871 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000872 def _testTimeoutValueNamed(self):
873 self.cli = socket.create_connection((HOST, PORT), timeout=30)
874 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000875
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000876 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000877 def _testTimeoutValueNonamed(self):
878 self.cli = socket.create_connection((HOST, PORT), 30)
879 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000880
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000881 testTimeoutNone = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000882 def _testTimeoutNone(self):
Facundo Batista07c78be2007-03-23 18:54:07 +0000883 previous = socket.getdefaulttimeout()
Facundo Batista14553b02007-03-23 20:23:08 +0000884 socket.setdefaulttimeout(30)
885 try:
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000886 self.cli = socket.create_connection((HOST, PORT), timeout=None)
Facundo Batista14553b02007-03-23 20:23:08 +0000887 finally:
888 socket.setdefaulttimeout(previous)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000889 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000890
891
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000892class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
893
894 def __init__(self, methodName='runTest'):
895 SocketTCPTest.__init__(self, methodName=methodName)
896 ThreadableTest.__init__(self)
897
898 def clientSetUp(self):
899 pass
900
901 def clientTearDown(self):
902 self.cli.close()
903 self.cli = None
904 ThreadableTest.clientTearDown(self)
905
Facundo Batista07c78be2007-03-23 18:54:07 +0000906 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000907 conn, addr = self.serv.accept()
908 time.sleep(3)
909 conn.send("done!")
910 testOutsideTimeout = testInsideTimeout
911
912 def _testInsideTimeout(self):
913 self.cli = sock = socket.create_connection((HOST, PORT))
Facundo Batista07c78be2007-03-23 18:54:07 +0000914 data = sock.recv(5)
915 self.assertEqual(data, "done!")
916
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000917 def _testOutsideTimeout(self):
918 self.cli = sock = socket.create_connection((HOST, PORT), timeout=1)
Facundo Batista07c78be2007-03-23 18:54:07 +0000919 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
920
921
Georg Brandldd7b0522007-01-21 10:35:10 +0000922class Urllib2FileobjectTest(unittest.TestCase):
923
924 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
925 # it close the socket if the close c'tor argument is true
926
927 def testClose(self):
928 class MockSocket:
929 closed = False
930 def flush(self): pass
931 def close(self): self.closed = True
932
933 # must not close unless we request it: the original use of _fileobject
934 # by module socket requires that the underlying socket not be closed until
935 # the _socketobject that created the _fileobject is closed
936 s = MockSocket()
937 f = socket._fileobject(s)
938 f.close()
939 self.assert_(not s.closed)
940
941 s = MockSocket()
942 f = socket._fileobject(s, close=True)
943 f.close()
944 self.assert_(s.closed)
945
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000946class TCPTimeoutTest(SocketTCPTest):
947
948 def testTCPTimeout(self):
949 def raise_timeout(*args, **kwargs):
950 self.serv.settimeout(1.0)
951 self.serv.accept()
952 self.failUnlessRaises(socket.timeout, raise_timeout,
953 "Error generating a timeout exception (TCP)")
954
955 def testTimeoutZero(self):
956 ok = False
957 try:
958 self.serv.settimeout(0.0)
959 foo = self.serv.accept()
960 except socket.timeout:
961 self.fail("caught timeout instead of error (TCP)")
962 except socket.error:
963 ok = True
964 except:
965 self.fail("caught unexpected exception (TCP)")
966 if not ok:
967 self.fail("accept() returned success when we did not expect it")
968
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000969 def testInterruptedTimeout(self):
970 # XXX I don't know how to do this test on MSWindows or any other
971 # plaform that doesn't support signal.alarm() or os.kill(), though
972 # the bug should have existed on all platforms.
973 if not hasattr(signal, "alarm"):
974 return # can only test on *nix
975 self.serv.settimeout(5.0) # must be longer than alarm
976 class Alarm(Exception):
977 pass
978 def alarm_handler(signal, frame):
979 raise Alarm
980 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
981 try:
982 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
983 try:
984 foo = self.serv.accept()
985 except socket.timeout:
986 self.fail("caught timeout instead of Alarm")
987 except Alarm:
988 pass
989 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +0000990 self.fail("caught other exception instead of Alarm:"
991 " %s(%s):\n%s" %
992 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000993 else:
994 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +0000995 finally:
996 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000997 except Alarm:
998 self.fail("got Alarm in wrong place")
999 finally:
1000 # no alarm can be pending. Safe to restore old handler.
1001 signal.signal(signal.SIGALRM, old_alarm)
1002
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001003class UDPTimeoutTest(SocketTCPTest):
1004
1005 def testUDPTimeout(self):
1006 def raise_timeout(*args, **kwargs):
1007 self.serv.settimeout(1.0)
1008 self.serv.recv(1024)
1009 self.failUnlessRaises(socket.timeout, raise_timeout,
1010 "Error generating a timeout exception (UDP)")
1011
1012 def testTimeoutZero(self):
1013 ok = False
1014 try:
1015 self.serv.settimeout(0.0)
1016 foo = self.serv.recv(1024)
1017 except socket.timeout:
1018 self.fail("caught timeout instead of error (UDP)")
1019 except socket.error:
1020 ok = True
1021 except:
1022 self.fail("caught unexpected exception (UDP)")
1023 if not ok:
1024 self.fail("recv() returned success when we did not expect it")
1025
1026class TestExceptions(unittest.TestCase):
1027
1028 def testExceptionTree(self):
1029 self.assert_(issubclass(socket.error, Exception))
1030 self.assert_(issubclass(socket.herror, socket.error))
1031 self.assert_(issubclass(socket.gaierror, socket.error))
1032 self.assert_(issubclass(socket.timeout, socket.error))
1033
Armin Rigoa9017c32006-04-19 11:50:27 +00001034class TestLinuxAbstractNamespace(unittest.TestCase):
1035
1036 UNIX_PATH_MAX = 108
1037
1038 def testLinuxAbstractNamespace(self):
1039 address = "\x00python-test-hello\x00\xff"
1040 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1041 s1.bind(address)
1042 s1.listen(1)
1043 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1044 s2.connect(s1.getsockname())
1045 s1.accept()
1046 self.assertEqual(s1.getsockname(), address)
1047 self.assertEqual(s2.getpeername(), address)
1048
1049 def testMaxName(self):
1050 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1051 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1052 s.bind(address)
1053 self.assertEqual(s.getsockname(), address)
1054
1055 def testNameOverflow(self):
1056 address = "\x00" + "h" * self.UNIX_PATH_MAX
1057 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1058 self.assertRaises(socket.error, s.bind, address)
1059
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001060
Martin Blais2856e5f2006-05-26 12:03:27 +00001061class BufferIOTest(SocketConnectedTest):
1062 """
1063 Test the buffer versions of socket.recv() and socket.send().
1064 """
1065 def __init__(self, methodName='runTest'):
1066 SocketConnectedTest.__init__(self, methodName=methodName)
1067
Martin Blaisaf2ae722006-06-04 13:49:49 +00001068 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001069 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001070 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001071 self.assertEqual(nbytes, len(MSG))
1072 msg = buf.tostring()[:len(MSG)]
1073 self.assertEqual(msg, MSG)
1074
Martin Blaisaf2ae722006-06-04 13:49:49 +00001075 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001076 buf = buffer(MSG)
1077 self.serv_conn.send(buf)
1078
Martin Blaisaf2ae722006-06-04 13:49:49 +00001079 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001080 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001081 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001082 self.assertEqual(nbytes, len(MSG))
1083 msg = buf.tostring()[:len(MSG)]
1084 self.assertEqual(msg, MSG)
1085
Martin Blaisaf2ae722006-06-04 13:49:49 +00001086 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001087 buf = buffer(MSG)
1088 self.serv_conn.send(buf)
1089
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001090
1091TIPC_STYPE = 2000
1092TIPC_LOWER = 200
1093TIPC_UPPER = 210
1094
1095def isTipcAvailable():
1096 """Check if the TIPC module is loaded
1097
1098 The TIPC module is not loaded automatically on Ubuntu and probably
1099 other Linux distros.
1100 """
1101 if not hasattr(socket, "AF_TIPC"):
1102 return False
1103 if not os.path.isfile("/proc/modules"):
1104 return False
1105 with open("/proc/modules") as f:
1106 for line in f:
1107 if line.startswith("tipc "):
1108 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001109 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001110 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1111 return False
1112
1113class TIPCTest (unittest.TestCase):
1114 def testRDM(self):
1115 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1116 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1117
1118 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1119 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1120 TIPC_LOWER, TIPC_UPPER)
1121 srv.bind(srvaddr)
1122
1123 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1124 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1125 cli.sendto(MSG, sendaddr)
1126
1127 msg, recvaddr = srv.recvfrom(1024)
1128
1129 self.assertEqual(cli.getsockname(), recvaddr)
1130 self.assertEqual(msg, MSG)
1131
1132
1133class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1134 def __init__(self, methodName = 'runTest'):
1135 unittest.TestCase.__init__(self, methodName = methodName)
1136 ThreadableTest.__init__(self)
1137
1138 def setUp(self):
1139 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1140 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1141 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1142 TIPC_LOWER, TIPC_UPPER)
1143 self.srv.bind(srvaddr)
1144 self.srv.listen(5)
1145 self.serverExplicitReady()
1146 self.conn, self.connaddr = self.srv.accept()
1147
1148 def clientSetUp(self):
1149 # The is a hittable race between serverExplicitReady() and the
1150 # accept() call; sleep a little while to avoid it, otherwise
1151 # we could get an exception
1152 time.sleep(0.1)
1153 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1154 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1155 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1156 self.cli.connect(addr)
1157 self.cliaddr = self.cli.getsockname()
1158
1159 def testStream(self):
1160 msg = self.conn.recv(1024)
1161 self.assertEqual(msg, MSG)
1162 self.assertEqual(self.cliaddr, self.connaddr)
1163
1164 def _testStream(self):
1165 self.cli.send(MSG)
1166 self.cli.close()
1167
1168
Guido van Rossumb995eb72002-07-31 16:08:40 +00001169def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001170 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001171 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001172 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001173 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001174
1175 tests.extend([
1176 NonBlockingTCPTests,
1177 FileObjectClassTestCase,
1178 UnbufferedFileObjectClassTestCase,
1179 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001180 SmallBufferedFileObjectClassTestCase,
1181 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001182 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001183 NetworkConnectionAttributesTest,
1184 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001185 ])
Dave Cole331708b2004-08-09 04:51:41 +00001186 if hasattr(socket, "socketpair"):
1187 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001188 if sys.platform == 'linux2':
1189 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001190 if isTipcAvailable():
1191 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001192 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001193
1194 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001195 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001196 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001197
1198if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001199 test_main()