blob: 2387029580c8a650fefb86008bcfa0e383cbcca0 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00002from test import test_support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Trent Nelsone41b0062008-04-08 23:47:30 +00004import errno
Charles-François Natali5a1427c2014-07-26 13:44:50 +01005import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00008import time
9import traceback
Georg Brandla6168f92008-05-25 07:20:14 +000010import 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
Antoine Pitrouc818ed42010-09-07 21:40:25 +000014import contextlib
Neal Norwitz9b0ca792006-08-02 06:46:21 +000015import signal
Antoine Pitrou66b5df62010-09-27 18:16:46 +000016import math
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -040017import weakref
Victor Stinner0a649c72014-07-26 14:52:55 +020018try:
19 import _socket
20except ImportError:
21 _socket = None
22
Barry Warsawcf3d4b51997-01-03 20:03:32 +000023
Giampaolo Rodolà633e4742010-08-14 17:04:46 +000024def try_address(host, port=0, family=socket.AF_INET):
25 """Try to bind a socket on the given host:port and return True
26 if that has been possible."""
27 try:
28 sock = socket.socket(family, socket.SOCK_STREAM)
29 sock.bind((host, port))
30 except (socket.error, socket.gaierror):
31 return False
32 else:
33 sock.close()
34 return True
35
36HOST = test_support.HOST
37MSG = b'Michael Gilfix was here\n'
38SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
39
Victor Stinner6a102812010-04-27 23:55:59 +000040try:
41 import thread
42 import threading
43except ImportError:
44 thread = None
45 threading = None
46
Trent Nelsone41b0062008-04-08 23:47:30 +000047HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000048MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Guido van Rossum24e4af82002-06-12 19:18:08 +000050class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000051
Guido van Rossum24e4af82002-06-12 19:18:08 +000052 def setUp(self):
53 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000054 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000055 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000056
Guido van Rossum24e4af82002-06-12 19:18:08 +000057 def tearDown(self):
58 self.serv.close()
59 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000060
Guido van Rossum24e4af82002-06-12 19:18:08 +000061class SocketUDPTest(unittest.TestCase):
62
63 def setUp(self):
64 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000065 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000066
67 def tearDown(self):
68 self.serv.close()
69 self.serv = None
70
71class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000072 """Threadable Test class
73
74 The ThreadableTest class makes it easy to create a threaded
75 client/server pair from an existing unit test. To create a
76 new threaded class from an existing unit test, use multiple
77 inheritance:
78
79 class NewClass (OldClass, ThreadableTest):
80 pass
81
82 This class defines two new fixture functions with obvious
83 purposes for overriding:
84
85 clientSetUp ()
86 clientTearDown ()
87
88 Any new test functions within the class must then define
Martin Panterb1d867f2016-05-26 05:28:50 +000089 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000090 '_' to indicate the client portion of the test. Ex:
91
92 def testFoo(self):
93 # Server portion
94
95 def _testFoo(self):
96 # Client portion
97
98 Any exceptions raised by the clients during their tests
99 are caught and transferred to the main thread to alert
100 the testing framework.
101
102 Note, the server setup function cannot call any blocking
103 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +0000104 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000105 the blocking call (such as in setting up a client/server
106 connection and performing the accept() in setUp().
107 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000108
109 def __init__(self):
110 # Swap the true setup function
111 self.__setUp = self.setUp
112 self.__tearDown = self.tearDown
113 self.setUp = self._setUp
114 self.tearDown = self._tearDown
115
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000116 def serverExplicitReady(self):
117 """This method allows the server to explicitly indicate that
118 it wants the client thread to proceed. This is useful if the
119 server is about to execute a blocking routine that is
120 dependent upon the client thread during its setup routine."""
121 self.server_ready.set()
122
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000124 self.server_ready = threading.Event()
125 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000126 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +0000127 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000128
129 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000130 methodname = self.id()
131 i = methodname.rfind('.')
132 methodname = methodname[i+1:]
133 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000134 self.client_thread = thread.start_new_thread(
135 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000138 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000139 self.server_ready.set()
140 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000141
142 def _tearDown(self):
143 self.__tearDown()
144 self.done.wait()
145
146 if not self.queue.empty():
147 msg = self.queue.get()
148 self.fail(msg)
149
150 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000151 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000152 self.clientSetUp()
Charles-François Natali21565942011-09-21 22:02:27 +0200153 self.client_ready.set()
Ezio Melottib22c3fe2011-11-06 17:50:52 +0200154 if not callable(test_func):
155 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156 try:
157 test_func()
158 except Exception, strerror:
159 self.queue.put(strerror)
160 self.clientTearDown()
161
162 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000163 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000164
165 def clientTearDown(self):
166 self.done.set()
167 thread.exit()
168
169class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
170
171 def __init__(self, methodName='runTest'):
172 SocketTCPTest.__init__(self, methodName=methodName)
173 ThreadableTest.__init__(self)
174
175 def clientSetUp(self):
176 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
177
178 def clientTearDown(self):
179 self.cli.close()
180 self.cli = None
181 ThreadableTest.clientTearDown(self)
182
183class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
184
185 def __init__(self, methodName='runTest'):
186 SocketUDPTest.__init__(self, methodName=methodName)
187 ThreadableTest.__init__(self)
188
189 def clientSetUp(self):
190 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
191
Brian Curtindd8564f2010-11-04 03:54:23 +0000192 def clientTearDown(self):
193 self.cli.close()
194 self.cli = None
195 ThreadableTest.clientTearDown(self)
196
Guido van Rossum24e4af82002-06-12 19:18:08 +0000197class SocketConnectedTest(ThreadedTCPSocketTest):
198
199 def __init__(self, methodName='runTest'):
200 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
201
202 def setUp(self):
203 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000204 # Indicate explicitly we're ready for the client thread to
205 # proceed and then perform the blocking call to accept
206 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000207 conn, addr = self.serv.accept()
208 self.cli_conn = conn
209
210 def tearDown(self):
211 self.cli_conn.close()
212 self.cli_conn = None
213 ThreadedTCPSocketTest.tearDown(self)
214
215 def clientSetUp(self):
216 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000217 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000218 self.serv_conn = self.cli
219
220 def clientTearDown(self):
221 self.serv_conn.close()
222 self.serv_conn = None
223 ThreadedTCPSocketTest.clientTearDown(self)
224
Dave Cole331708b2004-08-09 04:51:41 +0000225class SocketPairTest(unittest.TestCase, ThreadableTest):
226
227 def __init__(self, methodName='runTest'):
228 unittest.TestCase.__init__(self, methodName=methodName)
229 ThreadableTest.__init__(self)
230
231 def setUp(self):
232 self.serv, self.cli = socket.socketpair()
233
234 def tearDown(self):
235 self.serv.close()
236 self.serv = None
237
238 def clientSetUp(self):
239 pass
240
241 def clientTearDown(self):
242 self.cli.close()
243 self.cli = None
244 ThreadableTest.clientTearDown(self)
245
Tim Peters494aaee2004-08-09 18:54:11 +0000246
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247#######################################################################
248## Begin Tests
249
250class GeneralModuleTests(unittest.TestCase):
251
Victor Stinner0a649c72014-07-26 14:52:55 +0200252 @unittest.skipUnless(_socket is not None, 'need _socket module')
253 def test_csocket_repr(self):
254 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
255 try:
256 expected = ('<socket object, fd=%s, family=%s, type=%s, protocol=%s>'
257 % (s.fileno(), s.family, s.type, s.proto))
258 self.assertEqual(repr(s), expected)
259 finally:
260 s.close()
261 expected = ('<socket object, fd=-1, family=%s, type=%s, protocol=%s>'
262 % (s.family, s.type, s.proto))
263 self.assertEqual(repr(s), expected)
264
Raymond Hettinger027bb632004-05-31 03:09:25 +0000265 def test_weakref(self):
266 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -0400267 p = weakref.proxy(s)
Raymond Hettinger027bb632004-05-31 03:09:25 +0000268 self.assertEqual(p.fileno(), s.fileno())
269 s.close()
270 s = None
271 try:
272 p.fileno()
273 except ReferenceError:
274 pass
275 else:
276 self.fail('Socket proxy still exists')
277
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -0400278 def test_weakref__sock(self):
279 s = socket.socket()._sock
280 w = weakref.ref(s)
281 self.assertIs(w(), s)
282 del s
283 test_support.gc_collect()
284 self.assertIsNone(w())
285
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000287 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288 def raise_error(*args, **kwargs):
289 raise socket.error
290 def raise_herror(*args, **kwargs):
291 raise socket.herror
292 def raise_gaierror(*args, **kwargs):
293 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000294 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000295 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000296 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000297 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000298 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000299 "Error raising socket exception.")
300
Ezio Melotti0639be62011-05-07 19:21:22 +0300301 def testSendtoErrors(self):
302 # Testing that sendto doens't masks failures. See #10169.
303 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
304 self.addCleanup(s.close)
305 s.bind(('', 0))
306 sockname = s.getsockname()
307 # 2 args
308 with self.assertRaises(UnicodeEncodeError):
309 s.sendto(u'\u2620', sockname)
310 with self.assertRaises(TypeError) as cm:
311 s.sendto(5j, sockname)
312 self.assertIn('not complex', str(cm.exception))
313 with self.assertRaises(TypeError) as cm:
314 s.sendto('foo', None)
315 self.assertIn('not NoneType', str(cm.exception))
316 # 3 args
317 with self.assertRaises(UnicodeEncodeError):
318 s.sendto(u'\u2620', 0, sockname)
319 with self.assertRaises(TypeError) as cm:
320 s.sendto(5j, 0, sockname)
321 self.assertIn('not complex', str(cm.exception))
322 with self.assertRaises(TypeError) as cm:
323 s.sendto('foo', 0, None)
324 self.assertIn('not NoneType', str(cm.exception))
325 with self.assertRaises(TypeError) as cm:
326 s.sendto('foo', 'bar', sockname)
327 self.assertIn('an integer is required', str(cm.exception))
328 with self.assertRaises(TypeError) as cm:
329 s.sendto('foo', None, None)
330 self.assertIn('an integer is required', str(cm.exception))
331 # wrong number of args
332 with self.assertRaises(TypeError) as cm:
333 s.sendto('foo')
334 self.assertIn('(1 given)', str(cm.exception))
335 with self.assertRaises(TypeError) as cm:
336 s.sendto('foo', 0, sockname, 4)
337 self.assertIn('(4 given)', str(cm.exception))
338
339
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000341 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000342 socket.AF_INET
343 socket.SOCK_STREAM
344 socket.SOCK_DGRAM
345 socket.SOCK_RAW
346 socket.SOCK_RDM
347 socket.SOCK_SEQPACKET
348 socket.SOL_SOCKET
349 socket.SO_REUSEADDR
350
Guido van Rossum654c11e2002-06-13 20:24:17 +0000351 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000352 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000353 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000354 try:
355 ip = socket.gethostbyname(hostname)
356 except socket.error:
357 # Probably name lookup wasn't set up right; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600358 self.skipTest('name lookup failure')
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000359 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000360 try:
361 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
362 except socket.error:
363 # Probably a similar problem as above; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600364 self.skipTest('address lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000365 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000366 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000367 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000368 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000369
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200370 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
371 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000372 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000373 # Testing reference count for getnameinfo
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200374 try:
375 # On some versions, this loses a reference
376 orig = sys.getrefcount(__name__)
377 socket.getnameinfo(__name__,0)
378 except TypeError:
379 self.assertEqual(sys.getrefcount(__name__), orig,
380 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000381
Guido van Rossum24e4af82002-06-12 19:18:08 +0000382 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000383 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384 try:
385 # On some versions, this crashes the interpreter.
386 socket.getnameinfo(('x', 0, 0, 0), 0)
387 except socket.error:
388 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000389
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000390 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000391 # This just checks that htons etc. are their own inverse,
392 # when looking at the lower 16 or 32 bits.
393 sizes = {socket.htonl: 32, socket.ntohl: 32,
394 socket.htons: 16, socket.ntohs: 16}
395 for func, size in sizes.items():
396 mask = (1L<<size) - 1
397 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
398 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000399
Guido van Rossuma2627af2002-09-14 00:58:46 +0000400 swapped = func(mask)
401 self.assertEqual(swapped & mask, mask)
402 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000403
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000404 def testNtoHErrors(self):
405 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
406 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
407 for k in good_values:
408 socket.ntohl(k)
409 socket.ntohs(k)
410 socket.htonl(k)
411 socket.htons(k)
412 for k in bad_values:
413 self.assertRaises(OverflowError, socket.ntohl, k)
414 self.assertRaises(OverflowError, socket.ntohs, k)
415 self.assertRaises(OverflowError, socket.htonl, k)
416 self.assertRaises(OverflowError, socket.htons, k)
417
Barry Warsaw11b91a02004-06-28 00:50:43 +0000418 def testGetServBy(self):
419 eq = self.assertEqual
420 # Find one service that exists, then check all the related interfaces.
421 # I've ordered this by protocols that have both a tcp and udp
422 # protocol, at least for modern Linuxes.
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000423 if (sys.platform.startswith('linux') or
424 sys.platform.startswith('freebsd') or
425 sys.platform.startswith('netbsd') or
426 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000427 # avoid the 'echo' service on this platform, as there is an
428 # assumption breaking non-standard port/protocol entry
429 services = ('daytime', 'qotd', 'domain')
430 else:
431 services = ('echo', 'daytime', 'domain')
432 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000433 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000434 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000435 break
436 except socket.error:
437 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000438 else:
439 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000440 # Try same call with optional protocol omitted
441 port2 = socket.getservbyname(service)
442 eq(port, port2)
Terry Jan Reedya70f60a2013-03-11 17:56:17 -0400443 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000444 try:
445 udpport = socket.getservbyname(service, 'udp')
446 except socket.error:
447 udpport = None
448 else:
449 eq(udpport, port)
450 # Now make sure the lookup by port returns the same service name
451 eq(socket.getservbyport(port2), service)
452 eq(socket.getservbyport(port, 'tcp'), service)
453 if udpport is not None:
454 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000455 # Make sure getservbyport does not accept out of range ports.
456 self.assertRaises(OverflowError, socket.getservbyport, -1)
457 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000458
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000459 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000460 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000461 # The default timeout should initially be None
462 self.assertEqual(socket.getdefaulttimeout(), None)
463 s = socket.socket()
464 self.assertEqual(s.gettimeout(), None)
465 s.close()
466
467 # Set the default timeout to 10, and see if it propagates
468 socket.setdefaulttimeout(10)
469 self.assertEqual(socket.getdefaulttimeout(), 10)
470 s = socket.socket()
471 self.assertEqual(s.gettimeout(), 10)
472 s.close()
473
474 # Reset the default timeout to None, and see if it propagates
475 socket.setdefaulttimeout(None)
476 self.assertEqual(socket.getdefaulttimeout(), None)
477 s = socket.socket()
478 self.assertEqual(s.gettimeout(), None)
479 s.close()
480
481 # Check that setting it to an invalid value raises ValueError
482 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
483
484 # Check that setting it to an invalid type raises TypeError
485 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
486
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200487 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
488 'test needs socket.inet_aton()')
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000489 def testIPv4_inet_aton_fourbytes(self):
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000490 # Test that issue1008086 and issue767150 are fixed.
491 # It must return 4 bytes.
Ezio Melotti2623a372010-11-21 13:34:58 +0000492 self.assertEqual('\x00'*4, socket.inet_aton('0.0.0.0'))
493 self.assertEqual('\xff'*4, socket.inet_aton('255.255.255.255'))
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000494
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200495 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
496 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000497 def testIPv4toString(self):
498 from socket import inet_aton as f, inet_pton, AF_INET
499 g = lambda a: inet_pton(AF_INET, a)
500
Ezio Melotti2623a372010-11-21 13:34:58 +0000501 self.assertEqual('\x00\x00\x00\x00', f('0.0.0.0'))
502 self.assertEqual('\xff\x00\xff\x00', f('255.0.255.0'))
503 self.assertEqual('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
504 self.assertEqual('\x01\x02\x03\x04', f('1.2.3.4'))
505 self.assertEqual('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000506
Ezio Melotti2623a372010-11-21 13:34:58 +0000507 self.assertEqual('\x00\x00\x00\x00', g('0.0.0.0'))
508 self.assertEqual('\xff\x00\xff\x00', g('255.0.255.0'))
509 self.assertEqual('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
510 self.assertEqual('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000511
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200512 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
513 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000514 def testIPv6toString(self):
515 try:
516 from socket import inet_pton, AF_INET6, has_ipv6
517 if not has_ipv6:
Zachary Ware1f702212013-12-10 14:09:20 -0600518 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000519 except ImportError:
Zachary Ware1f702212013-12-10 14:09:20 -0600520 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000521 f = lambda a: inet_pton(AF_INET6, a)
522
Ezio Melotti2623a372010-11-21 13:34:58 +0000523 self.assertEqual('\x00' * 16, f('::'))
524 self.assertEqual('\x00' * 16, f('0::0'))
525 self.assertEqual('\x00\x01' + '\x00' * 14, f('1::'))
526 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000527 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
528 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
529 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000530
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200531 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
532 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000533 def testStringToIPv4(self):
534 from socket import inet_ntoa as f, inet_ntop, AF_INET
535 g = lambda a: inet_ntop(AF_INET, a)
536
Ezio Melotti2623a372010-11-21 13:34:58 +0000537 self.assertEqual('1.0.1.0', f('\x01\x00\x01\x00'))
538 self.assertEqual('170.85.170.85', f('\xaa\x55\xaa\x55'))
539 self.assertEqual('255.255.255.255', f('\xff\xff\xff\xff'))
540 self.assertEqual('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000541
Ezio Melotti2623a372010-11-21 13:34:58 +0000542 self.assertEqual('1.0.1.0', g('\x01\x00\x01\x00'))
543 self.assertEqual('170.85.170.85', g('\xaa\x55\xaa\x55'))
544 self.assertEqual('255.255.255.255', g('\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000545
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200546 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
547 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000548 def testStringToIPv6(self):
549 try:
550 from socket import inet_ntop, AF_INET6, has_ipv6
551 if not has_ipv6:
Zachary Ware1f702212013-12-10 14:09:20 -0600552 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000553 except ImportError:
Zachary Ware1f702212013-12-10 14:09:20 -0600554 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000555 f = lambda a: inet_ntop(AF_INET6, a)
556
Ezio Melotti2623a372010-11-21 13:34:58 +0000557 self.assertEqual('::', f('\x00' * 16))
558 self.assertEqual('::1', f('\x00' * 15 + '\x01'))
559 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000560 'aef:b01:506:1001:ffff:9997:55:170',
561 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
562 )
563
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000564 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000565
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000566 def _get_unused_port(self, bind_address='0.0.0.0'):
567 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000568
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000569 Args:
570 bind_address: Hostname or IP address to search for a port on.
571
572 Returns: A most likely to be unused port.
573 """
574 tempsock = socket.socket()
575 tempsock.bind((bind_address, 0))
576 host, port = tempsock.getsockname()
577 tempsock.close()
578 return port
579
580 def testSockName(self):
581 # Testing getsockname()
582 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000583 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000584 self.addCleanup(sock.close)
Trent Nelsone41b0062008-04-08 23:47:30 +0000585 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000586 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000587 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
588 # it reasonable to get the host's addr in addition to 0.0.0.0.
589 # At least for eCos. This is required for the S/390 to pass.
Georg Brandlb7276502010-11-26 08:28:05 +0000590 try:
591 my_ip_addr = socket.gethostbyname(socket.gethostname())
592 except socket.error:
593 # Probably name lookup wasn't set up right; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600594 self.skipTest('name lookup failure')
Ezio Melottiaa980582010-01-23 23:04:36 +0000595 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000596 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597
598 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000599 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000600 # We know a socket should start without reuse==0
601 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000602 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000603 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000604 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000605
606 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000607 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000608 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000609 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000610 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
611 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000612 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000614 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000615 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000616 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
617 sock.settimeout(1)
618 sock.close()
619 self.assertRaises(socket.error, sock.send, "spam")
620
Georg Brandlbb03ac02006-03-21 18:17:25 +0000621 def testNewAttributes(self):
622 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000623 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000624 self.assertEqual(sock.family, socket.AF_INET)
625 self.assertEqual(sock.type, socket.SOCK_STREAM)
626 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000627 sock.close()
628
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000629 def test_getsockaddrarg(self):
Charles-François Natali5a1427c2014-07-26 13:44:50 +0100630 sock = socket.socket()
631 self.addCleanup(sock.close)
632 port = test_support.find_unused_port()
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000633 big_port = port + 65536
634 neg_port = port - 65536
Charles-François Natali5a1427c2014-07-26 13:44:50 +0100635 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
636 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
637 # Since find_unused_port() is inherently subject to race conditions, we
638 # call it a couple times if necessary.
639 for i in itertools.count():
640 port = test_support.find_unused_port()
641 try:
642 sock.bind((HOST, port))
643 except OSError as e:
644 if e.errno != errno.EADDRINUSE or i == 5:
645 raise
646 else:
647 break
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000648
Brian Curtin91a5b812010-11-05 15:52:20 +0000649 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesa47b75b2008-01-04 15:48:06 +0000650 def test_sock_ioctl(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000651 self.assertTrue(hasattr(socket.socket, 'ioctl'))
652 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
653 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
654 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000655 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
656 s = socket.socket()
Brian Curtin91a5b812010-11-05 15:52:20 +0000657 self.addCleanup(s.close)
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000658 self.assertRaises(ValueError, s.ioctl, -1, None)
659 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000660
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000661 def testGetaddrinfo(self):
662 try:
663 socket.getaddrinfo('localhost', 80)
664 except socket.gaierror as err:
665 if err.errno == socket.EAI_SERVICE:
666 # see http://bugs.python.org/issue1282647
667 self.skipTest("buggy libc version")
668 raise
669 # len of every sequence is supposed to be == 5
670 for info in socket.getaddrinfo(HOST, None):
671 self.assertEqual(len(info), 5)
672 # host can be a domain name, a string representation of an
673 # IPv4/v6 address or None
674 socket.getaddrinfo('localhost', 80)
675 socket.getaddrinfo('127.0.0.1', 80)
676 socket.getaddrinfo(None, 80)
677 if SUPPORTS_IPV6:
678 socket.getaddrinfo('::1', 80)
679 # port can be a string service name such as "http", a numeric
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200680 # port number (int or long), or None
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000681 socket.getaddrinfo(HOST, "http")
682 socket.getaddrinfo(HOST, 80)
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200683 socket.getaddrinfo(HOST, 80L)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000684 socket.getaddrinfo(HOST, None)
685 # test family and socktype filters
686 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
687 for family, _, _, _, _ in infos:
688 self.assertEqual(family, socket.AF_INET)
689 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
690 for _, socktype, _, _, _ in infos:
691 self.assertEqual(socktype, socket.SOCK_STREAM)
692 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000693 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000694 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
695 # a server willing to support both IPv4 and IPv6 will
696 # usually do this
697 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
698 socket.AI_PASSIVE)
699
Ned Deilye789a1d2014-02-13 22:49:30 -0800700 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussoren0e6283e2013-06-10 10:35:36 +0200701 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilye789a1d2014-02-13 22:49:30 -0800702 try:
703 # The arguments here are undefined and the call may succeed
704 # or fail. All we care here is that it doesn't segfault.
705 socket.getaddrinfo("localhost", None, 0, 0, 0,
706 socket.AI_NUMERICSERV)
707 except socket.gaierror:
708 pass
Christian Heimesa47b75b2008-01-04 15:48:06 +0000709
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000710 def check_sendall_interrupted(self, with_timeout):
711 # socketpair() is not stricly required, but it makes things easier.
712 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
713 self.skipTest("signal.alarm and socket.socketpair required for this test")
714 # Our signal handlers clobber the C errno by calling a math function
715 # with an invalid domain value.
716 def ok_handler(*args):
717 self.assertRaises(ValueError, math.acosh, 0)
718 def raising_handler(*args):
719 self.assertRaises(ValueError, math.acosh, 0)
720 1 // 0
721 c, s = socket.socketpair()
722 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
723 try:
724 if with_timeout:
725 # Just above the one second minimum for signal.alarm
726 c.settimeout(1.5)
727 with self.assertRaises(ZeroDivisionError):
728 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200729 c.sendall(b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000730 if with_timeout:
731 signal.signal(signal.SIGALRM, ok_handler)
732 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200733 self.assertRaises(socket.timeout, c.sendall,
734 b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000735 finally:
736 signal.signal(signal.SIGALRM, old_alarm)
737 c.close()
738 s.close()
739
740 def test_sendall_interrupted(self):
741 self.check_sendall_interrupted(False)
742
743 def test_sendall_interrupted_with_timeout(self):
744 self.check_sendall_interrupted(True)
745
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200746 def test_listen_backlog(self):
747 for backlog in 0, -1:
748 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
749 srv.bind((HOST, 0))
750 srv.listen(backlog)
751 srv.close()
752
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200753 @test_support.cpython_only
754 def test_listen_backlog_overflow(self):
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200755 # Issue 15989
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200756 import _testcapi
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200757 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
758 srv.bind((HOST, 0))
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200759 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200760 srv.close()
761
Charles-François Natali3aa59e32012-01-02 15:38:27 +0100762 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
763 def test_flowinfo(self):
764 self.assertRaises(OverflowError, socket.getnameinfo,
765 ('::1',0, 0xffffffff), 0)
766 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
767 try:
768 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
769 finally:
770 s.close()
771
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000772
Victor Stinner6a102812010-04-27 23:55:59 +0000773@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774class BasicTCPTest(SocketConnectedTest):
775
776 def __init__(self, methodName='runTest'):
777 SocketConnectedTest.__init__(self, methodName=methodName)
778
779 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000780 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000782 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783
784 def _testRecv(self):
785 self.serv_conn.send(MSG)
786
787 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000788 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000789 seg1 = self.cli_conn.recv(len(MSG) - 3)
790 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000791 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000792 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793
794 def _testOverFlowRecv(self):
795 self.serv_conn.send(MSG)
796
797 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000798 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000799 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000800 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000801
802 def _testRecvFrom(self):
803 self.serv_conn.send(MSG)
804
805 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000806 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000807 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
808 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000809 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000810 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811
812 def _testOverFlowRecvFrom(self):
813 self.serv_conn.send(MSG)
814
815 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000816 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000817 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818 while 1:
819 read = self.cli_conn.recv(1024)
820 if not read:
821 break
Guido van Rossume531e292002-08-08 20:28:34 +0000822 msg += read
823 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824
825 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000826 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000827 self.serv_conn.sendall(big_chunk)
828
Zachary Ware1f702212013-12-10 14:09:20 -0600829 @unittest.skipUnless(hasattr(socket, 'fromfd'),
830 'socket.fromfd not availble')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000831 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000832 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000833 fd = self.cli_conn.fileno()
834 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000835 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000837 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838
839 def _testFromFd(self):
840 self.serv_conn.send(MSG)
841
Brian Curtin62c20b62010-11-02 02:59:55 +0000842 def testDup(self):
843 # Testing dup()
844 sock = self.cli_conn.dup()
845 self.addCleanup(sock.close)
846 msg = sock.recv(1024)
847 self.assertEqual(msg, MSG)
848
849 def _testDup(self):
850 self.serv_conn.send(MSG)
851
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000853 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000855 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000856 # wait for _testShutdown to finish: on OS X, when the server
857 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000858 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000859 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860
861 def _testShutdown(self):
862 self.serv_conn.send(MSG)
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200863 self.serv_conn.shutdown(2)
864
865 testShutdown_overflow = test_support.cpython_only(testShutdown)
866
867 @test_support.cpython_only
868 def _testShutdown_overflow(self):
869 import _testcapi
870 self.serv_conn.send(MSG)
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200871 # Issue 15989
872 self.assertRaises(OverflowError, self.serv_conn.shutdown,
873 _testcapi.INT_MAX + 1)
874 self.assertRaises(OverflowError, self.serv_conn.shutdown,
875 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876 self.serv_conn.shutdown(2)
877
Victor Stinner6a102812010-04-27 23:55:59 +0000878@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879class BasicUDPTest(ThreadedUDPSocketTest):
880
881 def __init__(self, methodName='runTest'):
882 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
883
884 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000885 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000887 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888
889 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000890 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000891
Guido van Rossum1c938012002-06-12 21:17:20 +0000892 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000893 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000894 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000895 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000896
Guido van Rossum1c938012002-06-12 21:17:20 +0000897 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000898 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000899
Facundo Batista1fe9f962007-03-28 03:45:20 +0000900 def testRecvFromNegative(self):
901 # Negative lengths passed to recvfrom should give ValueError.
902 self.assertRaises(ValueError, self.serv.recvfrom, -1)
903
904 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000905 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000906
Victor Stinner6a102812010-04-27 23:55:59 +0000907@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000908class TCPCloserTest(ThreadedTCPSocketTest):
909
910 def testClose(self):
911 conn, addr = self.serv.accept()
912 conn.close()
913
914 sd = self.cli
915 read, write, err = select.select([sd], [], [], 1.0)
916 self.assertEqual(read, [sd])
917 self.assertEqual(sd.recv(1), '')
918
919 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000920 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000921 time.sleep(1.0)
922
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200923@unittest.skipUnless(hasattr(socket, 'socketpair'),
924 'test needs socket.socketpair()')
Victor Stinner6a102812010-04-27 23:55:59 +0000925@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000926class BasicSocketPairTest(SocketPairTest):
927
928 def __init__(self, methodName='runTest'):
929 SocketPairTest.__init__(self, methodName=methodName)
930
931 def testRecv(self):
932 msg = self.serv.recv(1024)
933 self.assertEqual(msg, MSG)
934
935 def _testRecv(self):
936 self.cli.send(MSG)
937
938 def testSend(self):
939 self.serv.send(MSG)
940
941 def _testSend(self):
942 msg = self.cli.recv(1024)
943 self.assertEqual(msg, MSG)
944
Victor Stinner6a102812010-04-27 23:55:59 +0000945@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000946class NonBlockingTCPTests(ThreadedTCPSocketTest):
947
948 def __init__(self, methodName='runTest'):
949 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
950
951 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000952 # Testing whether set blocking works
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200953 self.serv.setblocking(True)
954 self.assertIsNone(self.serv.gettimeout())
955 self.serv.setblocking(False)
956 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000957 start = time.time()
958 try:
959 self.serv.accept()
960 except socket.error:
961 pass
962 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000963 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000964
965 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000966 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000967
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200968 @test_support.cpython_only
969 def testSetBlocking_overflow(self):
970 # Issue 15989
971 import _testcapi
972 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
973 self.skipTest('needs UINT_MAX < ULONG_MAX')
974 self.serv.setblocking(False)
975 self.assertEqual(self.serv.gettimeout(), 0.0)
976 self.serv.setblocking(_testcapi.UINT_MAX + 1)
977 self.assertIsNone(self.serv.gettimeout())
978
979 _testSetBlocking_overflow = test_support.cpython_only(_testSetBlocking)
980
Guido van Rossum24e4af82002-06-12 19:18:08 +0000981 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000982 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000983 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000984 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000985 conn, addr = self.serv.accept()
986 except socket.error:
987 pass
988 else:
989 self.fail("Error trying to do non-blocking accept.")
990 read, write, err = select.select([self.serv], [], [])
991 if self.serv in read:
992 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000993 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000994 else:
995 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000996
Guido van Rossum24e4af82002-06-12 19:18:08 +0000997 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000998 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000999 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001000
1001 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001002 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001003 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001004 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001005
1006 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001007 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +00001008 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001009
1010 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001011 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001012 conn, addr = self.serv.accept()
1013 conn.setblocking(0)
1014 try:
1015 msg = conn.recv(len(MSG))
1016 except socket.error:
1017 pass
1018 else:
1019 self.fail("Error trying to do non-blocking recv.")
1020 read, write, err = select.select([conn], [], [])
1021 if conn in read:
1022 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +00001023 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001024 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001025 else:
1026 self.fail("Error during select call to non-blocking socket.")
1027
1028 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001029 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001030 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001031 self.cli.send(MSG)
1032
Victor Stinner6a102812010-04-27 23:55:59 +00001033@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001034class FileObjectClassTestCase(SocketConnectedTest):
1035
Guido van Rossume9f66142002-08-07 15:46:19 +00001036 bufsize = -1 # Use default buffer size
1037
Guido van Rossum24e4af82002-06-12 19:18:08 +00001038 def __init__(self, methodName='runTest'):
1039 SocketConnectedTest.__init__(self, methodName=methodName)
1040
1041 def setUp(self):
1042 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001043 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001044
1045 def tearDown(self):
1046 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001047 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001048 SocketConnectedTest.tearDown(self)
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001049 self.serv_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050
1051 def clientSetUp(self):
1052 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001053 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001054
1055 def clientTearDown(self):
1056 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001057 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058 self.cli_file = None
1059 SocketConnectedTest.clientTearDown(self)
1060
1061 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001062 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001063 first_seg = self.serv_file.read(len(MSG)-3)
1064 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001065 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +00001066 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067
1068 def _testSmallRead(self):
1069 self.cli_file.write(MSG)
1070 self.cli_file.flush()
1071
Guido van Rossum8c943832002-08-08 01:00:28 +00001072 def testFullRead(self):
1073 # read until EOF
1074 msg = self.serv_file.read()
1075 self.assertEqual(msg, MSG)
1076
1077 def _testFullRead(self):
1078 self.cli_file.write(MSG)
1079 self.cli_file.close()
1080
Guido van Rossum24e4af82002-06-12 19:18:08 +00001081 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001082 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001083 buf = ''
1084 while 1:
1085 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001086 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001087 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001088 buf += char
1089 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001090
1091 def _testUnbufferedRead(self):
1092 self.cli_file.write(MSG)
1093 self.cli_file.flush()
1094
1095 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001096 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001098 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001099
1100 def _testReadline(self):
1101 self.cli_file.write(MSG)
1102 self.cli_file.flush()
1103
Gregory P. Smith24237ea2008-05-05 21:53:45 +00001104 def testReadlineAfterRead(self):
1105 a_baloo_is = self.serv_file.read(len("A baloo is"))
1106 self.assertEqual("A baloo is", a_baloo_is)
1107 _a_bear = self.serv_file.read(len(" a bear"))
1108 self.assertEqual(" a bear", _a_bear)
1109 line = self.serv_file.readline()
1110 self.assertEqual("\n", line)
1111 line = self.serv_file.readline()
1112 self.assertEqual("A BALOO IS A BEAR.\n", line)
1113 line = self.serv_file.readline()
1114 self.assertEqual(MSG, line)
1115
1116 def _testReadlineAfterRead(self):
1117 self.cli_file.write("A baloo is a bear\n")
1118 self.cli_file.write("A BALOO IS A BEAR.\n")
1119 self.cli_file.write(MSG)
1120 self.cli_file.flush()
1121
1122 def testReadlineAfterReadNoNewline(self):
1123 end_of_ = self.serv_file.read(len("End Of "))
1124 self.assertEqual("End Of ", end_of_)
1125 line = self.serv_file.readline()
1126 self.assertEqual("Line", line)
1127
1128 def _testReadlineAfterReadNoNewline(self):
1129 self.cli_file.write("End Of Line")
1130
Tim Peters116d83c2004-03-28 02:20:45 +00001131 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001132 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001133
1134 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001135 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001136
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001137
1138class FileObjectInterruptedTestCase(unittest.TestCase):
1139 """Test that the file object correctly handles EINTR internally."""
1140
1141 class MockSocket(object):
1142 def __init__(self, recv_funcs=()):
1143 # A generator that returns callables that we'll call for each
1144 # call to recv().
1145 self._recv_step = iter(recv_funcs)
1146
1147 def recv(self, size):
1148 return self._recv_step.next()()
1149
1150 @staticmethod
1151 def _raise_eintr():
1152 raise socket.error(errno.EINTR)
1153
1154 def _test_readline(self, size=-1, **kwargs):
1155 mock_sock = self.MockSocket(recv_funcs=[
1156 lambda : "This is the first line\nAnd the sec",
1157 self._raise_eintr,
1158 lambda : "ond line is here\n",
1159 lambda : "",
1160 ])
1161 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001162 self.assertEqual(fo.readline(size), "This is the first line\n")
1163 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001164
1165 def _test_read(self, size=-1, **kwargs):
1166 mock_sock = self.MockSocket(recv_funcs=[
1167 lambda : "This is the first line\nAnd the sec",
1168 self._raise_eintr,
1169 lambda : "ond line is here\n",
1170 lambda : "",
1171 ])
1172 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001173 self.assertEqual(fo.read(size), "This is the first line\n"
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001174 "And the second line is here\n")
1175
1176 def test_default(self):
1177 self._test_readline()
1178 self._test_readline(size=100)
1179 self._test_read()
1180 self._test_read(size=100)
1181
1182 def test_with_1k_buffer(self):
1183 self._test_readline(bufsize=1024)
1184 self._test_readline(size=100, bufsize=1024)
1185 self._test_read(bufsize=1024)
1186 self._test_read(size=100, bufsize=1024)
1187
1188 def _test_readline_no_buffer(self, size=-1):
1189 mock_sock = self.MockSocket(recv_funcs=[
1190 lambda : "aa",
1191 lambda : "\n",
1192 lambda : "BB",
1193 self._raise_eintr,
1194 lambda : "bb",
1195 lambda : "",
1196 ])
1197 fo = socket._fileobject(mock_sock, bufsize=0)
Ezio Melotti2623a372010-11-21 13:34:58 +00001198 self.assertEqual(fo.readline(size), "aa\n")
1199 self.assertEqual(fo.readline(size), "BBbb")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001200
1201 def test_no_buffer(self):
1202 self._test_readline_no_buffer()
1203 self._test_readline_no_buffer(size=4)
1204 self._test_read(bufsize=0)
1205 self._test_read(size=100, bufsize=0)
1206
1207
Guido van Rossume9f66142002-08-07 15:46:19 +00001208class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1209
1210 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001211
Guido van Rossume9f66142002-08-07 15:46:19 +00001212 In this case (and in this case only), it should be possible to
1213 create a file object, read a line from it, create another file
1214 object, read another line from it, without loss of data in the
1215 first file object's buffer. Note that httplib relies on this
1216 when reading multiple requests from the same socket."""
1217
1218 bufsize = 0 # Use unbuffered mode
1219
1220 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001221 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001222 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001223 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001224 self.serv_file = self.cli_conn.makefile('rb', 0)
1225 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001226 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001227
1228 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001229 self.cli_file.write("A. " + MSG)
1230 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001231 self.cli_file.flush()
1232
Guido van Rossum8c943832002-08-08 01:00:28 +00001233class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1234
1235 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1236
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001237 class SocketMemo(object):
1238 """A wrapper to keep track of sent data, needed to examine write behaviour"""
1239 def __init__(self, sock):
1240 self._sock = sock
1241 self.sent = []
1242
1243 def send(self, data, flags=0):
1244 n = self._sock.send(data, flags)
1245 self.sent.append(data[:n])
1246 return n
1247
1248 def sendall(self, data, flags=0):
1249 self._sock.sendall(data, flags)
1250 self.sent.append(data)
1251
1252 def __getattr__(self, attr):
1253 return getattr(self._sock, attr)
1254
1255 def getsent(self):
1256 return [e.tobytes() if isinstance(e, memoryview) else e for e in self.sent]
1257
1258 def setUp(self):
1259 FileObjectClassTestCase.setUp(self)
1260 self.serv_file._sock = self.SocketMemo(self.serv_file._sock)
1261
1262 def testLinebufferedWrite(self):
1263 # Write two lines, in small chunks
1264 msg = MSG.strip()
1265 print >> self.serv_file, msg,
1266 print >> self.serv_file, msg
1267
1268 # second line:
1269 print >> self.serv_file, msg,
1270 print >> self.serv_file, msg,
1271 print >> self.serv_file, msg
1272
1273 # third line
1274 print >> self.serv_file, ''
1275
1276 self.serv_file.flush()
1277
1278 msg1 = "%s %s\n"%(msg, msg)
1279 msg2 = "%s %s %s\n"%(msg, msg, msg)
1280 msg3 = "\n"
1281 self.assertEqual(self.serv_file._sock.getsent(), [msg1, msg2, msg3])
1282
1283 def _testLinebufferedWrite(self):
1284 msg = MSG.strip()
1285 msg1 = "%s %s\n"%(msg, msg)
1286 msg2 = "%s %s %s\n"%(msg, msg, msg)
1287 msg3 = "\n"
1288 l1 = self.cli_file.readline()
1289 self.assertEqual(l1, msg1)
1290 l2 = self.cli_file.readline()
1291 self.assertEqual(l2, msg2)
1292 l3 = self.cli_file.readline()
1293 self.assertEqual(l3, msg3)
1294
Guido van Rossum8c943832002-08-08 01:00:28 +00001295
1296class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1297
1298 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001299
Georg Brandldd7b0522007-01-21 10:35:10 +00001300
Facundo Batista07c78be2007-03-23 18:54:07 +00001301class NetworkConnectionTest(object):
1302 """Prove network connection."""
1303 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001304 # We're inherited below by BasicTCPTest2, which also inherits
1305 # BasicTCPTest, which defines self.port referenced below.
1306 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001307 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001308
Facundo Batista07c78be2007-03-23 18:54:07 +00001309class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1310 """Tests that NetworkConnection does not break existing TCP functionality.
1311 """
1312
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001313class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001314 class MockSocket(socket.socket):
1315 def connect(self, *args):
1316 raise socket.timeout('timed out')
1317
1318 @contextlib.contextmanager
1319 def mocked_socket_module(self):
1320 """Return a socket which times out on connect"""
1321 old_socket = socket.socket
1322 socket.socket = self.MockSocket
1323 try:
1324 yield
1325 finally:
1326 socket.socket = old_socket
1327
1328 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001329 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001330 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001331 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001332 with self.assertRaises(socket.error) as cm:
1333 cli.connect((HOST, port))
1334 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1335
1336 def test_create_connection(self):
1337 # Issue #9792: errors raised by create_connection() should have
1338 # a proper errno attribute.
1339 port = test_support.find_unused_port()
1340 with self.assertRaises(socket.error) as cm:
1341 socket.create_connection((HOST, port))
Trent Nelson6a7f8672012-10-18 01:35:32 -04001342
1343 # Issue #16257: create_connection() calls getaddrinfo() against
1344 # 'localhost'. This may result in an IPV6 addr being returned
1345 # as well as an IPV4 one:
1346 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1347 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1348 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1349 #
1350 # create_connection() enumerates through all the addresses returned
1351 # and if it doesn't successfully bind to any of them, it propagates
1352 # the last exception it encountered.
1353 #
1354 # On Solaris, ENETUNREACH is returned in this circumstance instead
1355 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1356 # expected errnos.
1357 expected_errnos = [ errno.ECONNREFUSED, ]
1358 if hasattr(errno, 'ENETUNREACH'):
1359 expected_errnos.append(errno.ENETUNREACH)
1360
1361 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001362
1363 def test_create_connection_timeout(self):
1364 # Issue #9792: create_connection() should not recast timeout errors
1365 # as generic socket errors.
1366 with self.mocked_socket_module():
1367 with self.assertRaises(socket.timeout):
1368 socket.create_connection((HOST, 1234))
1369
Facundo Batista07c78be2007-03-23 18:54:07 +00001370
Victor Stinner6a102812010-04-27 23:55:59 +00001371@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001372class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1373
1374 def __init__(self, methodName='runTest'):
1375 SocketTCPTest.__init__(self, methodName=methodName)
1376 ThreadableTest.__init__(self)
1377
1378 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001379 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001380
1381 def clientTearDown(self):
1382 self.cli.close()
1383 self.cli = None
1384 ThreadableTest.clientTearDown(self)
1385
1386 def _justAccept(self):
1387 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001388 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001389
1390 testFamily = _justAccept
1391 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001392 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001393 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001394 self.assertEqual(self.cli.family, 2)
1395
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001396 testSourceAddress = _justAccept
1397 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001398 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1399 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001400 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001401 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001402 # The port number being used is sufficient to show that the bind()
1403 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001404
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001405 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001406 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001407 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001408 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001409 socket.setdefaulttimeout(42)
1410 try:
1411 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001412 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001413 finally:
1414 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001415 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001416
1417 testTimeoutNone = _justAccept
1418 def _testTimeoutNone(self):
1419 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001420 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001421 socket.setdefaulttimeout(30)
1422 try:
1423 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001424 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001425 finally:
1426 socket.setdefaulttimeout(None)
1427 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001428
1429 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001430 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001431 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001432 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001433
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001434 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001435 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001436 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001437 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001438 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001439
Victor Stinner6a102812010-04-27 23:55:59 +00001440@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001441class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1442
1443 def __init__(self, methodName='runTest'):
1444 SocketTCPTest.__init__(self, methodName=methodName)
1445 ThreadableTest.__init__(self)
1446
1447 def clientSetUp(self):
1448 pass
1449
1450 def clientTearDown(self):
1451 self.cli.close()
1452 self.cli = None
1453 ThreadableTest.clientTearDown(self)
1454
Facundo Batista07c78be2007-03-23 18:54:07 +00001455 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001456 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001457 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001458 time.sleep(3)
1459 conn.send("done!")
1460 testOutsideTimeout = testInsideTimeout
1461
1462 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001463 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001464 data = sock.recv(5)
1465 self.assertEqual(data, "done!")
1466
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001467 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001468 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001469 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001470
1471
Georg Brandldd7b0522007-01-21 10:35:10 +00001472class Urllib2FileobjectTest(unittest.TestCase):
1473
1474 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1475 # it close the socket if the close c'tor argument is true
1476
1477 def testClose(self):
1478 class MockSocket:
1479 closed = False
1480 def flush(self): pass
1481 def close(self): self.closed = True
1482
1483 # must not close unless we request it: the original use of _fileobject
1484 # by module socket requires that the underlying socket not be closed until
1485 # the _socketobject that created the _fileobject is closed
1486 s = MockSocket()
1487 f = socket._fileobject(s)
1488 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001489 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001490
1491 s = MockSocket()
1492 f = socket._fileobject(s, close=True)
1493 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001494 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001495
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001496class TCPTimeoutTest(SocketTCPTest):
1497
1498 def testTCPTimeout(self):
1499 def raise_timeout(*args, **kwargs):
1500 self.serv.settimeout(1.0)
1501 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001502 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001503 "Error generating a timeout exception (TCP)")
1504
1505 def testTimeoutZero(self):
1506 ok = False
1507 try:
1508 self.serv.settimeout(0.0)
1509 foo = self.serv.accept()
1510 except socket.timeout:
1511 self.fail("caught timeout instead of error (TCP)")
1512 except socket.error:
1513 ok = True
1514 except:
1515 self.fail("caught unexpected exception (TCP)")
1516 if not ok:
1517 self.fail("accept() returned success when we did not expect it")
1518
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001519 @unittest.skipUnless(hasattr(signal, 'alarm'),
1520 'test needs signal.alarm()')
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001521 def testInterruptedTimeout(self):
1522 # XXX I don't know how to do this test on MSWindows or any other
1523 # plaform that doesn't support signal.alarm() or os.kill(), though
1524 # the bug should have existed on all platforms.
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001525 self.serv.settimeout(5.0) # must be longer than alarm
1526 class Alarm(Exception):
1527 pass
1528 def alarm_handler(signal, frame):
1529 raise Alarm
1530 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1531 try:
1532 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1533 try:
1534 foo = self.serv.accept()
1535 except socket.timeout:
1536 self.fail("caught timeout instead of Alarm")
1537 except Alarm:
1538 pass
1539 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001540 self.fail("caught other exception instead of Alarm:"
1541 " %s(%s):\n%s" %
1542 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001543 else:
1544 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001545 finally:
1546 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001547 except Alarm:
1548 self.fail("got Alarm in wrong place")
1549 finally:
1550 # no alarm can be pending. Safe to restore old handler.
1551 signal.signal(signal.SIGALRM, old_alarm)
1552
Ezio Melotti169ed592011-11-18 18:33:14 +02001553class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001554
1555 def testUDPTimeout(self):
1556 def raise_timeout(*args, **kwargs):
1557 self.serv.settimeout(1.0)
1558 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001559 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001560 "Error generating a timeout exception (UDP)")
1561
1562 def testTimeoutZero(self):
1563 ok = False
1564 try:
1565 self.serv.settimeout(0.0)
1566 foo = self.serv.recv(1024)
1567 except socket.timeout:
1568 self.fail("caught timeout instead of error (UDP)")
1569 except socket.error:
1570 ok = True
1571 except:
1572 self.fail("caught unexpected exception (UDP)")
1573 if not ok:
1574 self.fail("recv() returned success when we did not expect it")
1575
1576class TestExceptions(unittest.TestCase):
1577
1578 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001579 self.assertTrue(issubclass(socket.error, Exception))
1580 self.assertTrue(issubclass(socket.herror, socket.error))
1581 self.assertTrue(issubclass(socket.gaierror, socket.error))
1582 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001583
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001584@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Armin Rigoa9017c32006-04-19 11:50:27 +00001585class TestLinuxAbstractNamespace(unittest.TestCase):
1586
1587 UNIX_PATH_MAX = 108
1588
1589 def testLinuxAbstractNamespace(self):
1590 address = "\x00python-test-hello\x00\xff"
1591 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1592 s1.bind(address)
1593 s1.listen(1)
1594 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1595 s2.connect(s1.getsockname())
1596 s1.accept()
1597 self.assertEqual(s1.getsockname(), address)
1598 self.assertEqual(s2.getpeername(), address)
1599
1600 def testMaxName(self):
1601 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1602 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1603 s.bind(address)
1604 self.assertEqual(s.getsockname(), address)
1605
1606 def testNameOverflow(self):
1607 address = "\x00" + "h" * self.UNIX_PATH_MAX
1608 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1609 self.assertRaises(socket.error, s.bind, address)
1610
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001611
Victor Stinner6a102812010-04-27 23:55:59 +00001612@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001613class BufferIOTest(SocketConnectedTest):
1614 """
1615 Test the buffer versions of socket.recv() and socket.send().
1616 """
1617 def __init__(self, methodName='runTest'):
1618 SocketConnectedTest.__init__(self, methodName=methodName)
1619
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001620 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001621 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001622 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001623 self.assertEqual(nbytes, len(MSG))
1624 msg = buf.tostring()[:len(MSG)]
1625 self.assertEqual(msg, MSG)
1626
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001627 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001628 with test_support.check_py3k_warnings():
1629 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001630 self.serv_conn.send(buf)
1631
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001632 def testRecvIntoBytearray(self):
1633 buf = bytearray(1024)
1634 nbytes = self.cli_conn.recv_into(buf)
1635 self.assertEqual(nbytes, len(MSG))
1636 msg = buf[:len(MSG)]
1637 self.assertEqual(msg, MSG)
1638
1639 _testRecvIntoBytearray = _testRecvIntoArray
1640
1641 def testRecvIntoMemoryview(self):
1642 buf = bytearray(1024)
1643 nbytes = self.cli_conn.recv_into(memoryview(buf))
1644 self.assertEqual(nbytes, len(MSG))
1645 msg = buf[:len(MSG)]
1646 self.assertEqual(msg, MSG)
1647
1648 _testRecvIntoMemoryview = _testRecvIntoArray
1649
1650 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001651 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001652 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001653 self.assertEqual(nbytes, len(MSG))
1654 msg = buf.tostring()[:len(MSG)]
1655 self.assertEqual(msg, MSG)
1656
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001657 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001658 with test_support.check_py3k_warnings():
1659 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001660 self.serv_conn.send(buf)
1661
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001662 def testRecvFromIntoBytearray(self):
1663 buf = bytearray(1024)
1664 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1665 self.assertEqual(nbytes, len(MSG))
1666 msg = buf[:len(MSG)]
1667 self.assertEqual(msg, MSG)
1668
1669 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1670
1671 def testRecvFromIntoMemoryview(self):
1672 buf = bytearray(1024)
1673 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1674 self.assertEqual(nbytes, len(MSG))
1675 msg = buf[:len(MSG)]
1676 self.assertEqual(msg, MSG)
1677
1678 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1679
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001680 def testRecvFromIntoSmallBuffer(self):
1681 # See issue #20246.
1682 buf = bytearray(8)
1683 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
1684
1685 def _testRecvFromIntoSmallBuffer(self):
1686 with test_support.check_py3k_warnings():
Stefan Krah70df6672014-01-21 23:05:52 +01001687 buf = buffer(MSG)
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001688 self.serv_conn.send(buf)
1689
Benjamin Petersond93d6332014-01-14 00:27:42 -05001690 def testRecvFromIntoEmptyBuffer(self):
1691 buf = bytearray()
1692 self.cli_conn.recvfrom_into(buf)
1693 self.cli_conn.recvfrom_into(buf, 0)
1694
1695 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
1696
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001697
1698TIPC_STYPE = 2000
1699TIPC_LOWER = 200
1700TIPC_UPPER = 210
1701
1702def isTipcAvailable():
1703 """Check if the TIPC module is loaded
1704
1705 The TIPC module is not loaded automatically on Ubuntu and probably
1706 other Linux distros.
1707 """
1708 if not hasattr(socket, "AF_TIPC"):
1709 return False
1710 if not os.path.isfile("/proc/modules"):
1711 return False
1712 with open("/proc/modules") as f:
1713 for line in f:
1714 if line.startswith("tipc "):
1715 return True
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001716 return False
1717
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001718@unittest.skipUnless(isTipcAvailable(),
1719 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1720class TIPCTest(unittest.TestCase):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001721 def testRDM(self):
1722 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1723 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1724
1725 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1726 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1727 TIPC_LOWER, TIPC_UPPER)
1728 srv.bind(srvaddr)
1729
1730 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1731 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1732 cli.sendto(MSG, sendaddr)
1733
1734 msg, recvaddr = srv.recvfrom(1024)
1735
1736 self.assertEqual(cli.getsockname(), recvaddr)
1737 self.assertEqual(msg, MSG)
1738
1739
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001740@unittest.skipUnless(isTipcAvailable(),
1741 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1742class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001743 def __init__(self, methodName = 'runTest'):
1744 unittest.TestCase.__init__(self, methodName = methodName)
1745 ThreadableTest.__init__(self)
1746
1747 def setUp(self):
1748 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1749 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1750 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1751 TIPC_LOWER, TIPC_UPPER)
1752 self.srv.bind(srvaddr)
1753 self.srv.listen(5)
1754 self.serverExplicitReady()
1755 self.conn, self.connaddr = self.srv.accept()
1756
1757 def clientSetUp(self):
Martin Panter200a6152016-05-30 04:04:50 +00001758 # There is a hittable race between serverExplicitReady() and the
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001759 # accept() call; sleep a little while to avoid it, otherwise
1760 # we could get an exception
1761 time.sleep(0.1)
1762 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1763 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1764 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1765 self.cli.connect(addr)
1766 self.cliaddr = self.cli.getsockname()
1767
1768 def testStream(self):
1769 msg = self.conn.recv(1024)
1770 self.assertEqual(msg, MSG)
1771 self.assertEqual(self.cliaddr, self.connaddr)
1772
1773 def _testStream(self):
1774 self.cli.send(MSG)
1775 self.cli.close()
1776
1777
Guido van Rossumb995eb72002-07-31 16:08:40 +00001778def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001779 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001780 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1781 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001782
1783 tests.extend([
1784 NonBlockingTCPTests,
1785 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001786 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001787 UnbufferedFileObjectClassTestCase,
1788 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001789 SmallBufferedFileObjectClassTestCase,
1790 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001791 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001792 NetworkConnectionAttributesTest,
1793 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001794 ])
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001795 tests.append(BasicSocketPairTest)
1796 tests.append(TestLinuxAbstractNamespace)
1797 tests.extend([TIPCTest, TIPCThreadableTest])
Neal Norwitz9602cc22006-06-18 19:35:01 +00001798
1799 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001800 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001801 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001802
1803if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001804 test_main()