blob: f52d8847484f7d29605cd1de2cf7f7692e1b7ae0 [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
Trent Nelsone41b0062008-04-08 23:47:30 +00006import errno
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import thread, threading
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +000010import time
11import traceback
Georg Brandla6168f92008-05-25 07:20:14 +000012import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000014import os
Martin Blais2856e5f2006-05-26 12:03:27 +000015import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000016from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000017import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Trent Nelsone41b0062008-04-08 23:47:30 +000019HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000020MSG = '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)
Trent Nelsone41b0062008-04-08 23:47:30 +000026 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000027 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000028
Guido van Rossum24e4af82002-06-12 19:18:08 +000029 def tearDown(self):
30 self.serv.close()
31 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Guido van Rossum24e4af82002-06-12 19:18:08 +000033class SocketUDPTest(unittest.TestCase):
34
35 def setUp(self):
36 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000037 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000038
39 def tearDown(self):
40 self.serv.close()
41 self.serv = None
42
43class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000044 """Threadable Test class
45
46 The ThreadableTest class makes it easy to create a threaded
47 client/server pair from an existing unit test. To create a
48 new threaded class from an existing unit test, use multiple
49 inheritance:
50
51 class NewClass (OldClass, ThreadableTest):
52 pass
53
54 This class defines two new fixture functions with obvious
55 purposes for overriding:
56
57 clientSetUp ()
58 clientTearDown ()
59
60 Any new test functions within the class must then define
61 tests in pairs, where the test name is preceeded with a
62 '_' to indicate the client portion of the test. Ex:
63
64 def testFoo(self):
65 # Server portion
66
67 def _testFoo(self):
68 # Client portion
69
70 Any exceptions raised by the clients during their tests
71 are caught and transferred to the main thread to alert
72 the testing framework.
73
74 Note, the server setup function cannot call any blocking
75 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000076 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000077 the blocking call (such as in setting up a client/server
78 connection and performing the accept() in setUp().
79 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000080
81 def __init__(self):
82 # Swap the true setup function
83 self.__setUp = self.setUp
84 self.__tearDown = self.tearDown
85 self.setUp = self._setUp
86 self.tearDown = self._tearDown
87
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000088 def serverExplicitReady(self):
89 """This method allows the server to explicitly indicate that
90 it wants the client thread to proceed. This is useful if the
91 server is about to execute a blocking routine that is
92 dependent upon the client thread during its setup routine."""
93 self.server_ready.set()
94
Guido van Rossum24e4af82002-06-12 19:18:08 +000095 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000096 self.server_ready = threading.Event()
97 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000098 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +000099 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000100
101 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000102 methodname = self.id()
103 i = methodname.rfind('.')
104 methodname = methodname[i+1:]
105 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000106 self.client_thread = thread.start_new_thread(
107 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000108
109 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000110 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 self.server_ready.set()
112 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000113
114 def _tearDown(self):
115 self.__tearDown()
116 self.done.wait()
117
118 if not self.queue.empty():
119 msg = self.queue.get()
120 self.fail(msg)
121
122 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 self.server_ready.wait()
124 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000125 self.clientSetUp()
Ezio Melottia65e2af2010-08-02 19:56:05 +0000126 with test_support._check_py3k_warnings():
127 if not callable(test_func):
128 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000129 try:
130 test_func()
131 except Exception, strerror:
132 self.queue.put(strerror)
133 self.clientTearDown()
134
135 def clientSetUp(self):
Ezio Melottia65e2af2010-08-02 19:56:05 +0000136 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000137
138 def clientTearDown(self):
139 self.done.set()
140 thread.exit()
141
142class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
143
144 def __init__(self, methodName='runTest'):
145 SocketTCPTest.__init__(self, methodName=methodName)
146 ThreadableTest.__init__(self)
147
148 def clientSetUp(self):
149 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
150
151 def clientTearDown(self):
152 self.cli.close()
153 self.cli = None
154 ThreadableTest.clientTearDown(self)
155
156class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
157
158 def __init__(self, methodName='runTest'):
159 SocketUDPTest.__init__(self, methodName=methodName)
160 ThreadableTest.__init__(self)
161
162 def clientSetUp(self):
163 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
164
165class SocketConnectedTest(ThreadedTCPSocketTest):
166
167 def __init__(self, methodName='runTest'):
168 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
169
170 def setUp(self):
171 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000172 # Indicate explicitly we're ready for the client thread to
173 # proceed and then perform the blocking call to accept
174 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175 conn, addr = self.serv.accept()
176 self.cli_conn = conn
177
178 def tearDown(self):
179 self.cli_conn.close()
180 self.cli_conn = None
181 ThreadedTCPSocketTest.tearDown(self)
182
183 def clientSetUp(self):
184 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000185 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000186 self.serv_conn = self.cli
187
188 def clientTearDown(self):
189 self.serv_conn.close()
190 self.serv_conn = None
191 ThreadedTCPSocketTest.clientTearDown(self)
192
Dave Cole331708b2004-08-09 04:51:41 +0000193class SocketPairTest(unittest.TestCase, ThreadableTest):
194
195 def __init__(self, methodName='runTest'):
196 unittest.TestCase.__init__(self, methodName=methodName)
197 ThreadableTest.__init__(self)
198
199 def setUp(self):
200 self.serv, self.cli = socket.socketpair()
201
202 def tearDown(self):
203 self.serv.close()
204 self.serv = None
205
206 def clientSetUp(self):
207 pass
208
209 def clientTearDown(self):
210 self.cli.close()
211 self.cli = None
212 ThreadableTest.clientTearDown(self)
213
Tim Peters494aaee2004-08-09 18:54:11 +0000214
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215#######################################################################
216## Begin Tests
217
218class GeneralModuleTests(unittest.TestCase):
219
Raymond Hettinger027bb632004-05-31 03:09:25 +0000220 def test_weakref(self):
221 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
222 p = proxy(s)
223 self.assertEqual(p.fileno(), s.fileno())
224 s.close()
225 s = None
226 try:
227 p.fileno()
228 except ReferenceError:
229 pass
230 else:
231 self.fail('Socket proxy still exists')
232
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000234 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000235 def raise_error(*args, **kwargs):
236 raise socket.error
237 def raise_herror(*args, **kwargs):
238 raise socket.herror
239 def raise_gaierror(*args, **kwargs):
240 raise socket.gaierror
241 self.failUnlessRaises(socket.error, raise_error,
242 "Error raising socket exception.")
243 self.failUnlessRaises(socket.error, raise_herror,
244 "Error raising socket exception.")
245 self.failUnlessRaises(socket.error, raise_gaierror,
246 "Error raising socket exception.")
247
248 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000249 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 socket.AF_INET
251 socket.SOCK_STREAM
252 socket.SOCK_DGRAM
253 socket.SOCK_RAW
254 socket.SOCK_RDM
255 socket.SOCK_SEQPACKET
256 socket.SOL_SOCKET
257 socket.SO_REUSEADDR
258
Guido van Rossum654c11e2002-06-13 20:24:17 +0000259 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000260 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000261 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000262 try:
263 ip = socket.gethostbyname(hostname)
264 except socket.error:
265 # Probably name lookup wasn't set up right; skip this test
266 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000267 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000268 try:
269 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
270 except socket.error:
271 # Probably a similar problem as above; skip this test
272 return
Brett Cannon01668a12005-03-11 00:04:17 +0000273 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000274 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000275 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000276 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000277
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000278 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000279 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000280 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 try:
282 # On some versions, this loses a reference
283 orig = sys.getrefcount(__name__)
284 socket.getnameinfo(__name__,0)
Georg Brandl3ad28472009-09-19 07:46:24 +0000285 except TypeError:
Ezio Melottia65e2af2010-08-02 19:56:05 +0000286 self.assertEqual(sys.getrefcount(__name__), orig,
287 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000288
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000290 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000291 try:
292 # On some versions, this crashes the interpreter.
293 socket.getnameinfo(('x', 0, 0, 0), 0)
294 except socket.error:
295 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000296
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000297 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000298 # This just checks that htons etc. are their own inverse,
299 # when looking at the lower 16 or 32 bits.
300 sizes = {socket.htonl: 32, socket.ntohl: 32,
301 socket.htons: 16, socket.ntohs: 16}
302 for func, size in sizes.items():
303 mask = (1L<<size) - 1
304 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
305 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000306
Guido van Rossuma2627af2002-09-14 00:58:46 +0000307 swapped = func(mask)
308 self.assertEqual(swapped & mask, mask)
309 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000310
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000311 def testNtoHErrors(self):
312 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
313 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
314 for k in good_values:
315 socket.ntohl(k)
316 socket.ntohs(k)
317 socket.htonl(k)
318 socket.htons(k)
319 for k in bad_values:
320 self.assertRaises(OverflowError, socket.ntohl, k)
321 self.assertRaises(OverflowError, socket.ntohs, k)
322 self.assertRaises(OverflowError, socket.htonl, k)
323 self.assertRaises(OverflowError, socket.htons, k)
324
Barry Warsaw11b91a02004-06-28 00:50:43 +0000325 def testGetServBy(self):
326 eq = self.assertEqual
327 # Find one service that exists, then check all the related interfaces.
328 # I've ordered this by protocols that have both a tcp and udp
329 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000330 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000331 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000332 # avoid the 'echo' service on this platform, as there is an
333 # assumption breaking non-standard port/protocol entry
334 services = ('daytime', 'qotd', 'domain')
335 else:
336 services = ('echo', 'daytime', 'domain')
337 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000338 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000339 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000340 break
341 except socket.error:
342 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000343 else:
344 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000345 # Try same call with optional protocol omitted
346 port2 = socket.getservbyname(service)
347 eq(port, port2)
348 # Try udp, but don't barf it it doesn't exist
349 try:
350 udpport = socket.getservbyname(service, 'udp')
351 except socket.error:
352 udpport = None
353 else:
354 eq(udpport, port)
355 # Now make sure the lookup by port returns the same service name
356 eq(socket.getservbyport(port2), service)
357 eq(socket.getservbyport(port, 'tcp'), service)
358 if udpport is not None:
359 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000360
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000361 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000362 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000363 # The default timeout should initially be None
364 self.assertEqual(socket.getdefaulttimeout(), None)
365 s = socket.socket()
366 self.assertEqual(s.gettimeout(), None)
367 s.close()
368
369 # Set the default timeout to 10, and see if it propagates
370 socket.setdefaulttimeout(10)
371 self.assertEqual(socket.getdefaulttimeout(), 10)
372 s = socket.socket()
373 self.assertEqual(s.gettimeout(), 10)
374 s.close()
375
376 # Reset the default timeout to None, and see if it propagates
377 socket.setdefaulttimeout(None)
378 self.assertEqual(socket.getdefaulttimeout(), None)
379 s = socket.socket()
380 self.assertEqual(s.gettimeout(), None)
381 s.close()
382
383 # Check that setting it to an invalid value raises ValueError
384 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
385
386 # Check that setting it to an invalid type raises TypeError
387 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
388
Gregory P. Smith63e64ad2009-11-01 20:28:48 +0000389 def testIPv4_inet_aton_fourbytes(self):
390 if not hasattr(socket, 'inet_aton'):
391 return # No inet_aton, nothing to check
392 # Test that issue1008086 and issue767150 are fixed.
393 # It must return 4 bytes.
394 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
395 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
396
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000397 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000398 if not hasattr(socket, 'inet_pton'):
399 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000400 from socket import inet_aton as f, inet_pton, AF_INET
401 g = lambda a: inet_pton(AF_INET, a)
402
403 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
404 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
405 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
406 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000407 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000408
409 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
410 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
411 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000412 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000413
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000414 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000415 if not hasattr(socket, 'inet_pton'):
416 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000417 try:
418 from socket import inet_pton, AF_INET6, has_ipv6
419 if not has_ipv6:
420 return
421 except ImportError:
422 return
423 f = lambda a: inet_pton(AF_INET6, a)
424
425 self.assertEquals('\x00' * 16, f('::'))
426 self.assertEquals('\x00' * 16, f('0::0'))
427 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
428 self.assertEquals(
429 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
430 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
431 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000432
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000433 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000434 if not hasattr(socket, 'inet_ntop'):
435 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000436 from socket import inet_ntoa as f, inet_ntop, AF_INET
437 g = lambda a: inet_ntop(AF_INET, a)
438
439 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
440 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
441 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
442 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000443
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000444 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
445 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
446 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
447
448 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000449 if not hasattr(socket, 'inet_ntop'):
450 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000451 try:
452 from socket import inet_ntop, AF_INET6, has_ipv6
453 if not has_ipv6:
454 return
455 except ImportError:
456 return
457 f = lambda a: inet_ntop(AF_INET6, a)
458
459 self.assertEquals('::', f('\x00' * 16))
460 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
461 self.assertEquals(
462 'aef:b01:506:1001:ffff:9997:55:170',
463 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
464 )
465
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000466 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000467
Guido van Rossum24e4af82002-06-12 19:18:08 +0000468 def testSockName(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000469 # Testing getsockname(). Use a temporary socket to elicit an unused
470 # ephemeral port that we can use later in the test.
471 tempsock = socket.socket()
472 tempsock.bind(("0.0.0.0", 0))
473 (host, port) = tempsock.getsockname()
474 tempsock.close()
475 del tempsock
476
Guido van Rossum24e4af82002-06-12 19:18:08 +0000477 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +0000478 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000479 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000480 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
481 # it reasonable to get the host's addr in addition to 0.0.0.0.
482 # At least for eCos. This is required for the S/390 to pass.
483 my_ip_addr = socket.gethostbyname(socket.gethostname())
484 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000485 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000486
487 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000488 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000489 # We know a socket should start without reuse==0
490 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
491 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000492 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000493
494 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000495 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
497 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
498 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000499 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000501 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000502 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000503 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
504 sock.settimeout(1)
505 sock.close()
506 self.assertRaises(socket.error, sock.send, "spam")
507
Georg Brandlbb03ac02006-03-21 18:17:25 +0000508 def testNewAttributes(self):
509 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000510 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000511 self.assertEqual(sock.family, socket.AF_INET)
512 self.assertEqual(sock.type, socket.SOCK_STREAM)
513 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000514 sock.close()
515
Christian Heimesa47b75b2008-01-04 15:48:06 +0000516 def test_sock_ioctl(self):
517 if os.name != "nt":
518 return
519 self.assert_(hasattr(socket.socket, 'ioctl'))
520 self.assert_(hasattr(socket, 'SIO_RCVALL'))
521 self.assert_(hasattr(socket, 'RCVALL_ON'))
522 self.assert_(hasattr(socket, 'RCVALL_OFF'))
523
524
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525class BasicTCPTest(SocketConnectedTest):
526
527 def __init__(self, methodName='runTest'):
528 SocketConnectedTest.__init__(self, methodName=methodName)
529
530 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000531 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000533 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534
535 def _testRecv(self):
536 self.serv_conn.send(MSG)
537
538 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000539 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540 seg1 = self.cli_conn.recv(len(MSG) - 3)
541 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000542 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000543 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000544
545 def _testOverFlowRecv(self):
546 self.serv_conn.send(MSG)
547
548 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000549 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000550 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000551 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552
553 def _testRecvFrom(self):
554 self.serv_conn.send(MSG)
555
556 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000557 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000558 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
559 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000560 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000561 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562
563 def _testOverFlowRecvFrom(self):
564 self.serv_conn.send(MSG)
565
566 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000567 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000568 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000569 while 1:
570 read = self.cli_conn.recv(1024)
571 if not read:
572 break
Guido van Rossume531e292002-08-08 20:28:34 +0000573 msg += read
574 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575
576 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000577 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 self.serv_conn.sendall(big_chunk)
579
580 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000581 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000582 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000583 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 fd = self.cli_conn.fileno()
585 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
586 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000587 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000588
589 def _testFromFd(self):
590 self.serv_conn.send(MSG)
591
592 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000593 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000594 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000595 self.assertEqual(msg, MSG)
Mark Dickinson17d83f32009-01-15 15:25:51 +0000596 # wait for _testShutdown to finish: on OS X, when the server
597 # closes the connection the client also becomes disconnected,
598 # and the client's shutdown call will fail. (Issue #4397.)
599 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000600
601 def _testShutdown(self):
602 self.serv_conn.send(MSG)
603 self.serv_conn.shutdown(2)
604
605class BasicUDPTest(ThreadedUDPSocketTest):
606
607 def __init__(self, methodName='runTest'):
608 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
609
610 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000611 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000612 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000613 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614
615 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000616 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617
Guido van Rossum1c938012002-06-12 21:17:20 +0000618 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000619 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000620 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000621 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622
Guido van Rossum1c938012002-06-12 21:17:20 +0000623 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000624 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000625
Facundo Batista1fe9f962007-03-28 03:45:20 +0000626 def testRecvFromNegative(self):
627 # Negative lengths passed to recvfrom should give ValueError.
628 self.assertRaises(ValueError, self.serv.recvfrom, -1)
629
630 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000631 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000632
Martin v. Löwis7596e832006-07-01 15:33:37 +0000633class TCPCloserTest(ThreadedTCPSocketTest):
634
635 def testClose(self):
636 conn, addr = self.serv.accept()
637 conn.close()
638
639 sd = self.cli
640 read, write, err = select.select([sd], [], [], 1.0)
641 self.assertEqual(read, [sd])
642 self.assertEqual(sd.recv(1), '')
643
644 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000645 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000646 time.sleep(1.0)
647
Dave Cole331708b2004-08-09 04:51:41 +0000648class BasicSocketPairTest(SocketPairTest):
649
650 def __init__(self, methodName='runTest'):
651 SocketPairTest.__init__(self, methodName=methodName)
652
653 def testRecv(self):
654 msg = self.serv.recv(1024)
655 self.assertEqual(msg, MSG)
656
657 def _testRecv(self):
658 self.cli.send(MSG)
659
660 def testSend(self):
661 self.serv.send(MSG)
662
663 def _testSend(self):
664 msg = self.cli.recv(1024)
665 self.assertEqual(msg, MSG)
666
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667class NonBlockingTCPTests(ThreadedTCPSocketTest):
668
669 def __init__(self, methodName='runTest'):
670 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
671
672 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000673 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000674 self.serv.setblocking(0)
675 start = time.time()
676 try:
677 self.serv.accept()
678 except socket.error:
679 pass
680 end = time.time()
681 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
682
683 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000684 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000685
Guido van Rossum24e4af82002-06-12 19:18:08 +0000686 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000687 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000688 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000689 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000690 conn, addr = self.serv.accept()
691 except socket.error:
692 pass
693 else:
694 self.fail("Error trying to do non-blocking accept.")
695 read, write, err = select.select([self.serv], [], [])
696 if self.serv in read:
697 conn, addr = self.serv.accept()
698 else:
699 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000700
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000702 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000703 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000704
705 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000706 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707 conn, addr = self.serv.accept()
708
709 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000710 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000711 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712
713 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000714 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715 conn, addr = self.serv.accept()
716 conn.setblocking(0)
717 try:
718 msg = conn.recv(len(MSG))
719 except socket.error:
720 pass
721 else:
722 self.fail("Error trying to do non-blocking recv.")
723 read, write, err = select.select([conn], [], [])
724 if conn in read:
725 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000726 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 else:
728 self.fail("Error during select call to non-blocking socket.")
729
730 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000731 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000732 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733 self.cli.send(MSG)
734
735class FileObjectClassTestCase(SocketConnectedTest):
736
Guido van Rossume9f66142002-08-07 15:46:19 +0000737 bufsize = -1 # Use default buffer size
738
Guido van Rossum24e4af82002-06-12 19:18:08 +0000739 def __init__(self, methodName='runTest'):
740 SocketConnectedTest.__init__(self, methodName=methodName)
741
742 def setUp(self):
743 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000744 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000745
746 def tearDown(self):
747 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000748 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749 self.serv_file = None
750 SocketConnectedTest.tearDown(self)
751
752 def clientSetUp(self):
753 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000754 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755
756 def clientTearDown(self):
757 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000758 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000759 self.cli_file = None
760 SocketConnectedTest.clientTearDown(self)
761
762 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000763 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764 first_seg = self.serv_file.read(len(MSG)-3)
765 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000766 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000767 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768
769 def _testSmallRead(self):
770 self.cli_file.write(MSG)
771 self.cli_file.flush()
772
Guido van Rossum8c943832002-08-08 01:00:28 +0000773 def testFullRead(self):
774 # read until EOF
775 msg = self.serv_file.read()
776 self.assertEqual(msg, MSG)
777
778 def _testFullRead(self):
779 self.cli_file.write(MSG)
780 self.cli_file.close()
781
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000783 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 buf = ''
785 while 1:
786 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000789 buf += char
790 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000791
792 def _testUnbufferedRead(self):
793 self.cli_file.write(MSG)
794 self.cli_file.flush()
795
796 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000797 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000799 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800
801 def _testReadline(self):
802 self.cli_file.write(MSG)
803 self.cli_file.flush()
804
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000805 def testReadlineAfterRead(self):
806 a_baloo_is = self.serv_file.read(len("A baloo is"))
807 self.assertEqual("A baloo is", a_baloo_is)
808 _a_bear = self.serv_file.read(len(" a bear"))
809 self.assertEqual(" a bear", _a_bear)
810 line = self.serv_file.readline()
811 self.assertEqual("\n", line)
812 line = self.serv_file.readline()
813 self.assertEqual("A BALOO IS A BEAR.\n", line)
814 line = self.serv_file.readline()
815 self.assertEqual(MSG, line)
816
817 def _testReadlineAfterRead(self):
818 self.cli_file.write("A baloo is a bear\n")
819 self.cli_file.write("A BALOO IS A BEAR.\n")
820 self.cli_file.write(MSG)
821 self.cli_file.flush()
822
823 def testReadlineAfterReadNoNewline(self):
824 end_of_ = self.serv_file.read(len("End Of "))
825 self.assertEqual("End Of ", end_of_)
826 line = self.serv_file.readline()
827 self.assertEqual("Line", line)
828
829 def _testReadlineAfterReadNoNewline(self):
830 self.cli_file.write("End Of Line")
831
Tim Peters116d83c2004-03-28 02:20:45 +0000832 def testClosedAttr(self):
833 self.assert_(not self.serv_file.closed)
834
835 def _testClosedAttr(self):
836 self.assert_(not self.cli_file.closed)
837
Jean-Paul Calderonec28d5542010-05-23 15:22:08 +0000838
839class FileObjectInterruptedTestCase(unittest.TestCase):
840 """Test that the file object correctly handles EINTR internally."""
841
842 class MockSocket(object):
843 def __init__(self, recv_funcs=()):
844 # A generator that returns callables that we'll call for each
845 # call to recv().
846 self._recv_step = iter(recv_funcs)
847
848 def recv(self, size):
849 return self._recv_step.next()()
850
851 @staticmethod
852 def _raise_eintr():
853 raise socket.error(errno.EINTR)
854
855 def _test_readline(self, size=-1, **kwargs):
856 mock_sock = self.MockSocket(recv_funcs=[
857 lambda : "This is the first line\nAnd the sec",
858 self._raise_eintr,
859 lambda : "ond line is here\n",
860 lambda : "",
861 ])
862 fo = socket._fileobject(mock_sock, **kwargs)
863 self.assertEquals(fo.readline(size), "This is the first line\n")
864 self.assertEquals(fo.readline(size), "And the second line is here\n")
865
866 def _test_read(self, size=-1, **kwargs):
867 mock_sock = self.MockSocket(recv_funcs=[
868 lambda : "This is the first line\nAnd the sec",
869 self._raise_eintr,
870 lambda : "ond line is here\n",
871 lambda : "",
872 ])
873 fo = socket._fileobject(mock_sock, **kwargs)
874 self.assertEquals(fo.read(size), "This is the first line\n"
875 "And the second line is here\n")
876
877 def test_default(self):
878 self._test_readline()
879 self._test_readline(size=100)
880 self._test_read()
881 self._test_read(size=100)
882
883 def test_with_1k_buffer(self):
884 self._test_readline(bufsize=1024)
885 self._test_readline(size=100, bufsize=1024)
886 self._test_read(bufsize=1024)
887 self._test_read(size=100, bufsize=1024)
888
889 def _test_readline_no_buffer(self, size=-1):
890 mock_sock = self.MockSocket(recv_funcs=[
891 lambda : "aa",
892 lambda : "\n",
893 lambda : "BB",
894 self._raise_eintr,
895 lambda : "bb",
896 lambda : "",
897 ])
898 fo = socket._fileobject(mock_sock, bufsize=0)
899 self.assertEquals(fo.readline(size), "aa\n")
900 self.assertEquals(fo.readline(size), "BBbb")
901
902 def test_no_buffer(self):
903 self._test_readline_no_buffer()
904 self._test_readline_no_buffer(size=4)
905 self._test_read(bufsize=0)
906 self._test_read(size=100, bufsize=0)
907
908
Guido van Rossume9f66142002-08-07 15:46:19 +0000909class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
910
911 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000912
Guido van Rossume9f66142002-08-07 15:46:19 +0000913 In this case (and in this case only), it should be possible to
914 create a file object, read a line from it, create another file
915 object, read another line from it, without loss of data in the
916 first file object's buffer. Note that httplib relies on this
917 when reading multiple requests from the same socket."""
918
919 bufsize = 0 # Use unbuffered mode
920
921 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000922 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000923 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000924 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000925 self.serv_file = self.cli_conn.makefile('rb', 0)
926 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000927 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000928
929 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000930 self.cli_file.write("A. " + MSG)
931 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000932 self.cli_file.flush()
933
Guido van Rossum8c943832002-08-08 01:00:28 +0000934class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
935
936 bufsize = 1 # Default-buffered for reading; line-buffered for writing
937
938
939class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
940
941 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000942
Georg Brandldd7b0522007-01-21 10:35:10 +0000943
Facundo Batista07c78be2007-03-23 18:54:07 +0000944class NetworkConnectionTest(object):
945 """Prove network connection."""
946 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000947 # We're inherited below by BasicTCPTest2, which also inherits
948 # BasicTCPTest, which defines self.port referenced below.
949 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +0000950 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000951
Facundo Batista07c78be2007-03-23 18:54:07 +0000952class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
953 """Tests that NetworkConnection does not break existing TCP functionality.
954 """
955
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000956class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000957 def testWithoutServer(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000958 port = test_support.find_unused_port()
959 self.failUnlessRaises(
960 socket.error,
961 lambda: socket.create_connection((HOST, port))
962 )
Facundo Batista07c78be2007-03-23 18:54:07 +0000963
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000964class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
965
966 def __init__(self, methodName='runTest'):
967 SocketTCPTest.__init__(self, methodName=methodName)
968 ThreadableTest.__init__(self)
969
970 def clientSetUp(self):
971 pass
972
973 def clientTearDown(self):
974 self.cli.close()
975 self.cli = None
976 ThreadableTest.clientTearDown(self)
977
978 def _justAccept(self):
979 conn, addr = self.serv.accept()
980
981 testFamily = _justAccept
982 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000983 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000984 self.assertEqual(self.cli.family, 2)
985
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000986 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000987 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000988 # passing no explicit timeout uses socket's global default
989 self.assert_(socket.getdefaulttimeout() is None)
990 socket.setdefaulttimeout(42)
991 try:
992 self.cli = socket.create_connection((HOST, self.port))
993 finally:
994 socket.setdefaulttimeout(None)
995 self.assertEquals(self.cli.gettimeout(), 42)
996
997 testTimeoutNone = _justAccept
998 def _testTimeoutNone(self):
999 # None timeout means the same as sock.settimeout(None)
1000 self.assert_(socket.getdefaulttimeout() is None)
1001 socket.setdefaulttimeout(30)
1002 try:
1003 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1004 finally:
1005 socket.setdefaulttimeout(None)
1006 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001007
1008 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001009 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001010 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001011 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001012
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001013 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001014 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001015 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001016 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001017
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001018class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1019
1020 def __init__(self, methodName='runTest'):
1021 SocketTCPTest.__init__(self, methodName=methodName)
1022 ThreadableTest.__init__(self)
1023
1024 def clientSetUp(self):
1025 pass
1026
1027 def clientTearDown(self):
1028 self.cli.close()
1029 self.cli = None
1030 ThreadableTest.clientTearDown(self)
1031
Facundo Batista07c78be2007-03-23 18:54:07 +00001032 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001033 conn, addr = self.serv.accept()
1034 time.sleep(3)
1035 conn.send("done!")
1036 testOutsideTimeout = testInsideTimeout
1037
1038 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001039 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001040 data = sock.recv(5)
1041 self.assertEqual(data, "done!")
1042
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001043 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001044 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Facundo Batista07c78be2007-03-23 18:54:07 +00001045 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
1046
1047
Georg Brandldd7b0522007-01-21 10:35:10 +00001048class Urllib2FileobjectTest(unittest.TestCase):
1049
1050 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1051 # it close the socket if the close c'tor argument is true
1052
1053 def testClose(self):
1054 class MockSocket:
1055 closed = False
1056 def flush(self): pass
1057 def close(self): self.closed = True
1058
1059 # must not close unless we request it: the original use of _fileobject
1060 # by module socket requires that the underlying socket not be closed until
1061 # the _socketobject that created the _fileobject is closed
1062 s = MockSocket()
1063 f = socket._fileobject(s)
1064 f.close()
1065 self.assert_(not s.closed)
1066
1067 s = MockSocket()
1068 f = socket._fileobject(s, close=True)
1069 f.close()
1070 self.assert_(s.closed)
1071
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001072class TCPTimeoutTest(SocketTCPTest):
1073
1074 def testTCPTimeout(self):
1075 def raise_timeout(*args, **kwargs):
1076 self.serv.settimeout(1.0)
1077 self.serv.accept()
1078 self.failUnlessRaises(socket.timeout, raise_timeout,
1079 "Error generating a timeout exception (TCP)")
1080
1081 def testTimeoutZero(self):
1082 ok = False
1083 try:
1084 self.serv.settimeout(0.0)
1085 foo = self.serv.accept()
1086 except socket.timeout:
1087 self.fail("caught timeout instead of error (TCP)")
1088 except socket.error:
1089 ok = True
1090 except:
1091 self.fail("caught unexpected exception (TCP)")
1092 if not ok:
1093 self.fail("accept() returned success when we did not expect it")
1094
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001095 def testInterruptedTimeout(self):
1096 # XXX I don't know how to do this test on MSWindows or any other
1097 # plaform that doesn't support signal.alarm() or os.kill(), though
1098 # the bug should have existed on all platforms.
1099 if not hasattr(signal, "alarm"):
1100 return # can only test on *nix
1101 self.serv.settimeout(5.0) # must be longer than alarm
1102 class Alarm(Exception):
1103 pass
1104 def alarm_handler(signal, frame):
1105 raise Alarm
1106 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1107 try:
1108 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1109 try:
1110 foo = self.serv.accept()
1111 except socket.timeout:
1112 self.fail("caught timeout instead of Alarm")
1113 except Alarm:
1114 pass
1115 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001116 self.fail("caught other exception instead of Alarm:"
1117 " %s(%s):\n%s" %
1118 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001119 else:
1120 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001121 finally:
1122 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001123 except Alarm:
1124 self.fail("got Alarm in wrong place")
1125 finally:
1126 # no alarm can be pending. Safe to restore old handler.
1127 signal.signal(signal.SIGALRM, old_alarm)
1128
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001129class UDPTimeoutTest(SocketTCPTest):
1130
1131 def testUDPTimeout(self):
1132 def raise_timeout(*args, **kwargs):
1133 self.serv.settimeout(1.0)
1134 self.serv.recv(1024)
1135 self.failUnlessRaises(socket.timeout, raise_timeout,
1136 "Error generating a timeout exception (UDP)")
1137
1138 def testTimeoutZero(self):
1139 ok = False
1140 try:
1141 self.serv.settimeout(0.0)
1142 foo = self.serv.recv(1024)
1143 except socket.timeout:
1144 self.fail("caught timeout instead of error (UDP)")
1145 except socket.error:
1146 ok = True
1147 except:
1148 self.fail("caught unexpected exception (UDP)")
1149 if not ok:
1150 self.fail("recv() returned success when we did not expect it")
1151
1152class TestExceptions(unittest.TestCase):
1153
1154 def testExceptionTree(self):
1155 self.assert_(issubclass(socket.error, Exception))
1156 self.assert_(issubclass(socket.herror, socket.error))
1157 self.assert_(issubclass(socket.gaierror, socket.error))
1158 self.assert_(issubclass(socket.timeout, socket.error))
1159
Armin Rigoa9017c32006-04-19 11:50:27 +00001160class TestLinuxAbstractNamespace(unittest.TestCase):
1161
1162 UNIX_PATH_MAX = 108
1163
1164 def testLinuxAbstractNamespace(self):
1165 address = "\x00python-test-hello\x00\xff"
1166 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1167 s1.bind(address)
1168 s1.listen(1)
1169 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1170 s2.connect(s1.getsockname())
1171 s1.accept()
1172 self.assertEqual(s1.getsockname(), address)
1173 self.assertEqual(s2.getpeername(), address)
1174
1175 def testMaxName(self):
1176 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1177 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1178 s.bind(address)
1179 self.assertEqual(s.getsockname(), address)
1180
1181 def testNameOverflow(self):
1182 address = "\x00" + "h" * self.UNIX_PATH_MAX
1183 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1184 self.assertRaises(socket.error, s.bind, address)
1185
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001186
Martin Blais2856e5f2006-05-26 12:03:27 +00001187class BufferIOTest(SocketConnectedTest):
1188 """
1189 Test the buffer versions of socket.recv() and socket.send().
1190 """
1191 def __init__(self, methodName='runTest'):
1192 SocketConnectedTest.__init__(self, methodName=methodName)
1193
Martin Blaisaf2ae722006-06-04 13:49:49 +00001194 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001195 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001196 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001197 self.assertEqual(nbytes, len(MSG))
1198 msg = buf.tostring()[:len(MSG)]
1199 self.assertEqual(msg, MSG)
1200
Martin Blaisaf2ae722006-06-04 13:49:49 +00001201 def _testRecvInto(self):
Ezio Melottia65e2af2010-08-02 19:56:05 +00001202 with test_support._check_py3k_warnings():
1203 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001204 self.serv_conn.send(buf)
1205
Martin Blaisaf2ae722006-06-04 13:49:49 +00001206 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001207 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001208 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001209 self.assertEqual(nbytes, len(MSG))
1210 msg = buf.tostring()[:len(MSG)]
1211 self.assertEqual(msg, MSG)
1212
Martin Blaisaf2ae722006-06-04 13:49:49 +00001213 def _testRecvFromInto(self):
Ezio Melottia65e2af2010-08-02 19:56:05 +00001214 with test_support._check_py3k_warnings():
1215 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001216 self.serv_conn.send(buf)
1217
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001218
1219TIPC_STYPE = 2000
1220TIPC_LOWER = 200
1221TIPC_UPPER = 210
1222
1223def isTipcAvailable():
1224 """Check if the TIPC module is loaded
1225
1226 The TIPC module is not loaded automatically on Ubuntu and probably
1227 other Linux distros.
1228 """
1229 if not hasattr(socket, "AF_TIPC"):
1230 return False
1231 if not os.path.isfile("/proc/modules"):
1232 return False
1233 with open("/proc/modules") as f:
1234 for line in f:
1235 if line.startswith("tipc "):
1236 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001237 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001238 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1239 return False
1240
1241class TIPCTest (unittest.TestCase):
1242 def testRDM(self):
1243 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1244 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1245
1246 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1247 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1248 TIPC_LOWER, TIPC_UPPER)
1249 srv.bind(srvaddr)
1250
1251 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1252 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1253 cli.sendto(MSG, sendaddr)
1254
1255 msg, recvaddr = srv.recvfrom(1024)
1256
1257 self.assertEqual(cli.getsockname(), recvaddr)
1258 self.assertEqual(msg, MSG)
1259
1260
1261class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1262 def __init__(self, methodName = 'runTest'):
1263 unittest.TestCase.__init__(self, methodName = methodName)
1264 ThreadableTest.__init__(self)
1265
1266 def setUp(self):
1267 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1268 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1269 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1270 TIPC_LOWER, TIPC_UPPER)
1271 self.srv.bind(srvaddr)
1272 self.srv.listen(5)
1273 self.serverExplicitReady()
1274 self.conn, self.connaddr = self.srv.accept()
1275
1276 def clientSetUp(self):
1277 # The is a hittable race between serverExplicitReady() and the
1278 # accept() call; sleep a little while to avoid it, otherwise
1279 # we could get an exception
1280 time.sleep(0.1)
1281 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1282 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1283 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1284 self.cli.connect(addr)
1285 self.cliaddr = self.cli.getsockname()
1286
1287 def testStream(self):
1288 msg = self.conn.recv(1024)
1289 self.assertEqual(msg, MSG)
1290 self.assertEqual(self.cliaddr, self.connaddr)
1291
1292 def _testStream(self):
1293 self.cli.send(MSG)
1294 self.cli.close()
1295
1296
Guido van Rossumb995eb72002-07-31 16:08:40 +00001297def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001298 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001299 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001300 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001301 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001302
1303 tests.extend([
1304 NonBlockingTCPTests,
1305 FileObjectClassTestCase,
Jean-Paul Calderonec28d5542010-05-23 15:22:08 +00001306 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001307 UnbufferedFileObjectClassTestCase,
1308 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001309 SmallBufferedFileObjectClassTestCase,
1310 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001311 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001312 NetworkConnectionAttributesTest,
1313 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001314 ])
Dave Cole331708b2004-08-09 04:51:41 +00001315 if hasattr(socket, "socketpair"):
1316 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001317 if sys.platform == 'linux2':
1318 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001319 if isTipcAvailable():
1320 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001321 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001322
1323 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001324 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001325 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001326
1327if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001328 test_main()