blob: 1126fc2b77bb17d51c29c327bca7ba8c7fdd4073 [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):
Martin Panter3d36f0f2016-07-28 02:37:04 +0000302 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti0639be62011-05-07 19:21:22 +0300303 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):
Martin Panter8d496ad2016-06-02 10:35:44 +0000711 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000712 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:
Victor Stinner40996d32017-09-11 15:31:16 -0700736 signal.alarm(0)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000737 signal.signal(signal.SIGALRM, old_alarm)
738 c.close()
739 s.close()
740
741 def test_sendall_interrupted(self):
742 self.check_sendall_interrupted(False)
743
744 def test_sendall_interrupted_with_timeout(self):
745 self.check_sendall_interrupted(True)
746
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200747 def test_listen_backlog(self):
748 for backlog in 0, -1:
749 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
750 srv.bind((HOST, 0))
751 srv.listen(backlog)
752 srv.close()
753
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200754 @test_support.cpython_only
755 def test_listen_backlog_overflow(self):
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200756 # Issue 15989
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200757 import _testcapi
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200758 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
759 srv.bind((HOST, 0))
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200760 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200761 srv.close()
762
Charles-François Natali3aa59e32012-01-02 15:38:27 +0100763 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
764 def test_flowinfo(self):
765 self.assertRaises(OverflowError, socket.getnameinfo,
766 ('::1',0, 0xffffffff), 0)
767 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
768 try:
769 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
770 finally:
771 s.close()
772
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000773
Victor Stinner6a102812010-04-27 23:55:59 +0000774@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775class BasicTCPTest(SocketConnectedTest):
776
777 def __init__(self, methodName='runTest'):
778 SocketConnectedTest.__init__(self, methodName=methodName)
779
780 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000781 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000783 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784
785 def _testRecv(self):
786 self.serv_conn.send(MSG)
787
788 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000789 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790 seg1 = self.cli_conn.recv(len(MSG) - 3)
791 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000792 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000793 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794
795 def _testOverFlowRecv(self):
796 self.serv_conn.send(MSG)
797
798 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000799 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000801 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802
803 def _testRecvFrom(self):
804 self.serv_conn.send(MSG)
805
806 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000807 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000808 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
809 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000810 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000811 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812
813 def _testOverFlowRecvFrom(self):
814 self.serv_conn.send(MSG)
815
816 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000817 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000818 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 while 1:
820 read = self.cli_conn.recv(1024)
821 if not read:
822 break
Guido van Rossume531e292002-08-08 20:28:34 +0000823 msg += read
824 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000825
826 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000827 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 self.serv_conn.sendall(big_chunk)
829
Zachary Ware1f702212013-12-10 14:09:20 -0600830 @unittest.skipUnless(hasattr(socket, 'fromfd'),
Martin Panter8d496ad2016-06-02 10:35:44 +0000831 'socket.fromfd not available')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000833 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834 fd = self.cli_conn.fileno()
835 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000836 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000837 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000838 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000839
840 def _testFromFd(self):
841 self.serv_conn.send(MSG)
842
Brian Curtin62c20b62010-11-02 02:59:55 +0000843 def testDup(self):
844 # Testing dup()
845 sock = self.cli_conn.dup()
846 self.addCleanup(sock.close)
847 msg = sock.recv(1024)
848 self.assertEqual(msg, MSG)
849
850 def _testDup(self):
851 self.serv_conn.send(MSG)
852
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000854 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000856 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000857 # wait for _testShutdown to finish: on OS X, when the server
858 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000859 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000860 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861
862 def _testShutdown(self):
863 self.serv_conn.send(MSG)
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200864 self.serv_conn.shutdown(2)
865
866 testShutdown_overflow = test_support.cpython_only(testShutdown)
867
868 @test_support.cpython_only
869 def _testShutdown_overflow(self):
870 import _testcapi
871 self.serv_conn.send(MSG)
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200872 # Issue 15989
873 self.assertRaises(OverflowError, self.serv_conn.shutdown,
874 _testcapi.INT_MAX + 1)
875 self.assertRaises(OverflowError, self.serv_conn.shutdown,
876 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000877 self.serv_conn.shutdown(2)
878
Victor Stinner6a102812010-04-27 23:55:59 +0000879@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000880class BasicUDPTest(ThreadedUDPSocketTest):
881
882 def __init__(self, methodName='runTest'):
883 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
884
885 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000886 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000888 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889
890 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000891 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892
Guido van Rossum1c938012002-06-12 21:17:20 +0000893 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000894 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000896 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000897
Guido van Rossum1c938012002-06-12 21:17:20 +0000898 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000899 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000900
Facundo Batista1fe9f962007-03-28 03:45:20 +0000901 def testRecvFromNegative(self):
902 # Negative lengths passed to recvfrom should give ValueError.
903 self.assertRaises(ValueError, self.serv.recvfrom, -1)
904
905 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000906 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000907
Victor Stinner6a102812010-04-27 23:55:59 +0000908@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000909class TCPCloserTest(ThreadedTCPSocketTest):
910
911 def testClose(self):
912 conn, addr = self.serv.accept()
913 conn.close()
914
915 sd = self.cli
916 read, write, err = select.select([sd], [], [], 1.0)
917 self.assertEqual(read, [sd])
918 self.assertEqual(sd.recv(1), '')
919
920 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000921 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000922 time.sleep(1.0)
923
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200924@unittest.skipUnless(hasattr(socket, 'socketpair'),
925 'test needs socket.socketpair()')
Victor Stinner6a102812010-04-27 23:55:59 +0000926@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000927class BasicSocketPairTest(SocketPairTest):
928
929 def __init__(self, methodName='runTest'):
930 SocketPairTest.__init__(self, methodName=methodName)
931
932 def testRecv(self):
933 msg = self.serv.recv(1024)
934 self.assertEqual(msg, MSG)
935
936 def _testRecv(self):
937 self.cli.send(MSG)
938
939 def testSend(self):
940 self.serv.send(MSG)
941
942 def _testSend(self):
943 msg = self.cli.recv(1024)
944 self.assertEqual(msg, MSG)
945
Victor Stinner6a102812010-04-27 23:55:59 +0000946@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000947class NonBlockingTCPTests(ThreadedTCPSocketTest):
948
949 def __init__(self, methodName='runTest'):
950 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
951
952 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000953 # Testing whether set blocking works
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200954 self.serv.setblocking(True)
955 self.assertIsNone(self.serv.gettimeout())
956 self.serv.setblocking(False)
957 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000958 start = time.time()
959 try:
960 self.serv.accept()
961 except socket.error:
962 pass
963 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000964 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965
966 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000967 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000968
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200969 @test_support.cpython_only
970 def testSetBlocking_overflow(self):
971 # Issue 15989
972 import _testcapi
973 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
974 self.skipTest('needs UINT_MAX < ULONG_MAX')
975 self.serv.setblocking(False)
976 self.assertEqual(self.serv.gettimeout(), 0.0)
977 self.serv.setblocking(_testcapi.UINT_MAX + 1)
978 self.assertIsNone(self.serv.gettimeout())
979
980 _testSetBlocking_overflow = test_support.cpython_only(_testSetBlocking)
981
Guido van Rossum24e4af82002-06-12 19:18:08 +0000982 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000983 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000984 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000985 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986 conn, addr = self.serv.accept()
987 except socket.error:
988 pass
989 else:
990 self.fail("Error trying to do non-blocking accept.")
991 read, write, err = select.select([self.serv], [], [])
992 if self.serv in read:
993 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000994 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000995 else:
996 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000997
Guido van Rossum24e4af82002-06-12 19:18:08 +0000998 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000999 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +00001000 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001001
1002 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001003 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001005 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001006
1007 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001008 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +00001009 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001010
1011 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001012 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001013 conn, addr = self.serv.accept()
1014 conn.setblocking(0)
1015 try:
1016 msg = conn.recv(len(MSG))
1017 except socket.error:
1018 pass
1019 else:
1020 self.fail("Error trying to do non-blocking recv.")
1021 read, write, err = select.select([conn], [], [])
1022 if conn in read:
1023 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +00001024 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001025 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001026 else:
1027 self.fail("Error during select call to non-blocking socket.")
1028
1029 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001030 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001031 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001032 self.cli.send(MSG)
1033
Victor Stinner6a102812010-04-27 23:55:59 +00001034@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001035class FileObjectClassTestCase(SocketConnectedTest):
1036
Guido van Rossume9f66142002-08-07 15:46:19 +00001037 bufsize = -1 # Use default buffer size
1038
Guido van Rossum24e4af82002-06-12 19:18:08 +00001039 def __init__(self, methodName='runTest'):
1040 SocketConnectedTest.__init__(self, methodName=methodName)
1041
1042 def setUp(self):
1043 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001044 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001045
1046 def tearDown(self):
1047 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001048 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001049 SocketConnectedTest.tearDown(self)
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001050 self.serv_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001051
1052 def clientSetUp(self):
1053 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001054 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055
1056 def clientTearDown(self):
1057 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001058 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059 self.cli_file = None
1060 SocketConnectedTest.clientTearDown(self)
1061
1062 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001063 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001064 first_seg = self.serv_file.read(len(MSG)-3)
1065 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001066 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +00001067 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001068
1069 def _testSmallRead(self):
1070 self.cli_file.write(MSG)
1071 self.cli_file.flush()
1072
Guido van Rossum8c943832002-08-08 01:00:28 +00001073 def testFullRead(self):
1074 # read until EOF
1075 msg = self.serv_file.read()
1076 self.assertEqual(msg, MSG)
1077
1078 def _testFullRead(self):
1079 self.cli_file.write(MSG)
1080 self.cli_file.close()
1081
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001083 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084 buf = ''
1085 while 1:
1086 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001087 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001088 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001089 buf += char
1090 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001091
1092 def _testUnbufferedRead(self):
1093 self.cli_file.write(MSG)
1094 self.cli_file.flush()
1095
1096 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001097 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001099 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001100
1101 def _testReadline(self):
1102 self.cli_file.write(MSG)
1103 self.cli_file.flush()
1104
Gregory P. Smith24237ea2008-05-05 21:53:45 +00001105 def testReadlineAfterRead(self):
1106 a_baloo_is = self.serv_file.read(len("A baloo is"))
1107 self.assertEqual("A baloo is", a_baloo_is)
1108 _a_bear = self.serv_file.read(len(" a bear"))
1109 self.assertEqual(" a bear", _a_bear)
1110 line = self.serv_file.readline()
1111 self.assertEqual("\n", line)
1112 line = self.serv_file.readline()
1113 self.assertEqual("A BALOO IS A BEAR.\n", line)
1114 line = self.serv_file.readline()
1115 self.assertEqual(MSG, line)
1116
1117 def _testReadlineAfterRead(self):
1118 self.cli_file.write("A baloo is a bear\n")
1119 self.cli_file.write("A BALOO IS A BEAR.\n")
1120 self.cli_file.write(MSG)
1121 self.cli_file.flush()
1122
1123 def testReadlineAfterReadNoNewline(self):
1124 end_of_ = self.serv_file.read(len("End Of "))
1125 self.assertEqual("End Of ", end_of_)
1126 line = self.serv_file.readline()
1127 self.assertEqual("Line", line)
1128
1129 def _testReadlineAfterReadNoNewline(self):
1130 self.cli_file.write("End Of Line")
1131
Tim Peters116d83c2004-03-28 02:20:45 +00001132 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001133 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001134
1135 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001136 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001137
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001138
1139class FileObjectInterruptedTestCase(unittest.TestCase):
1140 """Test that the file object correctly handles EINTR internally."""
1141
1142 class MockSocket(object):
1143 def __init__(self, recv_funcs=()):
1144 # A generator that returns callables that we'll call for each
1145 # call to recv().
1146 self._recv_step = iter(recv_funcs)
1147
1148 def recv(self, size):
1149 return self._recv_step.next()()
1150
1151 @staticmethod
1152 def _raise_eintr():
1153 raise socket.error(errno.EINTR)
1154
1155 def _test_readline(self, size=-1, **kwargs):
1156 mock_sock = self.MockSocket(recv_funcs=[
1157 lambda : "This is the first line\nAnd the sec",
1158 self._raise_eintr,
1159 lambda : "ond line is here\n",
1160 lambda : "",
1161 ])
1162 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001163 self.assertEqual(fo.readline(size), "This is the first line\n")
1164 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001165
1166 def _test_read(self, size=-1, **kwargs):
1167 mock_sock = self.MockSocket(recv_funcs=[
1168 lambda : "This is the first line\nAnd the sec",
1169 self._raise_eintr,
1170 lambda : "ond line is here\n",
1171 lambda : "",
1172 ])
1173 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001174 self.assertEqual(fo.read(size), "This is the first line\n"
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001175 "And the second line is here\n")
1176
1177 def test_default(self):
1178 self._test_readline()
1179 self._test_readline(size=100)
1180 self._test_read()
1181 self._test_read(size=100)
1182
1183 def test_with_1k_buffer(self):
1184 self._test_readline(bufsize=1024)
1185 self._test_readline(size=100, bufsize=1024)
1186 self._test_read(bufsize=1024)
1187 self._test_read(size=100, bufsize=1024)
1188
1189 def _test_readline_no_buffer(self, size=-1):
1190 mock_sock = self.MockSocket(recv_funcs=[
1191 lambda : "aa",
1192 lambda : "\n",
1193 lambda : "BB",
1194 self._raise_eintr,
1195 lambda : "bb",
1196 lambda : "",
1197 ])
1198 fo = socket._fileobject(mock_sock, bufsize=0)
Ezio Melotti2623a372010-11-21 13:34:58 +00001199 self.assertEqual(fo.readline(size), "aa\n")
1200 self.assertEqual(fo.readline(size), "BBbb")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001201
1202 def test_no_buffer(self):
1203 self._test_readline_no_buffer()
1204 self._test_readline_no_buffer(size=4)
1205 self._test_read(bufsize=0)
1206 self._test_read(size=100, bufsize=0)
1207
1208
Guido van Rossume9f66142002-08-07 15:46:19 +00001209class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1210
1211 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001212
Guido van Rossume9f66142002-08-07 15:46:19 +00001213 In this case (and in this case only), it should be possible to
1214 create a file object, read a line from it, create another file
1215 object, read another line from it, without loss of data in the
1216 first file object's buffer. Note that httplib relies on this
1217 when reading multiple requests from the same socket."""
1218
1219 bufsize = 0 # Use unbuffered mode
1220
1221 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001222 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001223 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001224 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001225 self.serv_file = self.cli_conn.makefile('rb', 0)
1226 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001227 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001228
1229 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001230 self.cli_file.write("A. " + MSG)
1231 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001232 self.cli_file.flush()
1233
Guido van Rossum8c943832002-08-08 01:00:28 +00001234class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1235
1236 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1237
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001238 class SocketMemo(object):
1239 """A wrapper to keep track of sent data, needed to examine write behaviour"""
1240 def __init__(self, sock):
1241 self._sock = sock
1242 self.sent = []
1243
1244 def send(self, data, flags=0):
1245 n = self._sock.send(data, flags)
1246 self.sent.append(data[:n])
1247 return n
1248
1249 def sendall(self, data, flags=0):
1250 self._sock.sendall(data, flags)
1251 self.sent.append(data)
1252
1253 def __getattr__(self, attr):
1254 return getattr(self._sock, attr)
1255
1256 def getsent(self):
1257 return [e.tobytes() if isinstance(e, memoryview) else e for e in self.sent]
1258
1259 def setUp(self):
1260 FileObjectClassTestCase.setUp(self)
1261 self.serv_file._sock = self.SocketMemo(self.serv_file._sock)
1262
1263 def testLinebufferedWrite(self):
1264 # Write two lines, in small chunks
1265 msg = MSG.strip()
1266 print >> self.serv_file, msg,
1267 print >> self.serv_file, msg
1268
1269 # second line:
1270 print >> self.serv_file, msg,
1271 print >> self.serv_file, msg,
1272 print >> self.serv_file, msg
1273
1274 # third line
1275 print >> self.serv_file, ''
1276
1277 self.serv_file.flush()
1278
1279 msg1 = "%s %s\n"%(msg, msg)
1280 msg2 = "%s %s %s\n"%(msg, msg, msg)
1281 msg3 = "\n"
1282 self.assertEqual(self.serv_file._sock.getsent(), [msg1, msg2, msg3])
1283
1284 def _testLinebufferedWrite(self):
1285 msg = MSG.strip()
1286 msg1 = "%s %s\n"%(msg, msg)
1287 msg2 = "%s %s %s\n"%(msg, msg, msg)
1288 msg3 = "\n"
1289 l1 = self.cli_file.readline()
1290 self.assertEqual(l1, msg1)
1291 l2 = self.cli_file.readline()
1292 self.assertEqual(l2, msg2)
1293 l3 = self.cli_file.readline()
1294 self.assertEqual(l3, msg3)
1295
Guido van Rossum8c943832002-08-08 01:00:28 +00001296
1297class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1298
1299 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001300
Georg Brandldd7b0522007-01-21 10:35:10 +00001301
Facundo Batista07c78be2007-03-23 18:54:07 +00001302class NetworkConnectionTest(object):
1303 """Prove network connection."""
1304 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001305 # We're inherited below by BasicTCPTest2, which also inherits
1306 # BasicTCPTest, which defines self.port referenced below.
1307 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001308 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001309
Facundo Batista07c78be2007-03-23 18:54:07 +00001310class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1311 """Tests that NetworkConnection does not break existing TCP functionality.
1312 """
1313
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001314class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001315 class MockSocket(socket.socket):
1316 def connect(self, *args):
1317 raise socket.timeout('timed out')
1318
1319 @contextlib.contextmanager
1320 def mocked_socket_module(self):
1321 """Return a socket which times out on connect"""
1322 old_socket = socket.socket
1323 socket.socket = self.MockSocket
1324 try:
1325 yield
1326 finally:
1327 socket.socket = old_socket
1328
1329 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001330 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001331 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001332 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001333 with self.assertRaises(socket.error) as cm:
1334 cli.connect((HOST, port))
1335 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1336
1337 def test_create_connection(self):
1338 # Issue #9792: errors raised by create_connection() should have
1339 # a proper errno attribute.
1340 port = test_support.find_unused_port()
1341 with self.assertRaises(socket.error) as cm:
1342 socket.create_connection((HOST, port))
Trent Nelson6a7f8672012-10-18 01:35:32 -04001343
1344 # Issue #16257: create_connection() calls getaddrinfo() against
1345 # 'localhost'. This may result in an IPV6 addr being returned
1346 # as well as an IPV4 one:
1347 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1348 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1349 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1350 #
1351 # create_connection() enumerates through all the addresses returned
1352 # and if it doesn't successfully bind to any of them, it propagates
1353 # the last exception it encountered.
1354 #
1355 # On Solaris, ENETUNREACH is returned in this circumstance instead
1356 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1357 # expected errnos.
1358 expected_errnos = [ errno.ECONNREFUSED, ]
1359 if hasattr(errno, 'ENETUNREACH'):
1360 expected_errnos.append(errno.ENETUNREACH)
Miss Islington (bot)4b73a792017-11-01 06:08:40 -07001361 if hasattr(errno, 'EADDRNOTAVAIL'):
1362 # bpo-31910: socket.create_connection() fails randomly
1363 # with EADDRNOTAVAIL on Travis CI
1364 expected_errnos.append(errno.EADDRNOTAVAIL)
Trent Nelson6a7f8672012-10-18 01:35:32 -04001365
1366 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001367
1368 def test_create_connection_timeout(self):
1369 # Issue #9792: create_connection() should not recast timeout errors
1370 # as generic socket errors.
1371 with self.mocked_socket_module():
1372 with self.assertRaises(socket.timeout):
1373 socket.create_connection((HOST, 1234))
1374
Facundo Batista07c78be2007-03-23 18:54:07 +00001375
Victor Stinner6a102812010-04-27 23:55:59 +00001376@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001377class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1378
1379 def __init__(self, methodName='runTest'):
1380 SocketTCPTest.__init__(self, methodName=methodName)
1381 ThreadableTest.__init__(self)
1382
1383 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001384 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001385
1386 def clientTearDown(self):
1387 self.cli.close()
1388 self.cli = None
1389 ThreadableTest.clientTearDown(self)
1390
1391 def _justAccept(self):
1392 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001393 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001394
1395 testFamily = _justAccept
1396 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001397 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001398 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001399 self.assertEqual(self.cli.family, 2)
1400
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001401 testSourceAddress = _justAccept
1402 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001403 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1404 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001405 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001406 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001407 # The port number being used is sufficient to show that the bind()
1408 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001409
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001410 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001411 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001412 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001413 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001414 socket.setdefaulttimeout(42)
1415 try:
1416 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001417 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001418 finally:
1419 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001420 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001421
1422 testTimeoutNone = _justAccept
1423 def _testTimeoutNone(self):
1424 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001425 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001426 socket.setdefaulttimeout(30)
1427 try:
1428 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001429 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001430 finally:
1431 socket.setdefaulttimeout(None)
1432 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001433
1434 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001435 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001436 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001437 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001438
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001439 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001440 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001441 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001442 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001443 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001444
Victor Stinner6a102812010-04-27 23:55:59 +00001445@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001446class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1447
1448 def __init__(self, methodName='runTest'):
1449 SocketTCPTest.__init__(self, methodName=methodName)
1450 ThreadableTest.__init__(self)
1451
1452 def clientSetUp(self):
1453 pass
1454
1455 def clientTearDown(self):
1456 self.cli.close()
1457 self.cli = None
1458 ThreadableTest.clientTearDown(self)
1459
Facundo Batista07c78be2007-03-23 18:54:07 +00001460 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001461 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001462 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001463 time.sleep(3)
1464 conn.send("done!")
1465 testOutsideTimeout = testInsideTimeout
1466
1467 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001468 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001469 data = sock.recv(5)
1470 self.assertEqual(data, "done!")
1471
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001472 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001473 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001474 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001475
1476
Georg Brandldd7b0522007-01-21 10:35:10 +00001477class Urllib2FileobjectTest(unittest.TestCase):
1478
1479 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1480 # it close the socket if the close c'tor argument is true
1481
1482 def testClose(self):
1483 class MockSocket:
1484 closed = False
1485 def flush(self): pass
1486 def close(self): self.closed = True
1487
1488 # must not close unless we request it: the original use of _fileobject
1489 # by module socket requires that the underlying socket not be closed until
1490 # the _socketobject that created the _fileobject is closed
1491 s = MockSocket()
1492 f = socket._fileobject(s)
1493 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001494 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001495
1496 s = MockSocket()
1497 f = socket._fileobject(s, close=True)
1498 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001499 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001500
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001501class TCPTimeoutTest(SocketTCPTest):
1502
1503 def testTCPTimeout(self):
1504 def raise_timeout(*args, **kwargs):
1505 self.serv.settimeout(1.0)
1506 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001507 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001508 "Error generating a timeout exception (TCP)")
1509
1510 def testTimeoutZero(self):
1511 ok = False
1512 try:
1513 self.serv.settimeout(0.0)
1514 foo = self.serv.accept()
1515 except socket.timeout:
1516 self.fail("caught timeout instead of error (TCP)")
1517 except socket.error:
1518 ok = True
1519 except:
1520 self.fail("caught unexpected exception (TCP)")
1521 if not ok:
1522 self.fail("accept() returned success when we did not expect it")
1523
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001524 @unittest.skipUnless(hasattr(signal, 'alarm'),
1525 'test needs signal.alarm()')
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001526 def testInterruptedTimeout(self):
1527 # XXX I don't know how to do this test on MSWindows or any other
1528 # plaform that doesn't support signal.alarm() or os.kill(), though
1529 # the bug should have existed on all platforms.
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001530 self.serv.settimeout(5.0) # must be longer than alarm
1531 class Alarm(Exception):
1532 pass
1533 def alarm_handler(signal, frame):
1534 raise Alarm
1535 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1536 try:
1537 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1538 try:
1539 foo = self.serv.accept()
1540 except socket.timeout:
1541 self.fail("caught timeout instead of Alarm")
1542 except Alarm:
1543 pass
1544 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001545 self.fail("caught other exception instead of Alarm:"
1546 " %s(%s):\n%s" %
1547 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001548 else:
1549 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001550 finally:
1551 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001552 except Alarm:
1553 self.fail("got Alarm in wrong place")
1554 finally:
1555 # no alarm can be pending. Safe to restore old handler.
1556 signal.signal(signal.SIGALRM, old_alarm)
1557
Ezio Melotti169ed592011-11-18 18:33:14 +02001558class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001559
1560 def testUDPTimeout(self):
1561 def raise_timeout(*args, **kwargs):
1562 self.serv.settimeout(1.0)
1563 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001564 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001565 "Error generating a timeout exception (UDP)")
1566
1567 def testTimeoutZero(self):
1568 ok = False
1569 try:
1570 self.serv.settimeout(0.0)
1571 foo = self.serv.recv(1024)
1572 except socket.timeout:
1573 self.fail("caught timeout instead of error (UDP)")
1574 except socket.error:
1575 ok = True
1576 except:
1577 self.fail("caught unexpected exception (UDP)")
1578 if not ok:
1579 self.fail("recv() returned success when we did not expect it")
1580
1581class TestExceptions(unittest.TestCase):
1582
1583 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001584 self.assertTrue(issubclass(socket.error, Exception))
1585 self.assertTrue(issubclass(socket.herror, socket.error))
1586 self.assertTrue(issubclass(socket.gaierror, socket.error))
1587 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001588
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001589@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Armin Rigoa9017c32006-04-19 11:50:27 +00001590class TestLinuxAbstractNamespace(unittest.TestCase):
1591
1592 UNIX_PATH_MAX = 108
1593
1594 def testLinuxAbstractNamespace(self):
1595 address = "\x00python-test-hello\x00\xff"
1596 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1597 s1.bind(address)
1598 s1.listen(1)
1599 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1600 s2.connect(s1.getsockname())
1601 s1.accept()
1602 self.assertEqual(s1.getsockname(), address)
1603 self.assertEqual(s2.getpeername(), address)
1604
1605 def testMaxName(self):
1606 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1607 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1608 s.bind(address)
1609 self.assertEqual(s.getsockname(), address)
1610
1611 def testNameOverflow(self):
1612 address = "\x00" + "h" * self.UNIX_PATH_MAX
1613 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1614 self.assertRaises(socket.error, s.bind, address)
1615
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001616
Victor Stinner6a102812010-04-27 23:55:59 +00001617@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001618class BufferIOTest(SocketConnectedTest):
1619 """
1620 Test the buffer versions of socket.recv() and socket.send().
1621 """
1622 def __init__(self, methodName='runTest'):
1623 SocketConnectedTest.__init__(self, methodName=methodName)
1624
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001625 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001626 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001627 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001628 self.assertEqual(nbytes, len(MSG))
1629 msg = buf.tostring()[:len(MSG)]
1630 self.assertEqual(msg, MSG)
1631
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001632 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001633 with test_support.check_py3k_warnings():
1634 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001635 self.serv_conn.send(buf)
1636
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001637 def testRecvIntoBytearray(self):
1638 buf = bytearray(1024)
1639 nbytes = self.cli_conn.recv_into(buf)
1640 self.assertEqual(nbytes, len(MSG))
1641 msg = buf[:len(MSG)]
1642 self.assertEqual(msg, MSG)
1643
1644 _testRecvIntoBytearray = _testRecvIntoArray
1645
1646 def testRecvIntoMemoryview(self):
1647 buf = bytearray(1024)
1648 nbytes = self.cli_conn.recv_into(memoryview(buf))
1649 self.assertEqual(nbytes, len(MSG))
1650 msg = buf[:len(MSG)]
1651 self.assertEqual(msg, MSG)
1652
1653 _testRecvIntoMemoryview = _testRecvIntoArray
1654
1655 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001656 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001657 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001658 self.assertEqual(nbytes, len(MSG))
1659 msg = buf.tostring()[:len(MSG)]
1660 self.assertEqual(msg, MSG)
1661
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001662 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001663 with test_support.check_py3k_warnings():
1664 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001665 self.serv_conn.send(buf)
1666
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001667 def testRecvFromIntoBytearray(self):
1668 buf = bytearray(1024)
1669 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1670 self.assertEqual(nbytes, len(MSG))
1671 msg = buf[:len(MSG)]
1672 self.assertEqual(msg, MSG)
1673
1674 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1675
1676 def testRecvFromIntoMemoryview(self):
1677 buf = bytearray(1024)
1678 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1679 self.assertEqual(nbytes, len(MSG))
1680 msg = buf[:len(MSG)]
1681 self.assertEqual(msg, MSG)
1682
1683 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1684
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001685 def testRecvFromIntoSmallBuffer(self):
1686 # See issue #20246.
1687 buf = bytearray(8)
1688 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
1689
1690 def _testRecvFromIntoSmallBuffer(self):
1691 with test_support.check_py3k_warnings():
Stefan Krah70df6672014-01-21 23:05:52 +01001692 buf = buffer(MSG)
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001693 self.serv_conn.send(buf)
1694
Benjamin Petersond93d6332014-01-14 00:27:42 -05001695 def testRecvFromIntoEmptyBuffer(self):
1696 buf = bytearray()
1697 self.cli_conn.recvfrom_into(buf)
1698 self.cli_conn.recvfrom_into(buf, 0)
1699
1700 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
1701
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001702
1703TIPC_STYPE = 2000
1704TIPC_LOWER = 200
1705TIPC_UPPER = 210
1706
1707def isTipcAvailable():
1708 """Check if the TIPC module is loaded
1709
1710 The TIPC module is not loaded automatically on Ubuntu and probably
1711 other Linux distros.
1712 """
1713 if not hasattr(socket, "AF_TIPC"):
1714 return False
Martin Panter500794d2016-12-24 10:41:37 +00001715 try:
1716 f = open("/proc/modules")
1717 except IOError as e:
1718 # It's ok if the file does not exist, is a directory or if we
1719 # have not the permission to read it. In any other case it's a
1720 # real error, so raise it again.
1721 if e.errno in (errno.ENOENT, errno.EISDIR, errno.EACCES):
1722 return False
1723 else:
1724 raise
1725 with f:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001726 for line in f:
1727 if line.startswith("tipc "):
1728 return True
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001729 return False
1730
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001731@unittest.skipUnless(isTipcAvailable(),
1732 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1733class TIPCTest(unittest.TestCase):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001734 def testRDM(self):
1735 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1736 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1737
1738 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1739 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1740 TIPC_LOWER, TIPC_UPPER)
1741 srv.bind(srvaddr)
1742
1743 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1744 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1745 cli.sendto(MSG, sendaddr)
1746
1747 msg, recvaddr = srv.recvfrom(1024)
1748
1749 self.assertEqual(cli.getsockname(), recvaddr)
1750 self.assertEqual(msg, MSG)
1751
1752
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001753@unittest.skipUnless(isTipcAvailable(),
1754 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1755class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001756 def __init__(self, methodName = 'runTest'):
1757 unittest.TestCase.__init__(self, methodName = methodName)
1758 ThreadableTest.__init__(self)
1759
1760 def setUp(self):
1761 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1762 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1763 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1764 TIPC_LOWER, TIPC_UPPER)
1765 self.srv.bind(srvaddr)
1766 self.srv.listen(5)
1767 self.serverExplicitReady()
1768 self.conn, self.connaddr = self.srv.accept()
1769
1770 def clientSetUp(self):
Martin Panter200a6152016-05-30 04:04:50 +00001771 # There is a hittable race between serverExplicitReady() and the
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001772 # accept() call; sleep a little while to avoid it, otherwise
1773 # we could get an exception
1774 time.sleep(0.1)
1775 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1776 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1777 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1778 self.cli.connect(addr)
1779 self.cliaddr = self.cli.getsockname()
1780
1781 def testStream(self):
1782 msg = self.conn.recv(1024)
1783 self.assertEqual(msg, MSG)
1784 self.assertEqual(self.cliaddr, self.connaddr)
1785
1786 def _testStream(self):
1787 self.cli.send(MSG)
1788 self.cli.close()
1789
1790
Guido van Rossumb995eb72002-07-31 16:08:40 +00001791def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001792 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001793 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1794 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001795
1796 tests.extend([
1797 NonBlockingTCPTests,
1798 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001799 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001800 UnbufferedFileObjectClassTestCase,
1801 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001802 SmallBufferedFileObjectClassTestCase,
1803 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001804 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001805 NetworkConnectionAttributesTest,
1806 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001807 ])
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001808 tests.append(BasicSocketPairTest)
1809 tests.append(TestLinuxAbstractNamespace)
1810 tests.extend([TIPCTest, TIPCThreadableTest])
Neal Norwitz9602cc22006-06-18 19:35:01 +00001811
1812 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001813 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001814 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001815
1816if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001817 test_main()