blob: 660d85355fa4f85f1203a10a5dd3bbf78e41be82 [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
Christian Heimesa47b75b2008-01-04 15:48:06 +000012import os
Martin Blais2856e5f2006-05-26 12:03:27 +000013import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000014from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000015import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000016
Guido van Rossum24e4af82002-06-12 19:18:08 +000017PORT = 50007
18HOST = 'localhost'
19MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000020
Guido van Rossum24e4af82002-06-12 19:18:08 +000021class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000022
Guido van Rossum24e4af82002-06-12 19:18:08 +000023 def setUp(self):
24 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
25 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000026 global PORT
27 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000028 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Guido van Rossum24e4af82002-06-12 19:18:08 +000030 def tearDown(self):
31 self.serv.close()
32 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000033
Guido van Rossum24e4af82002-06-12 19:18:08 +000034class SocketUDPTest(unittest.TestCase):
35
36 def setUp(self):
37 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
38 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000039 global PORT
40 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000041
42 def tearDown(self):
43 self.serv.close()
44 self.serv = None
45
46class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000047 """Threadable Test class
48
49 The ThreadableTest class makes it easy to create a threaded
50 client/server pair from an existing unit test. To create a
51 new threaded class from an existing unit test, use multiple
52 inheritance:
53
54 class NewClass (OldClass, ThreadableTest):
55 pass
56
57 This class defines two new fixture functions with obvious
58 purposes for overriding:
59
60 clientSetUp ()
61 clientTearDown ()
62
63 Any new test functions within the class must then define
64 tests in pairs, where the test name is preceeded with a
65 '_' to indicate the client portion of the test. Ex:
66
67 def testFoo(self):
68 # Server portion
69
70 def _testFoo(self):
71 # Client portion
72
73 Any exceptions raised by the clients during their tests
74 are caught and transferred to the main thread to alert
75 the testing framework.
76
77 Note, the server setup function cannot call any blocking
78 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000079 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000080 the blocking call (such as in setting up a client/server
81 connection and performing the accept() in setUp().
82 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000083
84 def __init__(self):
85 # Swap the true setup function
86 self.__setUp = self.setUp
87 self.__tearDown = self.tearDown
88 self.setUp = self._setUp
89 self.tearDown = self._tearDown
90
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000091 def serverExplicitReady(self):
92 """This method allows the server to explicitly indicate that
93 it wants the client thread to proceed. This is useful if the
94 server is about to execute a blocking routine that is
95 dependent upon the client thread during its setup routine."""
96 self.server_ready.set()
97
Guido van Rossum24e4af82002-06-12 19:18:08 +000098 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000099 self.server_ready = threading.Event()
100 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000101 self.done = threading.Event()
102 self.queue = Queue.Queue(1)
103
104 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000105 methodname = self.id()
106 i = methodname.rfind('.')
107 methodname = methodname[i+1:]
108 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000109 self.client_thread = thread.start_new_thread(
110 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000111
112 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000113 if not self.server_ready.isSet():
114 self.server_ready.set()
115 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000116
117 def _tearDown(self):
118 self.__tearDown()
119 self.done.wait()
120
121 if not self.queue.empty():
122 msg = self.queue.get()
123 self.fail(msg)
124
125 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000126 self.server_ready.wait()
127 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000128 self.clientSetUp()
129 if not callable(test_func):
130 raise TypeError, "test_func must be a callable function"
131 try:
132 test_func()
133 except Exception, strerror:
134 self.queue.put(strerror)
135 self.clientTearDown()
136
137 def clientSetUp(self):
138 raise NotImplementedError, "clientSetUp must be implemented."
139
140 def clientTearDown(self):
141 self.done.set()
142 thread.exit()
143
144class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
145
146 def __init__(self, methodName='runTest'):
147 SocketTCPTest.__init__(self, methodName=methodName)
148 ThreadableTest.__init__(self)
149
150 def clientSetUp(self):
151 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
152
153 def clientTearDown(self):
154 self.cli.close()
155 self.cli = None
156 ThreadableTest.clientTearDown(self)
157
158class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
159
160 def __init__(self, methodName='runTest'):
161 SocketUDPTest.__init__(self, methodName=methodName)
162 ThreadableTest.__init__(self)
163
164 def clientSetUp(self):
165 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
166
167class SocketConnectedTest(ThreadedTCPSocketTest):
168
169 def __init__(self, methodName='runTest'):
170 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
171
172 def setUp(self):
173 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000174 # Indicate explicitly we're ready for the client thread to
175 # proceed and then perform the blocking call to accept
176 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000177 conn, addr = self.serv.accept()
178 self.cli_conn = conn
179
180 def tearDown(self):
181 self.cli_conn.close()
182 self.cli_conn = None
183 ThreadedTCPSocketTest.tearDown(self)
184
185 def clientSetUp(self):
186 ThreadedTCPSocketTest.clientSetUp(self)
187 self.cli.connect((HOST, PORT))
188 self.serv_conn = self.cli
189
190 def clientTearDown(self):
191 self.serv_conn.close()
192 self.serv_conn = None
193 ThreadedTCPSocketTest.clientTearDown(self)
194
Dave Cole331708b2004-08-09 04:51:41 +0000195class SocketPairTest(unittest.TestCase, ThreadableTest):
196
197 def __init__(self, methodName='runTest'):
198 unittest.TestCase.__init__(self, methodName=methodName)
199 ThreadableTest.__init__(self)
200
201 def setUp(self):
202 self.serv, self.cli = socket.socketpair()
203
204 def tearDown(self):
205 self.serv.close()
206 self.serv = None
207
208 def clientSetUp(self):
209 pass
210
211 def clientTearDown(self):
212 self.cli.close()
213 self.cli = None
214 ThreadableTest.clientTearDown(self)
215
Tim Peters494aaee2004-08-09 18:54:11 +0000216
Guido van Rossum24e4af82002-06-12 19:18:08 +0000217#######################################################################
218## Begin Tests
219
220class GeneralModuleTests(unittest.TestCase):
221
Raymond Hettinger027bb632004-05-31 03:09:25 +0000222 def test_weakref(self):
223 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
224 p = proxy(s)
225 self.assertEqual(p.fileno(), s.fileno())
226 s.close()
227 s = None
228 try:
229 p.fileno()
230 except ReferenceError:
231 pass
232 else:
233 self.fail('Socket proxy still exists')
234
Guido van Rossum24e4af82002-06-12 19:18:08 +0000235 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000236 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000237 def raise_error(*args, **kwargs):
238 raise socket.error
239 def raise_herror(*args, **kwargs):
240 raise socket.herror
241 def raise_gaierror(*args, **kwargs):
242 raise socket.gaierror
243 self.failUnlessRaises(socket.error, raise_error,
244 "Error raising socket exception.")
245 self.failUnlessRaises(socket.error, raise_herror,
246 "Error raising socket exception.")
247 self.failUnlessRaises(socket.error, raise_gaierror,
248 "Error raising socket exception.")
249
250 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000251 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000252 socket.AF_INET
253 socket.SOCK_STREAM
254 socket.SOCK_DGRAM
255 socket.SOCK_RAW
256 socket.SOCK_RDM
257 socket.SOCK_SEQPACKET
258 socket.SOL_SOCKET
259 socket.SO_REUSEADDR
260
Guido van Rossum654c11e2002-06-13 20:24:17 +0000261 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000262 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000263 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000264 try:
265 ip = socket.gethostbyname(hostname)
266 except socket.error:
267 # Probably name lookup wasn't set up right; skip this test
268 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000269 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000270 try:
271 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
272 except socket.error:
273 # Probably a similar problem as above; skip this test
274 return
Brett Cannon01668a12005-03-11 00:04:17 +0000275 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000276 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000277 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000278 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000279
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000280 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000281 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000282 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283 try:
284 # On some versions, this loses a reference
285 orig = sys.getrefcount(__name__)
286 socket.getnameinfo(__name__,0)
287 except SystemError:
288 if sys.getrefcount(__name__) <> orig:
289 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000290
Guido van Rossum24e4af82002-06-12 19:18:08 +0000291 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000292 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000293 try:
294 # On some versions, this crashes the interpreter.
295 socket.getnameinfo(('x', 0, 0, 0), 0)
296 except socket.error:
297 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000298
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000299 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000300 # This just checks that htons etc. are their own inverse,
301 # when looking at the lower 16 or 32 bits.
302 sizes = {socket.htonl: 32, socket.ntohl: 32,
303 socket.htons: 16, socket.ntohs: 16}
304 for func, size in sizes.items():
305 mask = (1L<<size) - 1
306 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
307 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000308
Guido van Rossuma2627af2002-09-14 00:58:46 +0000309 swapped = func(mask)
310 self.assertEqual(swapped & mask, mask)
311 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000312
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000313 def testNtoHErrors(self):
314 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
315 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
316 for k in good_values:
317 socket.ntohl(k)
318 socket.ntohs(k)
319 socket.htonl(k)
320 socket.htons(k)
321 for k in bad_values:
322 self.assertRaises(OverflowError, socket.ntohl, k)
323 self.assertRaises(OverflowError, socket.ntohs, k)
324 self.assertRaises(OverflowError, socket.htonl, k)
325 self.assertRaises(OverflowError, socket.htons, k)
326
Barry Warsaw11b91a02004-06-28 00:50:43 +0000327 def testGetServBy(self):
328 eq = self.assertEqual
329 # Find one service that exists, then check all the related interfaces.
330 # I've ordered this by protocols that have both a tcp and udp
331 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000332 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000333 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000334 # avoid the 'echo' service on this platform, as there is an
335 # assumption breaking non-standard port/protocol entry
336 services = ('daytime', 'qotd', 'domain')
337 else:
338 services = ('echo', 'daytime', 'domain')
339 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000340 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000341 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000342 break
343 except socket.error:
344 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000345 else:
346 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000347 # Try same call with optional protocol omitted
348 port2 = socket.getservbyname(service)
349 eq(port, port2)
350 # Try udp, but don't barf it it doesn't exist
351 try:
352 udpport = socket.getservbyname(service, 'udp')
353 except socket.error:
354 udpport = None
355 else:
356 eq(udpport, port)
357 # Now make sure the lookup by port returns the same service name
358 eq(socket.getservbyport(port2), service)
359 eq(socket.getservbyport(port, 'tcp'), service)
360 if udpport is not None:
361 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000362
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000363 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000364 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000365 # The default timeout should initially be None
366 self.assertEqual(socket.getdefaulttimeout(), None)
367 s = socket.socket()
368 self.assertEqual(s.gettimeout(), None)
369 s.close()
370
371 # Set the default timeout to 10, and see if it propagates
372 socket.setdefaulttimeout(10)
373 self.assertEqual(socket.getdefaulttimeout(), 10)
374 s = socket.socket()
375 self.assertEqual(s.gettimeout(), 10)
376 s.close()
377
378 # Reset the default timeout to None, and see if it propagates
379 socket.setdefaulttimeout(None)
380 self.assertEqual(socket.getdefaulttimeout(), None)
381 s = socket.socket()
382 self.assertEqual(s.gettimeout(), None)
383 s.close()
384
385 # Check that setting it to an invalid value raises ValueError
386 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
387
388 # Check that setting it to an invalid type raises TypeError
389 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
390
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000391 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000392 if not hasattr(socket, 'inet_pton'):
393 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000394 from socket import inet_aton as f, inet_pton, AF_INET
395 g = lambda a: inet_pton(AF_INET, a)
396
397 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
398 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
399 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
400 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000401 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000402
403 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
404 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
405 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000406 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000407
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000408 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000409 if not hasattr(socket, 'inet_pton'):
410 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000411 try:
412 from socket import inet_pton, AF_INET6, has_ipv6
413 if not has_ipv6:
414 return
415 except ImportError:
416 return
417 f = lambda a: inet_pton(AF_INET6, a)
418
419 self.assertEquals('\x00' * 16, f('::'))
420 self.assertEquals('\x00' * 16, f('0::0'))
421 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
422 self.assertEquals(
423 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
424 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
425 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000426
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000427 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000428 if not hasattr(socket, 'inet_ntop'):
429 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000430 from socket import inet_ntoa as f, inet_ntop, AF_INET
431 g = lambda a: inet_ntop(AF_INET, a)
432
433 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
434 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
435 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
436 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000437
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000438 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
439 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
440 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
441
442 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000443 if not hasattr(socket, 'inet_ntop'):
444 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000445 try:
446 from socket import inet_ntop, AF_INET6, has_ipv6
447 if not has_ipv6:
448 return
449 except ImportError:
450 return
451 f = lambda a: inet_ntop(AF_INET6, a)
452
453 self.assertEquals('::', f('\x00' * 16))
454 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
455 self.assertEquals(
456 'aef:b01:506:1001:ffff:9997:55:170',
457 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
458 )
459
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000460 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000461
Guido van Rossum24e4af82002-06-12 19:18:08 +0000462 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000463 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000464 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000465 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000466 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000467 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
468 # it reasonable to get the host's addr in addition to 0.0.0.0.
469 # At least for eCos. This is required for the S/390 to pass.
470 my_ip_addr = socket.gethostbyname(socket.gethostname())
471 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
472 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000473
474 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000475 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000476 # We know a socket should start without reuse==0
477 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
478 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000479 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000480
481 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000482 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000483 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
484 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
485 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000486 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000487
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000488 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000489 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000490 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
491 sock.settimeout(1)
492 sock.close()
493 self.assertRaises(socket.error, sock.send, "spam")
494
Georg Brandlbb03ac02006-03-21 18:17:25 +0000495 def testNewAttributes(self):
496 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000497 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000498 self.assertEqual(sock.family, socket.AF_INET)
499 self.assertEqual(sock.type, socket.SOCK_STREAM)
500 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000501 sock.close()
502
Christian Heimesa47b75b2008-01-04 15:48:06 +0000503 def test_sock_ioctl(self):
504 if os.name != "nt":
505 return
506 self.assert_(hasattr(socket.socket, 'ioctl'))
507 self.assert_(hasattr(socket, 'SIO_RCVALL'))
508 self.assert_(hasattr(socket, 'RCVALL_ON'))
509 self.assert_(hasattr(socket, 'RCVALL_OFF'))
510
511
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512class BasicTCPTest(SocketConnectedTest):
513
514 def __init__(self, methodName='runTest'):
515 SocketConnectedTest.__init__(self, methodName=methodName)
516
517 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000518 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000520 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521
522 def _testRecv(self):
523 self.serv_conn.send(MSG)
524
525 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000526 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000527 seg1 = self.cli_conn.recv(len(MSG) - 3)
528 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000529 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000530 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531
532 def _testOverFlowRecv(self):
533 self.serv_conn.send(MSG)
534
535 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000536 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000537 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000538 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539
540 def _testRecvFrom(self):
541 self.serv_conn.send(MSG)
542
543 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000544 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000545 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
546 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000547 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000548 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000549
550 def _testOverFlowRecvFrom(self):
551 self.serv_conn.send(MSG)
552
553 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000554 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000555 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000556 while 1:
557 read = self.cli_conn.recv(1024)
558 if not read:
559 break
Guido van Rossume531e292002-08-08 20:28:34 +0000560 msg += read
561 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562
563 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000564 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565 self.serv_conn.sendall(big_chunk)
566
567 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000568 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000569 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000570 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571 fd = self.cli_conn.fileno()
572 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
573 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000574 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575
576 def _testFromFd(self):
577 self.serv_conn.send(MSG)
578
579 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000580 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000581 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000582 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000583
584 def _testShutdown(self):
585 self.serv_conn.send(MSG)
586 self.serv_conn.shutdown(2)
587
588class BasicUDPTest(ThreadedUDPSocketTest):
589
590 def __init__(self, methodName='runTest'):
591 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
592
593 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000594 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000595 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000596 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597
598 def _testSendtoAndRecv(self):
599 self.cli.sendto(MSG, 0, (HOST, PORT))
600
Guido van Rossum1c938012002-06-12 21:17:20 +0000601 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000602 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000603 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000604 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000605
Guido van Rossum1c938012002-06-12 21:17:20 +0000606 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000607 self.cli.sendto(MSG, 0, (HOST, PORT))
608
Facundo Batista1fe9f962007-03-28 03:45:20 +0000609 def testRecvFromNegative(self):
610 # Negative lengths passed to recvfrom should give ValueError.
611 self.assertRaises(ValueError, self.serv.recvfrom, -1)
612
613 def _testRecvFromNegative(self):
614 self.cli.sendto(MSG, 0, (HOST, PORT))
615
Martin v. Löwis7596e832006-07-01 15:33:37 +0000616class TCPCloserTest(ThreadedTCPSocketTest):
617
618 def testClose(self):
619 conn, addr = self.serv.accept()
620 conn.close()
621
622 sd = self.cli
623 read, write, err = select.select([sd], [], [], 1.0)
624 self.assertEqual(read, [sd])
625 self.assertEqual(sd.recv(1), '')
626
627 def _testClose(self):
628 self.cli.connect((HOST, PORT))
629 time.sleep(1.0)
630
Dave Cole331708b2004-08-09 04:51:41 +0000631class BasicSocketPairTest(SocketPairTest):
632
633 def __init__(self, methodName='runTest'):
634 SocketPairTest.__init__(self, methodName=methodName)
635
636 def testRecv(self):
637 msg = self.serv.recv(1024)
638 self.assertEqual(msg, MSG)
639
640 def _testRecv(self):
641 self.cli.send(MSG)
642
643 def testSend(self):
644 self.serv.send(MSG)
645
646 def _testSend(self):
647 msg = self.cli.recv(1024)
648 self.assertEqual(msg, MSG)
649
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650class NonBlockingTCPTests(ThreadedTCPSocketTest):
651
652 def __init__(self, methodName='runTest'):
653 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
654
655 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000656 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000657 self.serv.setblocking(0)
658 start = time.time()
659 try:
660 self.serv.accept()
661 except socket.error:
662 pass
663 end = time.time()
664 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
665
666 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000667 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000668
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000670 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000671 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000672 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000673 conn, addr = self.serv.accept()
674 except socket.error:
675 pass
676 else:
677 self.fail("Error trying to do non-blocking accept.")
678 read, write, err = select.select([self.serv], [], [])
679 if self.serv in read:
680 conn, addr = self.serv.accept()
681 else:
682 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000683
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000685 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000686 self.cli.connect((HOST, PORT))
687
688 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000689 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000690 conn, addr = self.serv.accept()
691
692 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000693 self.cli.settimeout(10)
694 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000695
696 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000697 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000698 conn, addr = self.serv.accept()
699 conn.setblocking(0)
700 try:
701 msg = conn.recv(len(MSG))
702 except socket.error:
703 pass
704 else:
705 self.fail("Error trying to do non-blocking recv.")
706 read, write, err = select.select([conn], [], [])
707 if conn in read:
708 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000709 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710 else:
711 self.fail("Error during select call to non-blocking socket.")
712
713 def _testRecv(self):
714 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000715 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716 self.cli.send(MSG)
717
718class FileObjectClassTestCase(SocketConnectedTest):
719
Guido van Rossume9f66142002-08-07 15:46:19 +0000720 bufsize = -1 # Use default buffer size
721
Guido van Rossum24e4af82002-06-12 19:18:08 +0000722 def __init__(self, methodName='runTest'):
723 SocketConnectedTest.__init__(self, methodName=methodName)
724
725 def setUp(self):
726 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000727 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728
729 def tearDown(self):
730 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000731 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732 self.serv_file = None
733 SocketConnectedTest.tearDown(self)
734
735 def clientSetUp(self):
736 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000737 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000738
739 def clientTearDown(self):
740 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000741 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000742 self.cli_file = None
743 SocketConnectedTest.clientTearDown(self)
744
745 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000746 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747 first_seg = self.serv_file.read(len(MSG)-3)
748 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000749 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000750 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000751
752 def _testSmallRead(self):
753 self.cli_file.write(MSG)
754 self.cli_file.flush()
755
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 def testFullRead(self):
757 # read until EOF
758 msg = self.serv_file.read()
759 self.assertEqual(msg, MSG)
760
761 def _testFullRead(self):
762 self.cli_file.write(MSG)
763 self.cli_file.close()
764
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000766 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000767 buf = ''
768 while 1:
769 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000770 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000772 buf += char
773 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774
775 def _testUnbufferedRead(self):
776 self.cli_file.write(MSG)
777 self.cli_file.flush()
778
779 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000780 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000782 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783
784 def _testReadline(self):
785 self.cli_file.write(MSG)
786 self.cli_file.flush()
787
Tim Peters116d83c2004-03-28 02:20:45 +0000788 def testClosedAttr(self):
789 self.assert_(not self.serv_file.closed)
790
791 def _testClosedAttr(self):
792 self.assert_(not self.cli_file.closed)
793
Guido van Rossume9f66142002-08-07 15:46:19 +0000794class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
795
796 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000797
Guido van Rossume9f66142002-08-07 15:46:19 +0000798 In this case (and in this case only), it should be possible to
799 create a file object, read a line from it, create another file
800 object, read another line from it, without loss of data in the
801 first file object's buffer. Note that httplib relies on this
802 when reading multiple requests from the same socket."""
803
804 bufsize = 0 # Use unbuffered mode
805
806 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000807 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000808 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000809 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000810 self.serv_file = self.cli_conn.makefile('rb', 0)
811 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000812 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000813
814 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000815 self.cli_file.write("A. " + MSG)
816 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000817 self.cli_file.flush()
818
Guido van Rossum8c943832002-08-08 01:00:28 +0000819class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
820
821 bufsize = 1 # Default-buffered for reading; line-buffered for writing
822
823
824class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
825
826 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000827
Georg Brandldd7b0522007-01-21 10:35:10 +0000828
Facundo Batista07c78be2007-03-23 18:54:07 +0000829class NetworkConnectionTest(object):
830 """Prove network connection."""
831 def clientSetUp(self):
832 self.cli = socket.create_connection((HOST, PORT))
833 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000834
Facundo Batista07c78be2007-03-23 18:54:07 +0000835class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
836 """Tests that NetworkConnection does not break existing TCP functionality.
837 """
838
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000839class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000840 def testWithoutServer(self):
Facundo Batista07c78be2007-03-23 18:54:07 +0000841 self.failUnlessRaises(socket.error, lambda: socket.create_connection((HOST, PORT)))
842
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000843class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
844
845 def __init__(self, methodName='runTest'):
846 SocketTCPTest.__init__(self, methodName=methodName)
847 ThreadableTest.__init__(self)
848
849 def clientSetUp(self):
850 pass
851
852 def clientTearDown(self):
853 self.cli.close()
854 self.cli = None
855 ThreadableTest.clientTearDown(self)
856
857 def _justAccept(self):
858 conn, addr = self.serv.accept()
859
860 testFamily = _justAccept
861 def _testFamily(self):
862 self.cli = socket.create_connection((HOST, PORT), timeout=30)
863 self.assertEqual(self.cli.family, 2)
864
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000865 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000866 def _testTimeoutDefault(self):
867 self.cli = socket.create_connection((HOST, PORT))
868 self.assertTrue(self.cli.gettimeout() is None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000869
870 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000871 def _testTimeoutValueNamed(self):
872 self.cli = socket.create_connection((HOST, PORT), timeout=30)
873 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000874
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000875 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000876 def _testTimeoutValueNonamed(self):
877 self.cli = socket.create_connection((HOST, PORT), 30)
878 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000879
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000880 testTimeoutNone = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000881 def _testTimeoutNone(self):
Facundo Batista07c78be2007-03-23 18:54:07 +0000882 previous = socket.getdefaulttimeout()
Facundo Batista14553b02007-03-23 20:23:08 +0000883 socket.setdefaulttimeout(30)
884 try:
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000885 self.cli = socket.create_connection((HOST, PORT), timeout=None)
Facundo Batista14553b02007-03-23 20:23:08 +0000886 finally:
887 socket.setdefaulttimeout(previous)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000888 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000889
890
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000891class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
892
893 def __init__(self, methodName='runTest'):
894 SocketTCPTest.__init__(self, methodName=methodName)
895 ThreadableTest.__init__(self)
896
897 def clientSetUp(self):
898 pass
899
900 def clientTearDown(self):
901 self.cli.close()
902 self.cli = None
903 ThreadableTest.clientTearDown(self)
904
Facundo Batista07c78be2007-03-23 18:54:07 +0000905 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000906 conn, addr = self.serv.accept()
907 time.sleep(3)
908 conn.send("done!")
909 testOutsideTimeout = testInsideTimeout
910
911 def _testInsideTimeout(self):
912 self.cli = sock = socket.create_connection((HOST, PORT))
Facundo Batista07c78be2007-03-23 18:54:07 +0000913 data = sock.recv(5)
914 self.assertEqual(data, "done!")
915
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000916 def _testOutsideTimeout(self):
917 self.cli = sock = socket.create_connection((HOST, PORT), timeout=1)
Facundo Batista07c78be2007-03-23 18:54:07 +0000918 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
919
920
Georg Brandldd7b0522007-01-21 10:35:10 +0000921class Urllib2FileobjectTest(unittest.TestCase):
922
923 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
924 # it close the socket if the close c'tor argument is true
925
926 def testClose(self):
927 class MockSocket:
928 closed = False
929 def flush(self): pass
930 def close(self): self.closed = True
931
932 # must not close unless we request it: the original use of _fileobject
933 # by module socket requires that the underlying socket not be closed until
934 # the _socketobject that created the _fileobject is closed
935 s = MockSocket()
936 f = socket._fileobject(s)
937 f.close()
938 self.assert_(not s.closed)
939
940 s = MockSocket()
941 f = socket._fileobject(s, close=True)
942 f.close()
943 self.assert_(s.closed)
944
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000945class TCPTimeoutTest(SocketTCPTest):
946
947 def testTCPTimeout(self):
948 def raise_timeout(*args, **kwargs):
949 self.serv.settimeout(1.0)
950 self.serv.accept()
951 self.failUnlessRaises(socket.timeout, raise_timeout,
952 "Error generating a timeout exception (TCP)")
953
954 def testTimeoutZero(self):
955 ok = False
956 try:
957 self.serv.settimeout(0.0)
958 foo = self.serv.accept()
959 except socket.timeout:
960 self.fail("caught timeout instead of error (TCP)")
961 except socket.error:
962 ok = True
963 except:
964 self.fail("caught unexpected exception (TCP)")
965 if not ok:
966 self.fail("accept() returned success when we did not expect it")
967
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000968 def testInterruptedTimeout(self):
969 # XXX I don't know how to do this test on MSWindows or any other
970 # plaform that doesn't support signal.alarm() or os.kill(), though
971 # the bug should have existed on all platforms.
972 if not hasattr(signal, "alarm"):
973 return # can only test on *nix
974 self.serv.settimeout(5.0) # must be longer than alarm
975 class Alarm(Exception):
976 pass
977 def alarm_handler(signal, frame):
978 raise Alarm
979 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
980 try:
981 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
982 try:
983 foo = self.serv.accept()
984 except socket.timeout:
985 self.fail("caught timeout instead of Alarm")
986 except Alarm:
987 pass
988 except:
989 self.fail("caught other exception instead of Alarm")
990 else:
991 self.fail("nothing caught")
992 signal.alarm(0) # shut off alarm
993 except Alarm:
994 self.fail("got Alarm in wrong place")
995 finally:
996 # no alarm can be pending. Safe to restore old handler.
997 signal.signal(signal.SIGALRM, old_alarm)
998
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000999class UDPTimeoutTest(SocketTCPTest):
1000
1001 def testUDPTimeout(self):
1002 def raise_timeout(*args, **kwargs):
1003 self.serv.settimeout(1.0)
1004 self.serv.recv(1024)
1005 self.failUnlessRaises(socket.timeout, raise_timeout,
1006 "Error generating a timeout exception (UDP)")
1007
1008 def testTimeoutZero(self):
1009 ok = False
1010 try:
1011 self.serv.settimeout(0.0)
1012 foo = self.serv.recv(1024)
1013 except socket.timeout:
1014 self.fail("caught timeout instead of error (UDP)")
1015 except socket.error:
1016 ok = True
1017 except:
1018 self.fail("caught unexpected exception (UDP)")
1019 if not ok:
1020 self.fail("recv() returned success when we did not expect it")
1021
1022class TestExceptions(unittest.TestCase):
1023
1024 def testExceptionTree(self):
1025 self.assert_(issubclass(socket.error, Exception))
1026 self.assert_(issubclass(socket.herror, socket.error))
1027 self.assert_(issubclass(socket.gaierror, socket.error))
1028 self.assert_(issubclass(socket.timeout, socket.error))
1029
Armin Rigoa9017c32006-04-19 11:50:27 +00001030class TestLinuxAbstractNamespace(unittest.TestCase):
1031
1032 UNIX_PATH_MAX = 108
1033
1034 def testLinuxAbstractNamespace(self):
1035 address = "\x00python-test-hello\x00\xff"
1036 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1037 s1.bind(address)
1038 s1.listen(1)
1039 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1040 s2.connect(s1.getsockname())
1041 s1.accept()
1042 self.assertEqual(s1.getsockname(), address)
1043 self.assertEqual(s2.getpeername(), address)
1044
1045 def testMaxName(self):
1046 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1047 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1048 s.bind(address)
1049 self.assertEqual(s.getsockname(), address)
1050
1051 def testNameOverflow(self):
1052 address = "\x00" + "h" * self.UNIX_PATH_MAX
1053 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1054 self.assertRaises(socket.error, s.bind, address)
1055
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001056
Martin Blais2856e5f2006-05-26 12:03:27 +00001057class BufferIOTest(SocketConnectedTest):
1058 """
1059 Test the buffer versions of socket.recv() and socket.send().
1060 """
1061 def __init__(self, methodName='runTest'):
1062 SocketConnectedTest.__init__(self, methodName=methodName)
1063
Martin Blaisaf2ae722006-06-04 13:49:49 +00001064 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001065 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001066 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001067 self.assertEqual(nbytes, len(MSG))
1068 msg = buf.tostring()[:len(MSG)]
1069 self.assertEqual(msg, MSG)
1070
Martin Blaisaf2ae722006-06-04 13:49:49 +00001071 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001072 buf = buffer(MSG)
1073 self.serv_conn.send(buf)
1074
Martin Blaisaf2ae722006-06-04 13:49:49 +00001075 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001076 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001077 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001078 self.assertEqual(nbytes, len(MSG))
1079 msg = buf.tostring()[:len(MSG)]
1080 self.assertEqual(msg, MSG)
1081
Martin Blaisaf2ae722006-06-04 13:49:49 +00001082 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001083 buf = buffer(MSG)
1084 self.serv_conn.send(buf)
1085
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001086
1087TIPC_STYPE = 2000
1088TIPC_LOWER = 200
1089TIPC_UPPER = 210
1090
1091def isTipcAvailable():
1092 """Check if the TIPC module is loaded
1093
1094 The TIPC module is not loaded automatically on Ubuntu and probably
1095 other Linux distros.
1096 """
1097 if not hasattr(socket, "AF_TIPC"):
1098 return False
1099 if not os.path.isfile("/proc/modules"):
1100 return False
1101 with open("/proc/modules") as f:
1102 for line in f:
1103 if line.startswith("tipc "):
1104 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001105 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001106 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1107 return False
1108
1109class TIPCTest (unittest.TestCase):
1110 def testRDM(self):
1111 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1112 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1113
1114 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1115 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1116 TIPC_LOWER, TIPC_UPPER)
1117 srv.bind(srvaddr)
1118
1119 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1120 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1121 cli.sendto(MSG, sendaddr)
1122
1123 msg, recvaddr = srv.recvfrom(1024)
1124
1125 self.assertEqual(cli.getsockname(), recvaddr)
1126 self.assertEqual(msg, MSG)
1127
1128
1129class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1130 def __init__(self, methodName = 'runTest'):
1131 unittest.TestCase.__init__(self, methodName = methodName)
1132 ThreadableTest.__init__(self)
1133
1134 def setUp(self):
1135 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1136 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1137 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1138 TIPC_LOWER, TIPC_UPPER)
1139 self.srv.bind(srvaddr)
1140 self.srv.listen(5)
1141 self.serverExplicitReady()
1142 self.conn, self.connaddr = self.srv.accept()
1143
1144 def clientSetUp(self):
1145 # The is a hittable race between serverExplicitReady() and the
1146 # accept() call; sleep a little while to avoid it, otherwise
1147 # we could get an exception
1148 time.sleep(0.1)
1149 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1150 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1151 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1152 self.cli.connect(addr)
1153 self.cliaddr = self.cli.getsockname()
1154
1155 def testStream(self):
1156 msg = self.conn.recv(1024)
1157 self.assertEqual(msg, MSG)
1158 self.assertEqual(self.cliaddr, self.connaddr)
1159
1160 def _testStream(self):
1161 self.cli.send(MSG)
1162 self.cli.close()
1163
1164
Guido van Rossumb995eb72002-07-31 16:08:40 +00001165def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001166 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001167 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001168 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001169 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001170
1171 tests.extend([
1172 NonBlockingTCPTests,
1173 FileObjectClassTestCase,
1174 UnbufferedFileObjectClassTestCase,
1175 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001176 SmallBufferedFileObjectClassTestCase,
1177 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001178 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001179 NetworkConnectionAttributesTest,
1180 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001181 ])
Dave Cole331708b2004-08-09 04:51:41 +00001182 if hasattr(socket, "socketpair"):
1183 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001184 if sys.platform == 'linux2':
1185 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001186 if isTipcAvailable():
1187 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001188 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001189
1190 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001191 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001192 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001193
1194if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001195 test_main()