blob: 79160f451a03c2b5126e7c88a5f5631b824f2684 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100010import tempfile
11import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000012import time
13import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000014import queue
Jack Jansen522e7692002-09-06 21:57:50 +000015import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import os
17import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000018import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000019import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000020from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000021import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000022import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010023import pickle
Antoine Pitroub1c54962010-10-14 15:05:38 +000024try:
25 import fcntl
26except ImportError:
27 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000028
Benjamin Petersonee8712c2008-05-20 21:35:26 +000029HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000030MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000031
Victor Stinner45df8202010-04-28 22:31:17 +000032try:
33 import _thread as thread
34 import threading
35except ImportError:
36 thread = None
37 threading = None
38
Nick Coghlan96fe56a2011-08-22 11:55:57 +100039# Size in bytes of the int type
40SIZEOF_INT = array.array("i").itemsize
41
Guido van Rossum24e4af82002-06-12 19:18:08 +000042class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000043
Guido van Rossum24e4af82002-06-12 19:18:08 +000044 def setUp(self):
45 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000046 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000047 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000048
Guido van Rossum24e4af82002-06-12 19:18:08 +000049 def tearDown(self):
50 self.serv.close()
51 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000052
Guido van Rossum24e4af82002-06-12 19:18:08 +000053class SocketUDPTest(unittest.TestCase):
54
55 def setUp(self):
56 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000057 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000058
59 def tearDown(self):
60 self.serv.close()
61 self.serv = None
62
Nick Coghlan96fe56a2011-08-22 11:55:57 +100063class ThreadSafeCleanupTestCase(unittest.TestCase):
64 """Subclass of unittest.TestCase with thread-safe cleanup methods.
65
66 This subclass protects the addCleanup() and doCleanups() methods
67 with a recursive lock.
68 """
69
70 if threading:
71 def __init__(self, *args, **kwargs):
72 super().__init__(*args, **kwargs)
73 self._cleanup_lock = threading.RLock()
74
75 def addCleanup(self, *args, **kwargs):
76 with self._cleanup_lock:
77 return super().addCleanup(*args, **kwargs)
78
79 def doCleanups(self, *args, **kwargs):
80 with self._cleanup_lock:
81 return super().doCleanups(*args, **kwargs)
82
Guido van Rossum24e4af82002-06-12 19:18:08 +000083class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000084 """Threadable Test class
85
86 The ThreadableTest class makes it easy to create a threaded
87 client/server pair from an existing unit test. To create a
88 new threaded class from an existing unit test, use multiple
89 inheritance:
90
91 class NewClass (OldClass, ThreadableTest):
92 pass
93
94 This class defines two new fixture functions with obvious
95 purposes for overriding:
96
97 clientSetUp ()
98 clientTearDown ()
99
100 Any new test functions within the class must then define
101 tests in pairs, where the test name is preceeded with a
102 '_' to indicate the client portion of the test. Ex:
103
104 def testFoo(self):
105 # Server portion
106
107 def _testFoo(self):
108 # Client portion
109
110 Any exceptions raised by the clients during their tests
111 are caught and transferred to the main thread to alert
112 the testing framework.
113
114 Note, the server setup function cannot call any blocking
115 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000116 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000117 the blocking call (such as in setting up a client/server
118 connection and performing the accept() in setUp().
119 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000120
121 def __init__(self):
122 # Swap the true setup function
123 self.__setUp = self.setUp
124 self.__tearDown = self.tearDown
125 self.setUp = self._setUp
126 self.tearDown = self._tearDown
127
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000128 def serverExplicitReady(self):
129 """This method allows the server to explicitly indicate that
130 it wants the client thread to proceed. This is useful if the
131 server is about to execute a blocking routine that is
132 dependent upon the client thread during its setup routine."""
133 self.server_ready.set()
134
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000136 self.server_ready = threading.Event()
137 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000138 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000139 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000140
141 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000142 methodname = self.id()
143 i = methodname.rfind('.')
144 methodname = methodname[i+1:]
145 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000146 self.client_thread = thread.start_new_thread(
147 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148
149 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000150 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000151 self.server_ready.set()
152 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000153
154 def _tearDown(self):
155 self.__tearDown()
156 self.done.wait()
157
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000158 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000159 exc = self.queue.get()
160 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000161
162 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000163 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000164 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200165 self.client_ready.set()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000166 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000167 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000168 try:
169 test_func()
Nick Coghlan2496f332011-09-19 20:26:31 +1000170 except unittest._ExpectedFailure:
171 # We deliberately ignore expected failures
172 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000173 except BaseException as e:
174 self.queue.put(e)
175 finally:
176 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000177
178 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000179 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000180
181 def clientTearDown(self):
182 self.done.set()
183 thread.exit()
184
185class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
186
187 def __init__(self, methodName='runTest'):
188 SocketTCPTest.__init__(self, methodName=methodName)
189 ThreadableTest.__init__(self)
190
191 def clientSetUp(self):
192 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
193
194 def clientTearDown(self):
195 self.cli.close()
196 self.cli = None
197 ThreadableTest.clientTearDown(self)
198
199class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
200
201 def __init__(self, methodName='runTest'):
202 SocketUDPTest.__init__(self, methodName=methodName)
203 ThreadableTest.__init__(self)
204
205 def clientSetUp(self):
206 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
207
Brian Curtin3beb38f2010-11-04 03:41:43 +0000208 def clientTearDown(self):
209 self.cli.close()
210 self.cli = None
211 ThreadableTest.clientTearDown(self)
212
Guido van Rossum24e4af82002-06-12 19:18:08 +0000213class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000214 """Socket tests for client-server connection.
215
216 self.cli_conn is a client socket connected to the server. The
217 setUp() method guarantees that it is connected to the server.
218 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000219
220 def __init__(self, methodName='runTest'):
221 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
222
223 def setUp(self):
224 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000225 # Indicate explicitly we're ready for the client thread to
226 # proceed and then perform the blocking call to accept
227 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000228 conn, addr = self.serv.accept()
229 self.cli_conn = conn
230
231 def tearDown(self):
232 self.cli_conn.close()
233 self.cli_conn = None
234 ThreadedTCPSocketTest.tearDown(self)
235
236 def clientSetUp(self):
237 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000238 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000239 self.serv_conn = self.cli
240
241 def clientTearDown(self):
242 self.serv_conn.close()
243 self.serv_conn = None
244 ThreadedTCPSocketTest.clientTearDown(self)
245
Dave Cole331708b2004-08-09 04:51:41 +0000246class SocketPairTest(unittest.TestCase, ThreadableTest):
247
248 def __init__(self, methodName='runTest'):
249 unittest.TestCase.__init__(self, methodName=methodName)
250 ThreadableTest.__init__(self)
251
252 def setUp(self):
253 self.serv, self.cli = socket.socketpair()
254
255 def tearDown(self):
256 self.serv.close()
257 self.serv = None
258
259 def clientSetUp(self):
260 pass
261
262 def clientTearDown(self):
263 self.cli.close()
264 self.cli = None
265 ThreadableTest.clientTearDown(self)
266
Tim Peters494aaee2004-08-09 18:54:11 +0000267
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000268# The following classes are used by the sendmsg()/recvmsg() tests.
269# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
270# gives a drop-in replacement for SocketConnectedTest, but different
271# address families can be used, and the attributes serv_addr and
272# cli_addr will be set to the addresses of the endpoints.
273
274class SocketTestBase(unittest.TestCase):
275 """A base class for socket tests.
276
277 Subclasses must provide methods newSocket() to return a new socket
278 and bindSock(sock) to bind it to an unused address.
279
280 Creates a socket self.serv and sets self.serv_addr to its address.
281 """
282
283 def setUp(self):
284 self.serv = self.newSocket()
285 self.bindServer()
286
287 def bindServer(self):
288 """Bind server socket and set self.serv_addr to its address."""
289 self.bindSock(self.serv)
290 self.serv_addr = self.serv.getsockname()
291
292 def tearDown(self):
293 self.serv.close()
294 self.serv = None
295
296
297class SocketListeningTestMixin(SocketTestBase):
298 """Mixin to listen on the server socket."""
299
300 def setUp(self):
301 super().setUp()
302 self.serv.listen(1)
303
304
305class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
306 ThreadableTest):
307 """Mixin to add client socket and allow client/server tests.
308
309 Client socket is self.cli and its address is self.cli_addr. See
310 ThreadableTest for usage information.
311 """
312
313 def __init__(self, *args, **kwargs):
314 super().__init__(*args, **kwargs)
315 ThreadableTest.__init__(self)
316
317 def clientSetUp(self):
318 self.cli = self.newClientSocket()
319 self.bindClient()
320
321 def newClientSocket(self):
322 """Return a new socket for use as client."""
323 return self.newSocket()
324
325 def bindClient(self):
326 """Bind client socket and set self.cli_addr to its address."""
327 self.bindSock(self.cli)
328 self.cli_addr = self.cli.getsockname()
329
330 def clientTearDown(self):
331 self.cli.close()
332 self.cli = None
333 ThreadableTest.clientTearDown(self)
334
335
336class ConnectedStreamTestMixin(SocketListeningTestMixin,
337 ThreadedSocketTestMixin):
338 """Mixin to allow client/server stream tests with connected client.
339
340 Server's socket representing connection to client is self.cli_conn
341 and client's connection to server is self.serv_conn. (Based on
342 SocketConnectedTest.)
343 """
344
345 def setUp(self):
346 super().setUp()
347 # Indicate explicitly we're ready for the client thread to
348 # proceed and then perform the blocking call to accept
349 self.serverExplicitReady()
350 conn, addr = self.serv.accept()
351 self.cli_conn = conn
352
353 def tearDown(self):
354 self.cli_conn.close()
355 self.cli_conn = None
356 super().tearDown()
357
358 def clientSetUp(self):
359 super().clientSetUp()
360 self.cli.connect(self.serv_addr)
361 self.serv_conn = self.cli
362
363 def clientTearDown(self):
364 self.serv_conn.close()
365 self.serv_conn = None
366 super().clientTearDown()
367
368
369class UnixSocketTestBase(SocketTestBase):
370 """Base class for Unix-domain socket tests."""
371
372 # This class is used for file descriptor passing tests, so we
373 # create the sockets in a private directory so that other users
374 # can't send anything that might be problematic for a privileged
375 # user running the tests.
376
377 def setUp(self):
378 self.dir_path = tempfile.mkdtemp()
379 self.addCleanup(os.rmdir, self.dir_path)
380 super().setUp()
381
382 def bindSock(self, sock):
383 path = tempfile.mktemp(dir=self.dir_path)
384 sock.bind(path)
385 self.addCleanup(support.unlink, path)
386
387class UnixStreamBase(UnixSocketTestBase):
388 """Base class for Unix-domain SOCK_STREAM tests."""
389
390 def newSocket(self):
391 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
392
393
394class InetTestBase(SocketTestBase):
395 """Base class for IPv4 socket tests."""
396
397 host = HOST
398
399 def setUp(self):
400 super().setUp()
401 self.port = self.serv_addr[1]
402
403 def bindSock(self, sock):
404 support.bind_port(sock, host=self.host)
405
406class TCPTestBase(InetTestBase):
407 """Base class for TCP-over-IPv4 tests."""
408
409 def newSocket(self):
410 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
411
412class UDPTestBase(InetTestBase):
413 """Base class for UDP-over-IPv4 tests."""
414
415 def newSocket(self):
416 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
417
418class SCTPStreamBase(InetTestBase):
419 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
420
421 def newSocket(self):
422 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
423 socket.IPPROTO_SCTP)
424
425
426class Inet6TestBase(InetTestBase):
427 """Base class for IPv6 socket tests."""
428
429 # Don't use "localhost" here - it may not have an IPv6 address
430 # assigned to it by default (e.g. in /etc/hosts), and if someone
431 # has assigned it an IPv4-mapped address, then it's unlikely to
432 # work with the full IPv6 API.
433 host = "::1"
434
435class UDP6TestBase(Inet6TestBase):
436 """Base class for UDP-over-IPv6 tests."""
437
438 def newSocket(self):
439 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
440
441
442# Test-skipping decorators for use with ThreadableTest.
443
444def skipWithClientIf(condition, reason):
445 """Skip decorated test if condition is true, add client_skip decorator.
446
447 If the decorated object is not a class, sets its attribute
448 "client_skip" to a decorator which will return an empty function
449 if the test is to be skipped, or the original function if it is
450 not. This can be used to avoid running the client part of a
451 skipped test when using ThreadableTest.
452 """
453 def client_pass(*args, **kwargs):
454 pass
455 def skipdec(obj):
456 retval = unittest.skip(reason)(obj)
457 if not isinstance(obj, type):
458 retval.client_skip = lambda f: client_pass
459 return retval
460 def noskipdec(obj):
461 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
462 obj.client_skip = lambda f: f
463 return obj
464 return skipdec if condition else noskipdec
465
466
467def requireAttrs(obj, *attributes):
468 """Skip decorated test if obj is missing any of the given attributes.
469
470 Sets client_skip attribute as skipWithClientIf() does.
471 """
472 missing = [name for name in attributes if not hasattr(obj, name)]
473 return skipWithClientIf(
474 missing, "don't have " + ", ".join(name for name in missing))
475
476
477def requireSocket(*args):
478 """Skip decorated test if a socket cannot be created with given arguments.
479
480 When an argument is given as a string, will use the value of that
481 attribute of the socket module, or skip the test if it doesn't
482 exist. Sets client_skip attribute as skipWithClientIf() does.
483 """
484 err = None
485 missing = [obj for obj in args if
486 isinstance(obj, str) and not hasattr(socket, obj)]
487 if missing:
488 err = "don't have " + ", ".join(name for name in missing)
489 else:
490 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
491 for obj in args]
492 try:
493 s = socket.socket(*callargs)
494 except socket.error as e:
495 # XXX: check errno?
496 err = str(e)
497 else:
498 s.close()
499 return skipWithClientIf(
500 err is not None,
501 "can't create socket({0}): {1}".format(
502 ", ".join(str(o) for o in args), err))
503
504
Guido van Rossum24e4af82002-06-12 19:18:08 +0000505#######################################################################
506## Begin Tests
507
508class GeneralModuleTests(unittest.TestCase):
509
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000510 def test_repr(self):
511 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000512 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000513 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000514
Raymond Hettinger027bb632004-05-31 03:09:25 +0000515 def test_weakref(self):
516 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
517 p = proxy(s)
518 self.assertEqual(p.fileno(), s.fileno())
519 s.close()
520 s = None
521 try:
522 p.fileno()
523 except ReferenceError:
524 pass
525 else:
526 self.fail('Socket proxy still exists')
527
Guido van Rossum24e4af82002-06-12 19:18:08 +0000528 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000529 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300530 msg = "Error raising socket exception (%s)."
531 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300533 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300535 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000536 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000537
Ezio Melotti63e42302011-05-07 19:47:48 +0300538 def testSendtoErrors(self):
539 # Testing that sendto doens't masks failures. See #10169.
540 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
541 self.addCleanup(s.close)
542 s.bind(('', 0))
543 sockname = s.getsockname()
544 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300545 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300546 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300547 self.assertEqual(str(cm.exception),
548 "'str' does not support the buffer interface")
549 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300550 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300551 self.assertEqual(str(cm.exception),
552 "'complex' does not support the buffer interface")
553 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300554 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300555 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300556 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300557 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300558 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300559 self.assertEqual(str(cm.exception),
560 "'str' does not support the buffer interface")
561 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300562 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300563 self.assertEqual(str(cm.exception),
564 "'complex' does not support the buffer interface")
565 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300566 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300567 self.assertIn('not NoneType', str(cm.exception))
568 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300569 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300570 self.assertIn('an integer is required', str(cm.exception))
571 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300572 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300573 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300574 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300575 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300576 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300577 self.assertIn('(1 given)', str(cm.exception))
578 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300579 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300580 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300581
Guido van Rossum24e4af82002-06-12 19:18:08 +0000582 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000583 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 socket.AF_INET
585 socket.SOCK_STREAM
586 socket.SOCK_DGRAM
587 socket.SOCK_RAW
588 socket.SOCK_RDM
589 socket.SOCK_SEQPACKET
590 socket.SOL_SOCKET
591 socket.SO_REUSEADDR
592
Guido van Rossum654c11e2002-06-13 20:24:17 +0000593 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000594 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000595 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000596 try:
597 ip = socket.gethostbyname(hostname)
598 except socket.error:
599 # Probably name lookup wasn't set up right; skip this test
600 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000601 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000602 try:
603 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
604 except socket.error:
605 # Probably a similar problem as above; skip this test
606 return
Brett Cannon01668a12005-03-11 00:04:17 +0000607 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000608 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000609 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000610 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000611
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000612 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
613 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
614 def test_sethostname(self):
615 oldhn = socket.gethostname()
616 try:
617 socket.sethostname('new')
618 except socket.error as e:
619 if e.errno == errno.EPERM:
620 self.skipTest("test should be run as root")
621 else:
622 raise
623 try:
624 # running test as root!
625 self.assertEqual(socket.gethostname(), 'new')
626 # Should work with bytes objects too
627 socket.sethostname(b'bar')
628 self.assertEqual(socket.gethostname(), 'bar')
629 finally:
630 socket.sethostname(oldhn)
631
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700632 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
633 'socket.if_nameindex() not available.')
634 def testInterfaceNameIndex(self):
635 interfaces = socket.if_nameindex()
636 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200637 self.assertIsInstance(index, int)
638 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700639 # interface indices are non-zero integers
640 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200641 _index = socket.if_nametoindex(name)
642 self.assertIsInstance(_index, int)
643 self.assertEqual(index, _index)
644 _name = socket.if_indextoname(index)
645 self.assertIsInstance(_name, str)
646 self.assertEqual(name, _name)
647
648 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
649 'socket.if_nameindex() not available.')
650 def testInvalidInterfaceNameIndex(self):
651 # test nonexistent interface index/name
652 self.assertRaises(socket.error, socket.if_indextoname, 0)
653 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
654 # test with invalid values
655 self.assertRaises(TypeError, socket.if_nametoindex, 0)
656 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700657
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000658 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000659 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000660 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661 try:
662 # On some versions, this loses a reference
663 orig = sys.getrefcount(__name__)
664 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000665 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000666 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000668
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000670 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000671 try:
672 # On some versions, this crashes the interpreter.
673 socket.getnameinfo(('x', 0, 0, 0), 0)
674 except socket.error:
675 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000676
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000677 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000678 # This just checks that htons etc. are their own inverse,
679 # when looking at the lower 16 or 32 bits.
680 sizes = {socket.htonl: 32, socket.ntohl: 32,
681 socket.htons: 16, socket.ntohs: 16}
682 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000683 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000684 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
685 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000686
Guido van Rossuma2627af2002-09-14 00:58:46 +0000687 swapped = func(mask)
688 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000689 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000690
Guido van Rossum018919a2007-01-15 00:07:32 +0000691 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000692 good_values = [ 1, 2, 3, 1, 2, 3 ]
693 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000694 for k in good_values:
695 socket.ntohl(k)
696 socket.ntohs(k)
697 socket.htonl(k)
698 socket.htons(k)
699 for k in bad_values:
700 self.assertRaises(OverflowError, socket.ntohl, k)
701 self.assertRaises(OverflowError, socket.ntohs, k)
702 self.assertRaises(OverflowError, socket.htonl, k)
703 self.assertRaises(OverflowError, socket.htons, k)
704
Barry Warsaw11b91a02004-06-28 00:50:43 +0000705 def testGetServBy(self):
706 eq = self.assertEqual
707 # Find one service that exists, then check all the related interfaces.
708 # I've ordered this by protocols that have both a tcp and udp
709 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200710 if (sys.platform.startswith(('freebsd', 'netbsd'))
711 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000712 # avoid the 'echo' service on this platform, as there is an
713 # assumption breaking non-standard port/protocol entry
714 services = ('daytime', 'qotd', 'domain')
715 else:
716 services = ('echo', 'daytime', 'domain')
717 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000718 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000719 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000720 break
721 except socket.error:
722 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000723 else:
724 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000725 # Try same call with optional protocol omitted
726 port2 = socket.getservbyname(service)
727 eq(port, port2)
728 # Try udp, but don't barf it it doesn't exist
729 try:
730 udpport = socket.getservbyname(service, 'udp')
731 except socket.error:
732 udpport = None
733 else:
734 eq(udpport, port)
735 # Now make sure the lookup by port returns the same service name
736 eq(socket.getservbyport(port2), service)
737 eq(socket.getservbyport(port, 'tcp'), service)
738 if udpport is not None:
739 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000740 # Make sure getservbyport does not accept out of range ports.
741 self.assertRaises(OverflowError, socket.getservbyport, -1)
742 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000744 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000745 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000746 # The default timeout should initially be None
747 self.assertEqual(socket.getdefaulttimeout(), None)
748 s = socket.socket()
749 self.assertEqual(s.gettimeout(), None)
750 s.close()
751
752 # Set the default timeout to 10, and see if it propagates
753 socket.setdefaulttimeout(10)
754 self.assertEqual(socket.getdefaulttimeout(), 10)
755 s = socket.socket()
756 self.assertEqual(s.gettimeout(), 10)
757 s.close()
758
759 # Reset the default timeout to None, and see if it propagates
760 socket.setdefaulttimeout(None)
761 self.assertEqual(socket.getdefaulttimeout(), None)
762 s = socket.socket()
763 self.assertEqual(s.gettimeout(), None)
764 s.close()
765
766 # Check that setting it to an invalid value raises ValueError
767 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
768
769 # Check that setting it to an invalid type raises TypeError
770 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
771
Benjamin Petersonf91df042009-02-13 02:50:59 +0000772 def testIPv4_inet_aton_fourbytes(self):
773 if not hasattr(socket, 'inet_aton'):
774 return # No inet_aton, nothing to check
775 # Test that issue1008086 and issue767150 are fixed.
776 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000777 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
778 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000779
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000780 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000781 if not hasattr(socket, 'inet_pton'):
782 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000783 from socket import inet_aton as f, inet_pton, AF_INET
784 g = lambda a: inet_pton(AF_INET, a)
785
Ezio Melottib3aedd42010-11-20 19:04:17 +0000786 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
787 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
788 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
789 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
790 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000791
Ezio Melottib3aedd42010-11-20 19:04:17 +0000792 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
793 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
794 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
795 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000796
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000797 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000798 if not hasattr(socket, 'inet_pton'):
799 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000800 try:
801 from socket import inet_pton, AF_INET6, has_ipv6
802 if not has_ipv6:
803 return
804 except ImportError:
805 return
806 f = lambda a: inet_pton(AF_INET6, a)
807
Ezio Melottib3aedd42010-11-20 19:04:17 +0000808 self.assertEqual(b'\x00' * 16, f('::'))
809 self.assertEqual(b'\x00' * 16, f('0::0'))
810 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
811 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000812 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000813 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
814 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000815
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000816 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000817 if not hasattr(socket, 'inet_ntop'):
818 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000819 from socket import inet_ntoa as f, inet_ntop, AF_INET
820 g = lambda a: inet_ntop(AF_INET, a)
821
Ezio Melottib3aedd42010-11-20 19:04:17 +0000822 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
823 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
824 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
825 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000826
Ezio Melottib3aedd42010-11-20 19:04:17 +0000827 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
828 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
829 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000830
831 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000832 if not hasattr(socket, 'inet_ntop'):
833 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000834 try:
835 from socket import inet_ntop, AF_INET6, has_ipv6
836 if not has_ipv6:
837 return
838 except ImportError:
839 return
840 f = lambda a: inet_ntop(AF_INET6, a)
841
Ezio Melottib3aedd42010-11-20 19:04:17 +0000842 self.assertEqual('::', f(b'\x00' * 16))
843 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
844 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000845 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000846 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000847 )
848
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000849 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000850
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000851 def testSockName(self):
852 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200853 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000855 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000856 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000858 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
859 # it reasonable to get the host's addr in addition to 0.0.0.0.
860 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000861 try:
862 my_ip_addr = socket.gethostbyname(socket.gethostname())
863 except socket.error:
864 # Probably name lookup wasn't set up right; skip this test
865 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000866 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000867 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868
869 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000870 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871 # We know a socket should start without reuse==0
872 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000873 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000875 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876
877 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000880 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000881 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
882 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000883 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000885 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000886 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000887 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
888 sock.settimeout(1)
889 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000890 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000891
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000892 def testNewAttributes(self):
893 # testing .family, .type and .protocol
894 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
895 self.assertEqual(sock.family, socket.AF_INET)
896 self.assertEqual(sock.type, socket.SOCK_STREAM)
897 self.assertEqual(sock.proto, 0)
898 sock.close()
899
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000900 def test_getsockaddrarg(self):
901 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200902 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000903 big_port = port + 65536
904 neg_port = port - 65536
905 sock = socket.socket()
906 try:
907 self.assertRaises(OverflowError, sock.bind, (host, big_port))
908 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
909 sock.bind((host, port))
910 finally:
911 sock.close()
912
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000913 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000914 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000915 self.assertTrue(hasattr(socket.socket, 'ioctl'))
916 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
917 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
918 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000919 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
920 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000921 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000922 self.assertRaises(ValueError, s.ioctl, -1, None)
923 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000924
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000925 def testGetaddrinfo(self):
926 try:
927 socket.getaddrinfo('localhost', 80)
928 except socket.gaierror as err:
929 if err.errno == socket.EAI_SERVICE:
930 # see http://bugs.python.org/issue1282647
931 self.skipTest("buggy libc version")
932 raise
933 # len of every sequence is supposed to be == 5
934 for info in socket.getaddrinfo(HOST, None):
935 self.assertEqual(len(info), 5)
936 # host can be a domain name, a string representation of an
937 # IPv4/v6 address or None
938 socket.getaddrinfo('localhost', 80)
939 socket.getaddrinfo('127.0.0.1', 80)
940 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200941 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000942 socket.getaddrinfo('::1', 80)
943 # port can be a string service name such as "http", a numeric
944 # port number or None
945 socket.getaddrinfo(HOST, "http")
946 socket.getaddrinfo(HOST, 80)
947 socket.getaddrinfo(HOST, None)
948 # test family and socktype filters
949 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
950 for family, _, _, _, _ in infos:
951 self.assertEqual(family, socket.AF_INET)
952 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
953 for _, socktype, _, _, _ in infos:
954 self.assertEqual(socktype, socket.SOCK_STREAM)
955 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000956 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000957 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
958 # a server willing to support both IPv4 and IPv6 will
959 # usually do this
960 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
961 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000962 # test keyword arguments
963 a = socket.getaddrinfo(HOST, None)
964 b = socket.getaddrinfo(host=HOST, port=None)
965 self.assertEqual(a, b)
966 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
967 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
968 self.assertEqual(a, b)
969 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
970 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
971 self.assertEqual(a, b)
972 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
973 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
974 self.assertEqual(a, b)
975 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
976 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
977 self.assertEqual(a, b)
978 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
979 socket.AI_PASSIVE)
980 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
981 type=socket.SOCK_STREAM, proto=0,
982 flags=socket.AI_PASSIVE)
983 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000984 # Issue #6697.
985 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000986
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000987 def test_getnameinfo(self):
988 # only IP addresses are allowed
989 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
990
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000991 @unittest.skipUnless(support.is_resource_enabled('network'),
992 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000993 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000994 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000995 # these should all be successful
996 socket.gethostbyname('испытание.python.org')
997 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000998 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
999 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1000 # have a reverse entry yet
1001 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001002
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001003 def check_sendall_interrupted(self, with_timeout):
1004 # socketpair() is not stricly required, but it makes things easier.
1005 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1006 self.skipTest("signal.alarm and socket.socketpair required for this test")
1007 # Our signal handlers clobber the C errno by calling a math function
1008 # with an invalid domain value.
1009 def ok_handler(*args):
1010 self.assertRaises(ValueError, math.acosh, 0)
1011 def raising_handler(*args):
1012 self.assertRaises(ValueError, math.acosh, 0)
1013 1 // 0
1014 c, s = socket.socketpair()
1015 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1016 try:
1017 if with_timeout:
1018 # Just above the one second minimum for signal.alarm
1019 c.settimeout(1.5)
1020 with self.assertRaises(ZeroDivisionError):
1021 signal.alarm(1)
1022 c.sendall(b"x" * (1024**2))
1023 if with_timeout:
1024 signal.signal(signal.SIGALRM, ok_handler)
1025 signal.alarm(1)
1026 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1027 finally:
1028 signal.signal(signal.SIGALRM, old_alarm)
1029 c.close()
1030 s.close()
1031
1032 def test_sendall_interrupted(self):
1033 self.check_sendall_interrupted(False)
1034
1035 def test_sendall_interrupted_with_timeout(self):
1036 self.check_sendall_interrupted(True)
1037
Antoine Pitroue033e062010-10-29 10:38:18 +00001038 def test_dealloc_warn(self):
1039 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1040 r = repr(sock)
1041 with self.assertWarns(ResourceWarning) as cm:
1042 sock = None
1043 support.gc_collect()
1044 self.assertIn(r, str(cm.warning.args[0]))
1045 # An open socket file object gets dereferenced after the socket
1046 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1047 f = sock.makefile('rb')
1048 r = repr(sock)
1049 sock = None
1050 support.gc_collect()
1051 with self.assertWarns(ResourceWarning):
1052 f = None
1053 support.gc_collect()
1054
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001055 def test_name_closed_socketio(self):
1056 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1057 fp = sock.makefile("rb")
1058 fp.close()
1059 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1060
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001061 def test_pickle(self):
1062 sock = socket.socket()
1063 with sock:
1064 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1065 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1066
Antoine Pitrou3cade992011-05-10 19:19:13 +02001067 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001068 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1069 srv.bind((HOST, 0))
1070 # backlog = 0
1071 srv.listen(0)
1072 srv.close()
1073
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001074
Victor Stinner45df8202010-04-28 22:31:17 +00001075@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001076class BasicTCPTest(SocketConnectedTest):
1077
1078 def __init__(self, methodName='runTest'):
1079 SocketConnectedTest.__init__(self, methodName=methodName)
1080
1081 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001082 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001083 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001084 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001085
1086 def _testRecv(self):
1087 self.serv_conn.send(MSG)
1088
1089 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001090 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001091 seg1 = self.cli_conn.recv(len(MSG) - 3)
1092 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001093 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001094 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001095
1096 def _testOverFlowRecv(self):
1097 self.serv_conn.send(MSG)
1098
1099 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001100 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001101 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001102 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001103
1104 def _testRecvFrom(self):
1105 self.serv_conn.send(MSG)
1106
1107 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001108 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001109 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1110 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001111 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001112 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001113
1114 def _testOverFlowRecvFrom(self):
1115 self.serv_conn.send(MSG)
1116
1117 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001118 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001119 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001120 while 1:
1121 read = self.cli_conn.recv(1024)
1122 if not read:
1123 break
Guido van Rossume531e292002-08-08 20:28:34 +00001124 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001125 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126
1127 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001128 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001129 self.serv_conn.sendall(big_chunk)
1130
1131 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001132 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001133 fd = self.cli_conn.fileno()
1134 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001135 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001136 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001137 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001138 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001139
1140 def _testFromFd(self):
1141 self.serv_conn.send(MSG)
1142
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001143 def testDup(self):
1144 # Testing dup()
1145 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001146 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001147 msg = sock.recv(1024)
1148 self.assertEqual(msg, MSG)
1149
1150 def _testDup(self):
1151 self.serv_conn.send(MSG)
1152
Guido van Rossum24e4af82002-06-12 19:18:08 +00001153 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001154 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001156 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001157 # wait for _testShutdown to finish: on OS X, when the server
1158 # closes the connection the client also becomes disconnected,
1159 # and the client's shutdown call will fail. (Issue #4397.)
1160 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001161
1162 def _testShutdown(self):
1163 self.serv_conn.send(MSG)
1164 self.serv_conn.shutdown(2)
1165
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001166 def testDetach(self):
1167 # Testing detach()
1168 fileno = self.cli_conn.fileno()
1169 f = self.cli_conn.detach()
1170 self.assertEqual(f, fileno)
1171 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001172 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1173 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001174 # ...but we can create another socket using the (still open)
1175 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001176 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001177 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001178 msg = sock.recv(1024)
1179 self.assertEqual(msg, MSG)
1180
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001181 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001182 self.serv_conn.send(MSG)
1183
Victor Stinner45df8202010-04-28 22:31:17 +00001184@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001185class BasicUDPTest(ThreadedUDPSocketTest):
1186
1187 def __init__(self, methodName='runTest'):
1188 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1189
1190 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001191 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001192 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001193 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001194
1195 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001196 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001197
Guido van Rossum1c938012002-06-12 21:17:20 +00001198 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001199 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001200 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001201 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001202
Guido van Rossum1c938012002-06-12 21:17:20 +00001203 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001204 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001205
Guido van Rossumd8faa362007-04-27 19:54:29 +00001206 def testRecvFromNegative(self):
1207 # Negative lengths passed to recvfrom should give ValueError.
1208 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1209
1210 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001211 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001212
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001213
1214# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1215# same test code is used with different families and types of socket
1216# (e.g. stream, datagram), and tests using recvmsg() are repeated
1217# using recvmsg_into().
1218#
1219# The generic test classes such as SendmsgTests and
1220# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1221# supplied with sockets cli_sock and serv_sock representing the
1222# client's and the server's end of the connection respectively, and
1223# attributes cli_addr and serv_addr holding their (numeric where
1224# appropriate) addresses.
1225#
1226# The final concrete test classes combine these with subclasses of
1227# SocketTestBase which set up client and server sockets of a specific
1228# type, and with subclasses of SendrecvmsgBase such as
1229# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1230# sockets to cli_sock and serv_sock and override the methods and
1231# attributes of SendrecvmsgBase to fill in destination addresses if
1232# needed when sending, check for specific flags in msg_flags, etc.
1233#
1234# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1235# recvmsg_into().
1236
1237# XXX: like the other datagram (UDP) tests in this module, the code
1238# here assumes that datagram delivery on the local machine will be
1239# reliable.
1240
1241class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1242 # Base class for sendmsg()/recvmsg() tests.
1243
1244 # Time in seconds to wait before considering a test failed, or
1245 # None for no timeout. Not all tests actually set a timeout.
1246 fail_timeout = 3.0
1247
1248 def setUp(self):
1249 self.misc_event = threading.Event()
1250 super().setUp()
1251
1252 def sendToServer(self, msg):
1253 # Send msg to the server.
1254 return self.cli_sock.send(msg)
1255
1256 # Tuple of alternative default arguments for sendmsg() when called
1257 # via sendmsgToServer() (e.g. to include a destination address).
1258 sendmsg_to_server_defaults = ()
1259
1260 def sendmsgToServer(self, *args):
1261 # Call sendmsg() on self.cli_sock with the given arguments,
1262 # filling in any arguments which are not supplied with the
1263 # corresponding items of self.sendmsg_to_server_defaults, if
1264 # any.
1265 return self.cli_sock.sendmsg(
1266 *(args + self.sendmsg_to_server_defaults[len(args):]))
1267
1268 def doRecvmsg(self, sock, bufsize, *args):
1269 # Call recvmsg() on sock with given arguments and return its
1270 # result. Should be used for tests which can use either
1271 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1272 # this method with one which emulates it using recvmsg_into(),
1273 # thus allowing the same test to be used for both methods.
1274 result = sock.recvmsg(bufsize, *args)
1275 self.registerRecvmsgResult(result)
1276 return result
1277
1278 def registerRecvmsgResult(self, result):
1279 # Called by doRecvmsg() with the return value of recvmsg() or
1280 # recvmsg_into(). Can be overridden to arrange cleanup based
1281 # on the returned ancillary data, for instance.
1282 pass
1283
1284 def checkRecvmsgAddress(self, addr1, addr2):
1285 # Called to compare the received address with the address of
1286 # the peer.
1287 self.assertEqual(addr1, addr2)
1288
1289 # Flags that are normally unset in msg_flags
1290 msg_flags_common_unset = 0
1291 for name in ("MSG_CTRUNC", "MSG_OOB"):
1292 msg_flags_common_unset |= getattr(socket, name, 0)
1293
1294 # Flags that are normally set
1295 msg_flags_common_set = 0
1296
1297 # Flags set when a complete record has been received (e.g. MSG_EOR
1298 # for SCTP)
1299 msg_flags_eor_indicator = 0
1300
1301 # Flags set when a complete record has not been received
1302 # (e.g. MSG_TRUNC for datagram sockets)
1303 msg_flags_non_eor_indicator = 0
1304
1305 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1306 # Method to check the value of msg_flags returned by recvmsg[_into]().
1307 #
1308 # Checks that all bits in msg_flags_common_set attribute are
1309 # set in "flags" and all bits in msg_flags_common_unset are
1310 # unset.
1311 #
1312 # The "eor" argument specifies whether the flags should
1313 # indicate that a full record (or datagram) has been received.
1314 # If "eor" is None, no checks are done; otherwise, checks
1315 # that:
1316 #
1317 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1318 # set and all bits in msg_flags_non_eor_indicator are unset
1319 #
1320 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1321 # are set and all bits in msg_flags_eor_indicator are unset
1322 #
1323 # If "checkset" and/or "checkunset" are supplied, they require
1324 # the given bits to be set or unset respectively, overriding
1325 # what the attributes require for those bits.
1326 #
1327 # If any bits are set in "ignore", they will not be checked,
1328 # regardless of the other inputs.
1329 #
1330 # Will raise Exception if the inputs require a bit to be both
1331 # set and unset, and it is not ignored.
1332
1333 defaultset = self.msg_flags_common_set
1334 defaultunset = self.msg_flags_common_unset
1335
1336 if eor:
1337 defaultset |= self.msg_flags_eor_indicator
1338 defaultunset |= self.msg_flags_non_eor_indicator
1339 elif eor is not None:
1340 defaultset |= self.msg_flags_non_eor_indicator
1341 defaultunset |= self.msg_flags_eor_indicator
1342
1343 # Function arguments override defaults
1344 defaultset &= ~checkunset
1345 defaultunset &= ~checkset
1346
1347 # Merge arguments with remaining defaults, and check for conflicts
1348 checkset |= defaultset
1349 checkunset |= defaultunset
1350 inboth = checkset & checkunset & ~ignore
1351 if inboth:
1352 raise Exception("contradictory set, unset requirements for flags "
1353 "{0:#x}".format(inboth))
1354
1355 # Compare with given msg_flags value
1356 mask = (checkset | checkunset) & ~ignore
1357 self.assertEqual(flags & mask, checkset & mask)
1358
1359
1360class RecvmsgIntoMixin(SendrecvmsgBase):
1361 # Mixin to implement doRecvmsg() using recvmsg_into().
1362
1363 def doRecvmsg(self, sock, bufsize, *args):
1364 buf = bytearray(bufsize)
1365 result = sock.recvmsg_into([buf], *args)
1366 self.registerRecvmsgResult(result)
1367 self.assertGreaterEqual(result[0], 0)
1368 self.assertLessEqual(result[0], bufsize)
1369 return (bytes(buf[:result[0]]),) + result[1:]
1370
1371
1372class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1373 # Defines flags to be checked in msg_flags for datagram sockets.
1374
1375 @property
1376 def msg_flags_non_eor_indicator(self):
1377 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1378
1379
1380class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1381 # Defines flags to be checked in msg_flags for SCTP sockets.
1382
1383 @property
1384 def msg_flags_eor_indicator(self):
1385 return super().msg_flags_eor_indicator | socket.MSG_EOR
1386
1387
1388class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1389 # Base class for tests on connectionless-mode sockets. Users must
1390 # supply sockets on attributes cli and serv to be mapped to
1391 # cli_sock and serv_sock respectively.
1392
1393 @property
1394 def serv_sock(self):
1395 return self.serv
1396
1397 @property
1398 def cli_sock(self):
1399 return self.cli
1400
1401 @property
1402 def sendmsg_to_server_defaults(self):
1403 return ([], [], 0, self.serv_addr)
1404
1405 def sendToServer(self, msg):
1406 return self.cli_sock.sendto(msg, self.serv_addr)
1407
1408
1409class SendrecvmsgConnectedBase(SendrecvmsgBase):
1410 # Base class for tests on connected sockets. Users must supply
1411 # sockets on attributes serv_conn and cli_conn (representing the
1412 # connections *to* the server and the client), to be mapped to
1413 # cli_sock and serv_sock respectively.
1414
1415 @property
1416 def serv_sock(self):
1417 return self.cli_conn
1418
1419 @property
1420 def cli_sock(self):
1421 return self.serv_conn
1422
1423 def checkRecvmsgAddress(self, addr1, addr2):
1424 # Address is currently "unspecified" for a connected socket,
1425 # so we don't examine it
1426 pass
1427
1428
1429class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1430 # Base class to set a timeout on server's socket.
1431
1432 def setUp(self):
1433 super().setUp()
1434 self.serv_sock.settimeout(self.fail_timeout)
1435
1436
1437class SendmsgTests(SendrecvmsgServerTimeoutBase):
1438 # Tests for sendmsg() which can use any socket type and do not
1439 # involve recvmsg() or recvmsg_into().
1440
1441 def testSendmsg(self):
1442 # Send a simple message with sendmsg().
1443 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1444
1445 def _testSendmsg(self):
1446 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1447
1448 def testSendmsgDataGenerator(self):
1449 # Send from buffer obtained from a generator (not a sequence).
1450 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1451
1452 def _testSendmsgDataGenerator(self):
1453 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1454 len(MSG))
1455
1456 def testSendmsgAncillaryGenerator(self):
1457 # Gather (empty) ancillary data from a generator.
1458 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1459
1460 def _testSendmsgAncillaryGenerator(self):
1461 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1462 len(MSG))
1463
1464 def testSendmsgArray(self):
1465 # Send data from an array instead of the usual bytes object.
1466 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1467
1468 def _testSendmsgArray(self):
1469 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1470 len(MSG))
1471
1472 def testSendmsgGather(self):
1473 # Send message data from more than one buffer (gather write).
1474 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1475
1476 def _testSendmsgGather(self):
1477 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1478
1479 def testSendmsgBadArgs(self):
1480 # Check that sendmsg() rejects invalid arguments.
1481 self.assertEqual(self.serv_sock.recv(1000), b"done")
1482
1483 def _testSendmsgBadArgs(self):
1484 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1485 self.assertRaises(TypeError, self.sendmsgToServer,
1486 b"not in an iterable")
1487 self.assertRaises(TypeError, self.sendmsgToServer,
1488 object())
1489 self.assertRaises(TypeError, self.sendmsgToServer,
1490 [object()])
1491 self.assertRaises(TypeError, self.sendmsgToServer,
1492 [MSG, object()])
1493 self.assertRaises(TypeError, self.sendmsgToServer,
1494 [MSG], object())
1495 self.assertRaises(TypeError, self.sendmsgToServer,
1496 [MSG], [], object())
1497 self.assertRaises(TypeError, self.sendmsgToServer,
1498 [MSG], [], 0, object())
1499 self.sendToServer(b"done")
1500
1501 def testSendmsgBadCmsg(self):
1502 # Check that invalid ancillary data items are rejected.
1503 self.assertEqual(self.serv_sock.recv(1000), b"done")
1504
1505 def _testSendmsgBadCmsg(self):
1506 self.assertRaises(TypeError, self.sendmsgToServer,
1507 [MSG], [object()])
1508 self.assertRaises(TypeError, self.sendmsgToServer,
1509 [MSG], [(object(), 0, b"data")])
1510 self.assertRaises(TypeError, self.sendmsgToServer,
1511 [MSG], [(0, object(), b"data")])
1512 self.assertRaises(TypeError, self.sendmsgToServer,
1513 [MSG], [(0, 0, object())])
1514 self.assertRaises(TypeError, self.sendmsgToServer,
1515 [MSG], [(0, 0)])
1516 self.assertRaises(TypeError, self.sendmsgToServer,
1517 [MSG], [(0, 0, b"data", 42)])
1518 self.sendToServer(b"done")
1519
1520 @requireAttrs(socket, "CMSG_SPACE")
1521 def testSendmsgBadMultiCmsg(self):
1522 # Check that invalid ancillary data items are rejected when
1523 # more than one item is present.
1524 self.assertEqual(self.serv_sock.recv(1000), b"done")
1525
1526 @testSendmsgBadMultiCmsg.client_skip
1527 def _testSendmsgBadMultiCmsg(self):
1528 self.assertRaises(TypeError, self.sendmsgToServer,
1529 [MSG], [0, 0, b""])
1530 self.assertRaises(TypeError, self.sendmsgToServer,
1531 [MSG], [(0, 0, b""), object()])
1532 self.sendToServer(b"done")
1533
1534 def testSendmsgExcessCmsgReject(self):
1535 # Check that sendmsg() rejects excess ancillary data items
1536 # when the number that can be sent is limited.
1537 self.assertEqual(self.serv_sock.recv(1000), b"done")
1538
1539 def _testSendmsgExcessCmsgReject(self):
1540 if not hasattr(socket, "CMSG_SPACE"):
1541 # Can only send one item
1542 with self.assertRaises(socket.error) as cm:
1543 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1544 self.assertIsNone(cm.exception.errno)
1545 self.sendToServer(b"done")
1546
1547 def testSendmsgAfterClose(self):
1548 # Check that sendmsg() fails on a closed socket.
1549 pass
1550
1551 def _testSendmsgAfterClose(self):
1552 self.cli_sock.close()
1553 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1554
1555
1556class SendmsgStreamTests(SendmsgTests):
1557 # Tests for sendmsg() which require a stream socket and do not
1558 # involve recvmsg() or recvmsg_into().
1559
1560 def testSendmsgExplicitNoneAddr(self):
1561 # Check that peer address can be specified as None.
1562 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1563
1564 def _testSendmsgExplicitNoneAddr(self):
1565 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1566
1567 def testSendmsgTimeout(self):
1568 # Check that timeout works with sendmsg().
1569 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1570 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1571
1572 def _testSendmsgTimeout(self):
1573 try:
1574 self.cli_sock.settimeout(0.03)
1575 with self.assertRaises(socket.timeout):
1576 while True:
1577 self.sendmsgToServer([b"a"*512])
1578 finally:
1579 self.misc_event.set()
1580
1581 # XXX: would be nice to have more tests for sendmsg flags argument.
1582
1583 # Linux supports MSG_DONTWAIT when sending, but in general, it
1584 # only works when receiving. Could add other platforms if they
1585 # support it too.
1586 @skipWithClientIf(sys.platform not in {"linux2"},
1587 "MSG_DONTWAIT not known to work on this platform when "
1588 "sending")
1589 def testSendmsgDontWait(self):
1590 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1591 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1592 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1593
1594 @testSendmsgDontWait.client_skip
1595 def _testSendmsgDontWait(self):
1596 try:
1597 with self.assertRaises(socket.error) as cm:
1598 while True:
1599 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1600 self.assertIn(cm.exception.errno,
1601 (errno.EAGAIN, errno.EWOULDBLOCK))
1602 finally:
1603 self.misc_event.set()
1604
1605
1606class SendmsgConnectionlessTests(SendmsgTests):
1607 # Tests for sendmsg() which require a connectionless-mode
1608 # (e.g. datagram) socket, and do not involve recvmsg() or
1609 # recvmsg_into().
1610
1611 def testSendmsgNoDestAddr(self):
1612 # Check that sendmsg() fails when no destination address is
1613 # given for unconnected socket.
1614 pass
1615
1616 def _testSendmsgNoDestAddr(self):
1617 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1618 [MSG])
1619 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1620 [MSG], [], 0, None)
1621
1622
1623class RecvmsgGenericTests(SendrecvmsgBase):
1624 # Tests for recvmsg() which can also be emulated using
1625 # recvmsg_into(), and can use any socket type.
1626
1627 def testRecvmsg(self):
1628 # Receive a simple message with recvmsg[_into]().
1629 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1630 self.assertEqual(msg, MSG)
1631 self.checkRecvmsgAddress(addr, self.cli_addr)
1632 self.assertEqual(ancdata, [])
1633 self.checkFlags(flags, eor=True)
1634
1635 def _testRecvmsg(self):
1636 self.sendToServer(MSG)
1637
1638 def testRecvmsgExplicitDefaults(self):
1639 # Test recvmsg[_into]() with default arguments provided explicitly.
1640 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1641 len(MSG), 0, 0)
1642 self.assertEqual(msg, MSG)
1643 self.checkRecvmsgAddress(addr, self.cli_addr)
1644 self.assertEqual(ancdata, [])
1645 self.checkFlags(flags, eor=True)
1646
1647 def _testRecvmsgExplicitDefaults(self):
1648 self.sendToServer(MSG)
1649
1650 def testRecvmsgShorter(self):
1651 # Receive a message smaller than buffer.
1652 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1653 len(MSG) + 42)
1654 self.assertEqual(msg, MSG)
1655 self.checkRecvmsgAddress(addr, self.cli_addr)
1656 self.assertEqual(ancdata, [])
1657 self.checkFlags(flags, eor=True)
1658
1659 def _testRecvmsgShorter(self):
1660 self.sendToServer(MSG)
1661
Charles-François Natali8619cd72011-10-03 19:43:15 +02001662 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
1663 # datagram is received (issue #13001).
1664 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001665 def testRecvmsgTrunc(self):
1666 # Receive part of message, check for truncation indicators.
1667 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1668 len(MSG) - 3)
1669 self.assertEqual(msg, MSG[:-3])
1670 self.checkRecvmsgAddress(addr, self.cli_addr)
1671 self.assertEqual(ancdata, [])
1672 self.checkFlags(flags, eor=False)
1673
Charles-François Natali8619cd72011-10-03 19:43:15 +02001674 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001675 def _testRecvmsgTrunc(self):
1676 self.sendToServer(MSG)
1677
1678 def testRecvmsgShortAncillaryBuf(self):
1679 # Test ancillary data buffer too small to hold any ancillary data.
1680 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1681 len(MSG), 1)
1682 self.assertEqual(msg, MSG)
1683 self.checkRecvmsgAddress(addr, self.cli_addr)
1684 self.assertEqual(ancdata, [])
1685 self.checkFlags(flags, eor=True)
1686
1687 def _testRecvmsgShortAncillaryBuf(self):
1688 self.sendToServer(MSG)
1689
1690 def testRecvmsgLongAncillaryBuf(self):
1691 # Test large ancillary data buffer.
1692 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1693 len(MSG), 10240)
1694 self.assertEqual(msg, MSG)
1695 self.checkRecvmsgAddress(addr, self.cli_addr)
1696 self.assertEqual(ancdata, [])
1697 self.checkFlags(flags, eor=True)
1698
1699 def _testRecvmsgLongAncillaryBuf(self):
1700 self.sendToServer(MSG)
1701
1702 def testRecvmsgAfterClose(self):
1703 # Check that recvmsg[_into]() fails on a closed socket.
1704 self.serv_sock.close()
1705 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
1706
1707 def _testRecvmsgAfterClose(self):
1708 pass
1709
1710 def testRecvmsgTimeout(self):
1711 # Check that timeout works.
1712 try:
1713 self.serv_sock.settimeout(0.03)
1714 self.assertRaises(socket.timeout,
1715 self.doRecvmsg, self.serv_sock, len(MSG))
1716 finally:
1717 self.misc_event.set()
1718
1719 def _testRecvmsgTimeout(self):
1720 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1721
1722 @requireAttrs(socket, "MSG_PEEK")
1723 def testRecvmsgPeek(self):
1724 # Check that MSG_PEEK in flags enables examination of pending
1725 # data without consuming it.
1726
1727 # Receive part of data with MSG_PEEK.
1728 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1729 len(MSG) - 3, 0,
1730 socket.MSG_PEEK)
1731 self.assertEqual(msg, MSG[:-3])
1732 self.checkRecvmsgAddress(addr, self.cli_addr)
1733 self.assertEqual(ancdata, [])
1734 # Ignoring MSG_TRUNC here (so this test is the same for stream
1735 # and datagram sockets). Some wording in POSIX seems to
1736 # suggest that it needn't be set when peeking, but that may
1737 # just be a slip.
1738 self.checkFlags(flags, eor=False,
1739 ignore=getattr(socket, "MSG_TRUNC", 0))
1740
1741 # Receive all data with MSG_PEEK.
1742 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1743 len(MSG), 0,
1744 socket.MSG_PEEK)
1745 self.assertEqual(msg, MSG)
1746 self.checkRecvmsgAddress(addr, self.cli_addr)
1747 self.assertEqual(ancdata, [])
1748 self.checkFlags(flags, eor=True)
1749
1750 # Check that the same data can still be received normally.
1751 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1752 self.assertEqual(msg, MSG)
1753 self.checkRecvmsgAddress(addr, self.cli_addr)
1754 self.assertEqual(ancdata, [])
1755 self.checkFlags(flags, eor=True)
1756
1757 @testRecvmsgPeek.client_skip
1758 def _testRecvmsgPeek(self):
1759 self.sendToServer(MSG)
1760
1761 @requireAttrs(socket.socket, "sendmsg")
1762 def testRecvmsgFromSendmsg(self):
1763 # Test receiving with recvmsg[_into]() when message is sent
1764 # using sendmsg().
1765 self.serv_sock.settimeout(self.fail_timeout)
1766 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1767 self.assertEqual(msg, MSG)
1768 self.checkRecvmsgAddress(addr, self.cli_addr)
1769 self.assertEqual(ancdata, [])
1770 self.checkFlags(flags, eor=True)
1771
1772 @testRecvmsgFromSendmsg.client_skip
1773 def _testRecvmsgFromSendmsg(self):
1774 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1775
1776
1777class RecvmsgGenericStreamTests(RecvmsgGenericTests):
1778 # Tests which require a stream socket and can use either recvmsg()
1779 # or recvmsg_into().
1780
1781 def testRecvmsgEOF(self):
1782 # Receive end-of-stream indicator (b"", peer socket closed).
1783 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1784 self.assertEqual(msg, b"")
1785 self.checkRecvmsgAddress(addr, self.cli_addr)
1786 self.assertEqual(ancdata, [])
1787 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
1788
1789 def _testRecvmsgEOF(self):
1790 self.cli_sock.close()
1791
1792 def testRecvmsgOverflow(self):
1793 # Receive a message in more than one chunk.
1794 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1795 len(MSG) - 3)
1796 self.checkRecvmsgAddress(addr, self.cli_addr)
1797 self.assertEqual(ancdata, [])
1798 self.checkFlags(flags, eor=False)
1799
1800 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1801 self.checkRecvmsgAddress(addr, self.cli_addr)
1802 self.assertEqual(ancdata, [])
1803 self.checkFlags(flags, eor=True)
1804
1805 msg = seg1 + seg2
1806 self.assertEqual(msg, MSG)
1807
1808 def _testRecvmsgOverflow(self):
1809 self.sendToServer(MSG)
1810
1811
1812class RecvmsgTests(RecvmsgGenericTests):
1813 # Tests for recvmsg() which can use any socket type.
1814
1815 def testRecvmsgBadArgs(self):
1816 # Check that recvmsg() rejects invalid arguments.
1817 self.assertRaises(TypeError, self.serv_sock.recvmsg)
1818 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1819 -1, 0, 0)
1820 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1821 len(MSG), -1, 0)
1822 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1823 [bytearray(10)], 0, 0)
1824 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1825 object(), 0, 0)
1826 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1827 len(MSG), object(), 0)
1828 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1829 len(MSG), 0, object())
1830
1831 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
1832 self.assertEqual(msg, MSG)
1833 self.checkRecvmsgAddress(addr, self.cli_addr)
1834 self.assertEqual(ancdata, [])
1835 self.checkFlags(flags, eor=True)
1836
1837 def _testRecvmsgBadArgs(self):
1838 self.sendToServer(MSG)
1839
1840
1841class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
1842 # Tests for recvmsg_into() which can use any socket type.
1843
1844 def testRecvmsgIntoBadArgs(self):
1845 # Check that recvmsg_into() rejects invalid arguments.
1846 buf = bytearray(len(MSG))
1847 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
1848 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1849 len(MSG), 0, 0)
1850 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1851 buf, 0, 0)
1852 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1853 [object()], 0, 0)
1854 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1855 [b"I'm not writable"], 0, 0)
1856 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1857 [buf, object()], 0, 0)
1858 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
1859 [buf], -1, 0)
1860 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1861 [buf], object(), 0)
1862 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1863 [buf], 0, object())
1864
1865 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
1866 self.assertEqual(nbytes, len(MSG))
1867 self.assertEqual(buf, bytearray(MSG))
1868 self.checkRecvmsgAddress(addr, self.cli_addr)
1869 self.assertEqual(ancdata, [])
1870 self.checkFlags(flags, eor=True)
1871
1872 def _testRecvmsgIntoBadArgs(self):
1873 self.sendToServer(MSG)
1874
1875 def testRecvmsgIntoGenerator(self):
1876 # Receive into buffer obtained from a generator (not a sequence).
1877 buf = bytearray(len(MSG))
1878 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
1879 (o for o in [buf]))
1880 self.assertEqual(nbytes, len(MSG))
1881 self.assertEqual(buf, bytearray(MSG))
1882 self.checkRecvmsgAddress(addr, self.cli_addr)
1883 self.assertEqual(ancdata, [])
1884 self.checkFlags(flags, eor=True)
1885
1886 def _testRecvmsgIntoGenerator(self):
1887 self.sendToServer(MSG)
1888
1889 def testRecvmsgIntoArray(self):
1890 # Receive into an array rather than the usual bytearray.
1891 buf = array.array("B", [0] * len(MSG))
1892 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
1893 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02001894 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001895 self.checkRecvmsgAddress(addr, self.cli_addr)
1896 self.assertEqual(ancdata, [])
1897 self.checkFlags(flags, eor=True)
1898
1899 def _testRecvmsgIntoArray(self):
1900 self.sendToServer(MSG)
1901
1902 def testRecvmsgIntoScatter(self):
1903 # Receive into multiple buffers (scatter write).
1904 b1 = bytearray(b"----")
1905 b2 = bytearray(b"0123456789")
1906 b3 = bytearray(b"--------------")
1907 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
1908 [b1, memoryview(b2)[2:9], b3])
1909 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
1910 self.assertEqual(b1, bytearray(b"Mary"))
1911 self.assertEqual(b2, bytearray(b"01 had a 9"))
1912 self.assertEqual(b3, bytearray(b"little lamb---"))
1913 self.checkRecvmsgAddress(addr, self.cli_addr)
1914 self.assertEqual(ancdata, [])
1915 self.checkFlags(flags, eor=True)
1916
1917 def _testRecvmsgIntoScatter(self):
1918 self.sendToServer(b"Mary had a little lamb")
1919
1920
1921class CmsgMacroTests(unittest.TestCase):
1922 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
1923 # assumptions used by sendmsg() and recvmsg[_into](), which share
1924 # code with these functions.
1925
1926 # Match the definition in socketmodule.c
1927 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
1928
1929 @requireAttrs(socket, "CMSG_LEN")
1930 def testCMSG_LEN(self):
1931 # Test CMSG_LEN() with various valid and invalid values,
1932 # checking the assumptions used by recvmsg() and sendmsg().
1933 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
1934 values = list(range(257)) + list(range(toobig - 257, toobig))
1935
1936 # struct cmsghdr has at least three members, two of which are ints
1937 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
1938 for n in values:
1939 ret = socket.CMSG_LEN(n)
1940 # This is how recvmsg() calculates the data size
1941 self.assertEqual(ret - socket.CMSG_LEN(0), n)
1942 self.assertLessEqual(ret, self.socklen_t_limit)
1943
1944 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
1945 # sendmsg() shares code with these functions, and requires
1946 # that it reject values over the limit.
1947 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
1948 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
1949
1950 @requireAttrs(socket, "CMSG_SPACE")
1951 def testCMSG_SPACE(self):
1952 # Test CMSG_SPACE() with various valid and invalid values,
1953 # checking the assumptions used by sendmsg().
1954 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
1955 values = list(range(257)) + list(range(toobig - 257, toobig))
1956
1957 last = socket.CMSG_SPACE(0)
1958 # struct cmsghdr has at least three members, two of which are ints
1959 self.assertGreater(last, array.array("i").itemsize * 2)
1960 for n in values:
1961 ret = socket.CMSG_SPACE(n)
1962 self.assertGreaterEqual(ret, last)
1963 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
1964 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
1965 self.assertLessEqual(ret, self.socklen_t_limit)
1966 last = ret
1967
1968 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
1969 # sendmsg() shares code with these functions, and requires
1970 # that it reject values over the limit.
1971 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
1972 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
1973
1974
1975class SCMRightsTest(SendrecvmsgServerTimeoutBase):
1976 # Tests for file descriptor passing on Unix-domain sockets.
1977
1978 # Invalid file descriptor value that's unlikely to evaluate to a
1979 # real FD even if one of its bytes is replaced with a different
1980 # value (which shouldn't actually happen).
1981 badfd = -0x5555
1982
1983 def newFDs(self, n):
1984 # Return a list of n file descriptors for newly-created files
1985 # containing their list indices as ASCII numbers.
1986 fds = []
1987 for i in range(n):
1988 fd, path = tempfile.mkstemp()
1989 self.addCleanup(os.unlink, path)
1990 self.addCleanup(os.close, fd)
1991 os.write(fd, str(i).encode())
1992 fds.append(fd)
1993 return fds
1994
1995 def checkFDs(self, fds):
1996 # Check that the file descriptors in the given list contain
1997 # their correct list indices as ASCII numbers.
1998 for n, fd in enumerate(fds):
1999 os.lseek(fd, 0, os.SEEK_SET)
2000 self.assertEqual(os.read(fd, 1024), str(n).encode())
2001
2002 def registerRecvmsgResult(self, result):
2003 self.addCleanup(self.closeRecvmsgFDs, result)
2004
2005 def closeRecvmsgFDs(self, recvmsg_result):
2006 # Close all file descriptors specified in the ancillary data
2007 # of the given return value from recvmsg() or recvmsg_into().
2008 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2009 if (cmsg_level == socket.SOL_SOCKET and
2010 cmsg_type == socket.SCM_RIGHTS):
2011 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002012 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002013 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2014 for fd in fds:
2015 os.close(fd)
2016
2017 def createAndSendFDs(self, n):
2018 # Send n new file descriptors created by newFDs() to the
2019 # server, with the constant MSG as the non-ancillary data.
2020 self.assertEqual(
2021 self.sendmsgToServer([MSG],
2022 [(socket.SOL_SOCKET,
2023 socket.SCM_RIGHTS,
2024 array.array("i", self.newFDs(n)))]),
2025 len(MSG))
2026
2027 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2028 # Check that constant MSG was received with numfds file
2029 # descriptors in a maximum of maxcmsgs control messages (which
2030 # must contain only complete integers). By default, check
2031 # that MSG_CTRUNC is unset, but ignore any flags in
2032 # ignoreflags.
2033 msg, ancdata, flags, addr = result
2034 self.assertEqual(msg, MSG)
2035 self.checkRecvmsgAddress(addr, self.cli_addr)
2036 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2037 ignore=ignoreflags)
2038
2039 self.assertIsInstance(ancdata, list)
2040 self.assertLessEqual(len(ancdata), maxcmsgs)
2041 fds = array.array("i")
2042 for item in ancdata:
2043 self.assertIsInstance(item, tuple)
2044 cmsg_level, cmsg_type, cmsg_data = item
2045 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2046 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2047 self.assertIsInstance(cmsg_data, bytes)
2048 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002049 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002050
2051 self.assertEqual(len(fds), numfds)
2052 self.checkFDs(fds)
2053
2054 def testFDPassSimple(self):
2055 # Pass a single FD (array read from bytes object).
2056 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2057 len(MSG), 10240))
2058
2059 def _testFDPassSimple(self):
2060 self.assertEqual(
2061 self.sendmsgToServer(
2062 [MSG],
2063 [(socket.SOL_SOCKET,
2064 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002065 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002066 len(MSG))
2067
2068 def testMultipleFDPass(self):
2069 # Pass multiple FDs in a single array.
2070 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2071 len(MSG), 10240))
2072
2073 def _testMultipleFDPass(self):
2074 self.createAndSendFDs(4)
2075
2076 @requireAttrs(socket, "CMSG_SPACE")
2077 def testFDPassCMSG_SPACE(self):
2078 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2079 self.checkRecvmsgFDs(
2080 4, self.doRecvmsg(self.serv_sock, len(MSG),
2081 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2082
2083 @testFDPassCMSG_SPACE.client_skip
2084 def _testFDPassCMSG_SPACE(self):
2085 self.createAndSendFDs(4)
2086
2087 def testFDPassCMSG_LEN(self):
2088 # Test using CMSG_LEN() to calculate ancillary buffer size.
2089 self.checkRecvmsgFDs(1,
2090 self.doRecvmsg(self.serv_sock, len(MSG),
2091 socket.CMSG_LEN(4 * SIZEOF_INT)),
2092 # RFC 3542 says implementations may set
2093 # MSG_CTRUNC if there isn't enough space
2094 # for trailing padding.
2095 ignoreflags=socket.MSG_CTRUNC)
2096
2097 def _testFDPassCMSG_LEN(self):
2098 self.createAndSendFDs(1)
2099
Nick Coghlan2496f332011-09-19 20:26:31 +10002100 # Issue #12958: The following test has problems on Mac OS X
2101 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002102 @requireAttrs(socket, "CMSG_SPACE")
2103 def testFDPassSeparate(self):
2104 # Pass two FDs in two separate arrays. Arrays may be combined
2105 # into a single control message by the OS.
2106 self.checkRecvmsgFDs(2,
2107 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2108 maxcmsgs=2)
2109
2110 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002111 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002112 def _testFDPassSeparate(self):
2113 fd0, fd1 = self.newFDs(2)
2114 self.assertEqual(
2115 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2116 socket.SCM_RIGHTS,
2117 array.array("i", [fd0])),
2118 (socket.SOL_SOCKET,
2119 socket.SCM_RIGHTS,
2120 array.array("i", [fd1]))]),
2121 len(MSG))
2122
Nick Coghlan2496f332011-09-19 20:26:31 +10002123 # Issue #12958: The following test has problems on Mac OS X
2124 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002125 @requireAttrs(socket, "CMSG_SPACE")
2126 def testFDPassSeparateMinSpace(self):
2127 # Pass two FDs in two separate arrays, receiving them into the
2128 # minimum space for two arrays.
2129 self.checkRecvmsgFDs(2,
2130 self.doRecvmsg(self.serv_sock, len(MSG),
2131 socket.CMSG_SPACE(SIZEOF_INT) +
2132 socket.CMSG_LEN(SIZEOF_INT)),
2133 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2134
2135 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002136 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002137 def _testFDPassSeparateMinSpace(self):
2138 fd0, fd1 = self.newFDs(2)
2139 self.assertEqual(
2140 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2141 socket.SCM_RIGHTS,
2142 array.array("i", [fd0])),
2143 (socket.SOL_SOCKET,
2144 socket.SCM_RIGHTS,
2145 array.array("i", [fd1]))]),
2146 len(MSG))
2147
2148 def sendAncillaryIfPossible(self, msg, ancdata):
2149 # Try to send msg and ancdata to server, but if the system
2150 # call fails, just send msg with no ancillary data.
2151 try:
2152 nbytes = self.sendmsgToServer([msg], ancdata)
2153 except socket.error as e:
2154 # Check that it was the system call that failed
2155 self.assertIsInstance(e.errno, int)
2156 nbytes = self.sendmsgToServer([msg])
2157 self.assertEqual(nbytes, len(msg))
2158
2159 def testFDPassEmpty(self):
2160 # Try to pass an empty FD array. Can receive either no array
2161 # or an empty array.
2162 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2163 len(MSG), 10240),
2164 ignoreflags=socket.MSG_CTRUNC)
2165
2166 def _testFDPassEmpty(self):
2167 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2168 socket.SCM_RIGHTS,
2169 b"")])
2170
2171 def testFDPassPartialInt(self):
2172 # Try to pass a truncated FD array.
2173 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2174 len(MSG), 10240)
2175 self.assertEqual(msg, MSG)
2176 self.checkRecvmsgAddress(addr, self.cli_addr)
2177 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2178 self.assertLessEqual(len(ancdata), 1)
2179 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2180 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2181 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2182 self.assertLess(len(cmsg_data), SIZEOF_INT)
2183
2184 def _testFDPassPartialInt(self):
2185 self.sendAncillaryIfPossible(
2186 MSG,
2187 [(socket.SOL_SOCKET,
2188 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002189 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002190
2191 @requireAttrs(socket, "CMSG_SPACE")
2192 def testFDPassPartialIntInMiddle(self):
2193 # Try to pass two FD arrays, the first of which is truncated.
2194 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2195 len(MSG), 10240)
2196 self.assertEqual(msg, MSG)
2197 self.checkRecvmsgAddress(addr, self.cli_addr)
2198 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2199 self.assertLessEqual(len(ancdata), 2)
2200 fds = array.array("i")
2201 # Arrays may have been combined in a single control message
2202 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2203 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2204 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002205 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002206 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2207 self.assertLessEqual(len(fds), 2)
2208 self.checkFDs(fds)
2209
2210 @testFDPassPartialIntInMiddle.client_skip
2211 def _testFDPassPartialIntInMiddle(self):
2212 fd0, fd1 = self.newFDs(2)
2213 self.sendAncillaryIfPossible(
2214 MSG,
2215 [(socket.SOL_SOCKET,
2216 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002217 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002218 (socket.SOL_SOCKET,
2219 socket.SCM_RIGHTS,
2220 array.array("i", [fd1]))])
2221
2222 def checkTruncatedHeader(self, result, ignoreflags=0):
2223 # Check that no ancillary data items are returned when data is
2224 # truncated inside the cmsghdr structure.
2225 msg, ancdata, flags, addr = result
2226 self.assertEqual(msg, MSG)
2227 self.checkRecvmsgAddress(addr, self.cli_addr)
2228 self.assertEqual(ancdata, [])
2229 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2230 ignore=ignoreflags)
2231
2232 def testCmsgTruncNoBufSize(self):
2233 # Check that no ancillary data is received when no buffer size
2234 # is specified.
2235 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2236 # BSD seems to set MSG_CTRUNC only
2237 # if an item has been partially
2238 # received.
2239 ignoreflags=socket.MSG_CTRUNC)
2240
2241 def _testCmsgTruncNoBufSize(self):
2242 self.createAndSendFDs(1)
2243
2244 def testCmsgTrunc0(self):
2245 # Check that no ancillary data is received when buffer size is 0.
2246 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2247 ignoreflags=socket.MSG_CTRUNC)
2248
2249 def _testCmsgTrunc0(self):
2250 self.createAndSendFDs(1)
2251
2252 # Check that no ancillary data is returned for various non-zero
2253 # (but still too small) buffer sizes.
2254
2255 def testCmsgTrunc1(self):
2256 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2257
2258 def _testCmsgTrunc1(self):
2259 self.createAndSendFDs(1)
2260
2261 def testCmsgTrunc2Int(self):
2262 # The cmsghdr structure has at least three members, two of
2263 # which are ints, so we still shouldn't see any ancillary
2264 # data.
2265 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2266 SIZEOF_INT * 2))
2267
2268 def _testCmsgTrunc2Int(self):
2269 self.createAndSendFDs(1)
2270
2271 def testCmsgTruncLen0Minus1(self):
2272 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2273 socket.CMSG_LEN(0) - 1))
2274
2275 def _testCmsgTruncLen0Minus1(self):
2276 self.createAndSendFDs(1)
2277
2278 # The following tests try to truncate the control message in the
2279 # middle of the FD array.
2280
2281 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2282 # Check that file descriptor data is truncated to between
2283 # mindata and maxdata bytes when received with buffer size
2284 # ancbuf, and that any complete file descriptor numbers are
2285 # valid.
2286 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2287 len(MSG), ancbuf)
2288 self.assertEqual(msg, MSG)
2289 self.checkRecvmsgAddress(addr, self.cli_addr)
2290 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2291
2292 if mindata == 0 and ancdata == []:
2293 return
2294 self.assertEqual(len(ancdata), 1)
2295 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2296 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2297 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2298 self.assertGreaterEqual(len(cmsg_data), mindata)
2299 self.assertLessEqual(len(cmsg_data), maxdata)
2300 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002301 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002302 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2303 self.checkFDs(fds)
2304
2305 def testCmsgTruncLen0(self):
2306 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2307
2308 def _testCmsgTruncLen0(self):
2309 self.createAndSendFDs(1)
2310
2311 def testCmsgTruncLen0Plus1(self):
2312 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2313
2314 def _testCmsgTruncLen0Plus1(self):
2315 self.createAndSendFDs(2)
2316
2317 def testCmsgTruncLen1(self):
2318 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2319 maxdata=SIZEOF_INT)
2320
2321 def _testCmsgTruncLen1(self):
2322 self.createAndSendFDs(2)
2323
2324 def testCmsgTruncLen2Minus1(self):
2325 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2326 maxdata=(2 * SIZEOF_INT) - 1)
2327
2328 def _testCmsgTruncLen2Minus1(self):
2329 self.createAndSendFDs(2)
2330
2331
2332class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2333 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2334 # features of the RFC 3542 Advanced Sockets API for IPv6.
2335 # Currently we can only handle certain data items (e.g. traffic
2336 # class, hop limit, MTU discovery and fragmentation settings)
2337 # without resorting to unportable means such as the struct module,
2338 # but the tests here are aimed at testing the ancillary data
2339 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2340 # itself.
2341
2342 # Test value to use when setting hop limit of packet
2343 hop_limit = 2
2344
2345 # Test value to use when setting traffic class of packet.
2346 # -1 means "use kernel default".
2347 traffic_class = -1
2348
2349 def ancillaryMapping(self, ancdata):
2350 # Given ancillary data list ancdata, return a mapping from
2351 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2352 # Check that no (level, type) pair appears more than once.
2353 d = {}
2354 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2355 self.assertNotIn((cmsg_level, cmsg_type), d)
2356 d[(cmsg_level, cmsg_type)] = cmsg_data
2357 return d
2358
2359 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2360 # Receive hop limit into ancbufsize bytes of ancillary data
2361 # space. Check that data is MSG, ancillary data is not
2362 # truncated (but ignore any flags in ignoreflags), and hop
2363 # limit is between 0 and maxhop inclusive.
2364 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2365 socket.IPV6_RECVHOPLIMIT, 1)
2366 self.misc_event.set()
2367 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2368 len(MSG), ancbufsize)
2369
2370 self.assertEqual(msg, MSG)
2371 self.checkRecvmsgAddress(addr, self.cli_addr)
2372 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2373 ignore=ignoreflags)
2374
2375 self.assertEqual(len(ancdata), 1)
2376 self.assertIsInstance(ancdata[0], tuple)
2377 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2378 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2379 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2380 self.assertIsInstance(cmsg_data, bytes)
2381 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2382 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002383 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002384 self.assertGreaterEqual(a[0], 0)
2385 self.assertLessEqual(a[0], maxhop)
2386
2387 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2388 def testRecvHopLimit(self):
2389 # Test receiving the packet hop limit as ancillary data.
2390 self.checkHopLimit(ancbufsize=10240)
2391
2392 @testRecvHopLimit.client_skip
2393 def _testRecvHopLimit(self):
2394 # Need to wait until server has asked to receive ancillary
2395 # data, as implementations are not required to buffer it
2396 # otherwise.
2397 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2398 self.sendToServer(MSG)
2399
2400 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2401 def testRecvHopLimitCMSG_SPACE(self):
2402 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2403 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2404
2405 @testRecvHopLimitCMSG_SPACE.client_skip
2406 def _testRecvHopLimitCMSG_SPACE(self):
2407 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2408 self.sendToServer(MSG)
2409
2410 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2411 # 3542 says portable applications must provide space for trailing
2412 # padding. Implementations may set MSG_CTRUNC if there isn't
2413 # enough space for the padding.
2414
2415 @requireAttrs(socket.socket, "sendmsg")
2416 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2417 def testSetHopLimit(self):
2418 # Test setting hop limit on outgoing packet and receiving it
2419 # at the other end.
2420 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2421
2422 @testSetHopLimit.client_skip
2423 def _testSetHopLimit(self):
2424 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2425 self.assertEqual(
2426 self.sendmsgToServer([MSG],
2427 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2428 array.array("i", [self.hop_limit]))]),
2429 len(MSG))
2430
2431 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2432 ignoreflags=0):
2433 # Receive traffic class and hop limit into ancbufsize bytes of
2434 # ancillary data space. Check that data is MSG, ancillary
2435 # data is not truncated (but ignore any flags in ignoreflags),
2436 # and traffic class and hop limit are in range (hop limit no
2437 # more than maxhop).
2438 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2439 socket.IPV6_RECVHOPLIMIT, 1)
2440 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2441 socket.IPV6_RECVTCLASS, 1)
2442 self.misc_event.set()
2443 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2444 len(MSG), ancbufsize)
2445
2446 self.assertEqual(msg, MSG)
2447 self.checkRecvmsgAddress(addr, self.cli_addr)
2448 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2449 ignore=ignoreflags)
2450 self.assertEqual(len(ancdata), 2)
2451 ancmap = self.ancillaryMapping(ancdata)
2452
2453 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2454 self.assertEqual(len(tcdata), SIZEOF_INT)
2455 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002456 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002457 self.assertGreaterEqual(a[0], 0)
2458 self.assertLessEqual(a[0], 255)
2459
2460 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2461 self.assertEqual(len(hldata), SIZEOF_INT)
2462 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002463 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002464 self.assertGreaterEqual(a[0], 0)
2465 self.assertLessEqual(a[0], maxhop)
2466
2467 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2468 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2469 def testRecvTrafficClassAndHopLimit(self):
2470 # Test receiving traffic class and hop limit as ancillary data.
2471 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2472
2473 @testRecvTrafficClassAndHopLimit.client_skip
2474 def _testRecvTrafficClassAndHopLimit(self):
2475 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2476 self.sendToServer(MSG)
2477
2478 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2479 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2480 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2481 # Test receiving traffic class and hop limit, using
2482 # CMSG_SPACE() to calculate buffer size.
2483 self.checkTrafficClassAndHopLimit(
2484 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2485
2486 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2487 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2488 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2489 self.sendToServer(MSG)
2490
2491 @requireAttrs(socket.socket, "sendmsg")
2492 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2493 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2494 def testSetTrafficClassAndHopLimit(self):
2495 # Test setting traffic class and hop limit on outgoing packet,
2496 # and receiving them at the other end.
2497 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2498 maxhop=self.hop_limit)
2499
2500 @testSetTrafficClassAndHopLimit.client_skip
2501 def _testSetTrafficClassAndHopLimit(self):
2502 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2503 self.assertEqual(
2504 self.sendmsgToServer([MSG],
2505 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2506 array.array("i", [self.traffic_class])),
2507 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2508 array.array("i", [self.hop_limit]))]),
2509 len(MSG))
2510
2511 @requireAttrs(socket.socket, "sendmsg")
2512 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2513 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2514 def testOddCmsgSize(self):
2515 # Try to send ancillary data with first item one byte too
2516 # long. Fall back to sending with correct size if this fails,
2517 # and check that second item was handled correctly.
2518 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2519 maxhop=self.hop_limit)
2520
2521 @testOddCmsgSize.client_skip
2522 def _testOddCmsgSize(self):
2523 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2524 try:
2525 nbytes = self.sendmsgToServer(
2526 [MSG],
2527 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002528 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002529 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2530 array.array("i", [self.hop_limit]))])
2531 except socket.error as e:
2532 self.assertIsInstance(e.errno, int)
2533 nbytes = self.sendmsgToServer(
2534 [MSG],
2535 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2536 array.array("i", [self.traffic_class])),
2537 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2538 array.array("i", [self.hop_limit]))])
2539 self.assertEqual(nbytes, len(MSG))
2540
2541 # Tests for proper handling of truncated ancillary data
2542
2543 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2544 # Receive hop limit into ancbufsize bytes of ancillary data
2545 # space, which should be too small to contain the ancillary
2546 # data header (if ancbufsize is None, pass no second argument
2547 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2548 # (unless included in ignoreflags), and no ancillary data is
2549 # returned.
2550 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2551 socket.IPV6_RECVHOPLIMIT, 1)
2552 self.misc_event.set()
2553 args = () if ancbufsize is None else (ancbufsize,)
2554 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2555 len(MSG), *args)
2556
2557 self.assertEqual(msg, MSG)
2558 self.checkRecvmsgAddress(addr, self.cli_addr)
2559 self.assertEqual(ancdata, [])
2560 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2561 ignore=ignoreflags)
2562
2563 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2564 def testCmsgTruncNoBufSize(self):
2565 # Check that no ancillary data is received when no ancillary
2566 # buffer size is provided.
2567 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2568 # BSD seems to set
2569 # MSG_CTRUNC only if an item
2570 # has been partially
2571 # received.
2572 ignoreflags=socket.MSG_CTRUNC)
2573
2574 @testCmsgTruncNoBufSize.client_skip
2575 def _testCmsgTruncNoBufSize(self):
2576 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2577 self.sendToServer(MSG)
2578
2579 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2580 def testSingleCmsgTrunc0(self):
2581 # Check that no ancillary data is received when ancillary
2582 # buffer size is zero.
2583 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2584 ignoreflags=socket.MSG_CTRUNC)
2585
2586 @testSingleCmsgTrunc0.client_skip
2587 def _testSingleCmsgTrunc0(self):
2588 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2589 self.sendToServer(MSG)
2590
2591 # Check that no ancillary data is returned for various non-zero
2592 # (but still too small) buffer sizes.
2593
2594 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2595 def testSingleCmsgTrunc1(self):
2596 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2597
2598 @testSingleCmsgTrunc1.client_skip
2599 def _testSingleCmsgTrunc1(self):
2600 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2601 self.sendToServer(MSG)
2602
2603 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2604 def testSingleCmsgTrunc2Int(self):
2605 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
2606
2607 @testSingleCmsgTrunc2Int.client_skip
2608 def _testSingleCmsgTrunc2Int(self):
2609 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2610 self.sendToServer(MSG)
2611
2612 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2613 def testSingleCmsgTruncLen0Minus1(self):
2614 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
2615
2616 @testSingleCmsgTruncLen0Minus1.client_skip
2617 def _testSingleCmsgTruncLen0Minus1(self):
2618 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2619 self.sendToServer(MSG)
2620
2621 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2622 def testSingleCmsgTruncInData(self):
2623 # Test truncation of a control message inside its associated
2624 # data. The message may be returned with its data truncated,
2625 # or not returned at all.
2626 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2627 socket.IPV6_RECVHOPLIMIT, 1)
2628 self.misc_event.set()
2629 msg, ancdata, flags, addr = self.doRecvmsg(
2630 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
2631
2632 self.assertEqual(msg, MSG)
2633 self.checkRecvmsgAddress(addr, self.cli_addr)
2634 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2635
2636 self.assertLessEqual(len(ancdata), 1)
2637 if ancdata:
2638 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2639 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2640 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2641 self.assertLess(len(cmsg_data), SIZEOF_INT)
2642
2643 @testSingleCmsgTruncInData.client_skip
2644 def _testSingleCmsgTruncInData(self):
2645 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2646 self.sendToServer(MSG)
2647
2648 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
2649 # Receive traffic class and hop limit into ancbufsize bytes of
2650 # ancillary data space, which should be large enough to
2651 # contain the first item, but too small to contain the header
2652 # of the second. Check that data is MSG, MSG_CTRUNC is set
2653 # (unless included in ignoreflags), and only one ancillary
2654 # data item is returned.
2655 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2656 socket.IPV6_RECVHOPLIMIT, 1)
2657 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2658 socket.IPV6_RECVTCLASS, 1)
2659 self.misc_event.set()
2660 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2661 len(MSG), ancbufsize)
2662
2663 self.assertEqual(msg, MSG)
2664 self.checkRecvmsgAddress(addr, self.cli_addr)
2665 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2666 ignore=ignoreflags)
2667
2668 self.assertEqual(len(ancdata), 1)
2669 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2670 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2671 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
2672 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2673 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002674 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002675 self.assertGreaterEqual(a[0], 0)
2676 self.assertLessEqual(a[0], 255)
2677
2678 # Try the above test with various buffer sizes.
2679
2680 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2681 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2682 def testSecondCmsgTrunc0(self):
2683 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
2684 ignoreflags=socket.MSG_CTRUNC)
2685
2686 @testSecondCmsgTrunc0.client_skip
2687 def _testSecondCmsgTrunc0(self):
2688 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2689 self.sendToServer(MSG)
2690
2691 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2692 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2693 def testSecondCmsgTrunc1(self):
2694 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
2695
2696 @testSecondCmsgTrunc1.client_skip
2697 def _testSecondCmsgTrunc1(self):
2698 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2699 self.sendToServer(MSG)
2700
2701 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2702 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2703 def testSecondCmsgTrunc2Int(self):
2704 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2705 2 * SIZEOF_INT)
2706
2707 @testSecondCmsgTrunc2Int.client_skip
2708 def _testSecondCmsgTrunc2Int(self):
2709 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2710 self.sendToServer(MSG)
2711
2712 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2713 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2714 def testSecondCmsgTruncLen0Minus1(self):
2715 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2716 socket.CMSG_LEN(0) - 1)
2717
2718 @testSecondCmsgTruncLen0Minus1.client_skip
2719 def _testSecondCmsgTruncLen0Minus1(self):
2720 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2721 self.sendToServer(MSG)
2722
2723 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2724 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2725 def testSecomdCmsgTruncInData(self):
2726 # Test truncation of the second of two control messages inside
2727 # its associated data.
2728 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2729 socket.IPV6_RECVHOPLIMIT, 1)
2730 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2731 socket.IPV6_RECVTCLASS, 1)
2732 self.misc_event.set()
2733 msg, ancdata, flags, addr = self.doRecvmsg(
2734 self.serv_sock, len(MSG),
2735 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
2736
2737 self.assertEqual(msg, MSG)
2738 self.checkRecvmsgAddress(addr, self.cli_addr)
2739 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2740
2741 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
2742
2743 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2744 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2745 cmsg_types.remove(cmsg_type)
2746 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2747 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002748 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002749 self.assertGreaterEqual(a[0], 0)
2750 self.assertLessEqual(a[0], 255)
2751
2752 if ancdata:
2753 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2754 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2755 cmsg_types.remove(cmsg_type)
2756 self.assertLess(len(cmsg_data), SIZEOF_INT)
2757
2758 self.assertEqual(ancdata, [])
2759
2760 @testSecomdCmsgTruncInData.client_skip
2761 def _testSecomdCmsgTruncInData(self):
2762 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2763 self.sendToServer(MSG)
2764
2765
2766# Derive concrete test classes for different socket types.
2767
2768class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
2769 SendrecvmsgConnectionlessBase,
2770 ThreadedSocketTestMixin, UDPTestBase):
2771 pass
2772
2773@requireAttrs(socket.socket, "sendmsg")
2774@unittest.skipUnless(thread, 'Threading required for this test.')
2775class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
2776 pass
2777
2778@requireAttrs(socket.socket, "recvmsg")
2779@unittest.skipUnless(thread, 'Threading required for this test.')
2780class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
2781 pass
2782
2783@requireAttrs(socket.socket, "recvmsg_into")
2784@unittest.skipUnless(thread, 'Threading required for this test.')
2785class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
2786 pass
2787
2788
2789class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
2790 SendrecvmsgConnectionlessBase,
2791 ThreadedSocketTestMixin, UDP6TestBase):
2792 pass
2793
2794@requireAttrs(socket.socket, "sendmsg")
2795@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2796@requireSocket("AF_INET6", "SOCK_DGRAM")
2797@unittest.skipUnless(thread, 'Threading required for this test.')
2798class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
2799 pass
2800
2801@requireAttrs(socket.socket, "recvmsg")
2802@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2803@requireSocket("AF_INET6", "SOCK_DGRAM")
2804@unittest.skipUnless(thread, 'Threading required for this test.')
2805class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
2806 pass
2807
2808@requireAttrs(socket.socket, "recvmsg_into")
2809@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2810@requireSocket("AF_INET6", "SOCK_DGRAM")
2811@unittest.skipUnless(thread, 'Threading required for this test.')
2812class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
2813 pass
2814
2815@requireAttrs(socket.socket, "recvmsg")
2816@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2817@requireAttrs(socket, "IPPROTO_IPV6")
2818@requireSocket("AF_INET6", "SOCK_DGRAM")
2819@unittest.skipUnless(thread, 'Threading required for this test.')
2820class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
2821 SendrecvmsgUDP6TestBase):
2822 pass
2823
2824@requireAttrs(socket.socket, "recvmsg_into")
2825@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2826@requireAttrs(socket, "IPPROTO_IPV6")
2827@requireSocket("AF_INET6", "SOCK_DGRAM")
2828@unittest.skipUnless(thread, 'Threading required for this test.')
2829class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
2830 RFC3542AncillaryTest,
2831 SendrecvmsgUDP6TestBase):
2832 pass
2833
2834
2835class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
2836 ConnectedStreamTestMixin, TCPTestBase):
2837 pass
2838
2839@requireAttrs(socket.socket, "sendmsg")
2840@unittest.skipUnless(thread, 'Threading required for this test.')
2841class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
2842 pass
2843
2844@requireAttrs(socket.socket, "recvmsg")
2845@unittest.skipUnless(thread, 'Threading required for this test.')
2846class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
2847 SendrecvmsgTCPTestBase):
2848 pass
2849
2850@requireAttrs(socket.socket, "recvmsg_into")
2851@unittest.skipUnless(thread, 'Threading required for this test.')
2852class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
2853 SendrecvmsgTCPTestBase):
2854 pass
2855
2856
2857class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
2858 SendrecvmsgConnectedBase,
2859 ConnectedStreamTestMixin, SCTPStreamBase):
2860 pass
2861
2862@requireAttrs(socket.socket, "sendmsg")
2863@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
2864@unittest.skipUnless(thread, 'Threading required for this test.')
2865class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
2866 pass
2867
2868@requireAttrs(socket.socket, "recvmsg")
2869@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
2870@unittest.skipUnless(thread, 'Threading required for this test.')
2871class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
2872 SendrecvmsgSCTPStreamTestBase):
2873 pass
2874
2875@requireAttrs(socket.socket, "recvmsg_into")
2876@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
2877@unittest.skipUnless(thread, 'Threading required for this test.')
2878class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
2879 SendrecvmsgSCTPStreamTestBase):
2880 pass
2881
2882
2883class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
2884 ConnectedStreamTestMixin, UnixStreamBase):
2885 pass
2886
2887@requireAttrs(socket.socket, "sendmsg")
2888@requireAttrs(socket, "AF_UNIX")
2889@unittest.skipUnless(thread, 'Threading required for this test.')
2890class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
2891 pass
2892
2893@requireAttrs(socket.socket, "recvmsg")
2894@requireAttrs(socket, "AF_UNIX")
2895@unittest.skipUnless(thread, 'Threading required for this test.')
2896class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
2897 SendrecvmsgUnixStreamTestBase):
2898 pass
2899
2900@requireAttrs(socket.socket, "recvmsg_into")
2901@requireAttrs(socket, "AF_UNIX")
2902@unittest.skipUnless(thread, 'Threading required for this test.')
2903class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
2904 SendrecvmsgUnixStreamTestBase):
2905 pass
2906
2907@requireAttrs(socket.socket, "sendmsg", "recvmsg")
2908@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
2909@unittest.skipUnless(thread, 'Threading required for this test.')
2910class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
2911 pass
2912
2913@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
2914@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
2915@unittest.skipUnless(thread, 'Threading required for this test.')
2916class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
2917 SendrecvmsgUnixStreamTestBase):
2918 pass
2919
2920
2921# Test interrupting the interruptible send/receive methods with a
2922# signal when a timeout is set. These tests avoid having multiple
2923# threads alive during the test so that the OS cannot deliver the
2924# signal to the wrong one.
2925
2926class InterruptedTimeoutBase(unittest.TestCase):
2927 # Base class for interrupted send/receive tests. Installs an
2928 # empty handler for SIGALRM and removes it on teardown, along with
2929 # any scheduled alarms.
2930
2931 def setUp(self):
2932 super().setUp()
2933 orig_alrm_handler = signal.signal(signal.SIGALRM,
2934 lambda signum, frame: None)
2935 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
2936 self.addCleanup(self.setAlarm, 0)
2937
2938 # Timeout for socket operations
2939 timeout = 4.0
2940
2941 # Provide setAlarm() method to schedule delivery of SIGALRM after
2942 # given number of seconds, or cancel it if zero, and an
2943 # appropriate time value to use. Use setitimer() if available.
2944 if hasattr(signal, "setitimer"):
2945 alarm_time = 0.05
2946
2947 def setAlarm(self, seconds):
2948 signal.setitimer(signal.ITIMER_REAL, seconds)
2949 else:
2950 # Old systems may deliver the alarm up to one second early
2951 alarm_time = 2
2952
2953 def setAlarm(self, seconds):
2954 signal.alarm(seconds)
2955
2956
2957# Require siginterrupt() in order to ensure that system calls are
2958# interrupted by default.
2959@requireAttrs(signal, "siginterrupt")
2960@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
2961 "Don't have signal.alarm or signal.setitimer")
2962class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
2963 # Test interrupting the recv*() methods with signals when a
2964 # timeout is set.
2965
2966 def setUp(self):
2967 super().setUp()
2968 self.serv.settimeout(self.timeout)
2969
2970 def checkInterruptedRecv(self, func, *args, **kwargs):
2971 # Check that func(*args, **kwargs) raises socket.error with an
2972 # errno of EINTR when interrupted by a signal.
2973 self.setAlarm(self.alarm_time)
2974 with self.assertRaises(socket.error) as cm:
2975 func(*args, **kwargs)
2976 self.assertNotIsInstance(cm.exception, socket.timeout)
2977 self.assertEqual(cm.exception.errno, errno.EINTR)
2978
2979 def testInterruptedRecvTimeout(self):
2980 self.checkInterruptedRecv(self.serv.recv, 1024)
2981
2982 def testInterruptedRecvIntoTimeout(self):
2983 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
2984
2985 def testInterruptedRecvfromTimeout(self):
2986 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
2987
2988 def testInterruptedRecvfromIntoTimeout(self):
2989 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
2990
2991 @requireAttrs(socket.socket, "recvmsg")
2992 def testInterruptedRecvmsgTimeout(self):
2993 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
2994
2995 @requireAttrs(socket.socket, "recvmsg_into")
2996 def testInterruptedRecvmsgIntoTimeout(self):
2997 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
2998
2999
3000# Require siginterrupt() in order to ensure that system calls are
3001# interrupted by default.
3002@requireAttrs(signal, "siginterrupt")
3003@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3004 "Don't have signal.alarm or signal.setitimer")
3005@unittest.skipUnless(thread, 'Threading required for this test.')
3006class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3007 ThreadSafeCleanupTestCase,
3008 SocketListeningTestMixin, TCPTestBase):
3009 # Test interrupting the interruptible send*() methods with signals
3010 # when a timeout is set.
3011
3012 def setUp(self):
3013 super().setUp()
3014 self.serv_conn = self.newSocket()
3015 self.addCleanup(self.serv_conn.close)
3016 # Use a thread to complete the connection, but wait for it to
3017 # terminate before running the test, so that there is only one
3018 # thread to accept the signal.
3019 cli_thread = threading.Thread(target=self.doConnect)
3020 cli_thread.start()
3021 self.cli_conn, addr = self.serv.accept()
3022 self.addCleanup(self.cli_conn.close)
3023 cli_thread.join()
3024 self.serv_conn.settimeout(self.timeout)
3025
3026 def doConnect(self):
3027 self.serv_conn.connect(self.serv_addr)
3028
3029 def checkInterruptedSend(self, func, *args, **kwargs):
3030 # Check that func(*args, **kwargs), run in a loop, raises
3031 # socket.error with an errno of EINTR when interrupted by a
3032 # signal.
3033 with self.assertRaises(socket.error) as cm:
3034 while True:
3035 self.setAlarm(self.alarm_time)
3036 func(*args, **kwargs)
3037 self.assertNotIsInstance(cm.exception, socket.timeout)
3038 self.assertEqual(cm.exception.errno, errno.EINTR)
3039
Nick Coghlan2496f332011-09-19 20:26:31 +10003040 # Issue #12958: The following tests have problems on Mac OS X
3041 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003042 def testInterruptedSendTimeout(self):
3043 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3044
Nick Coghlan2496f332011-09-19 20:26:31 +10003045 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003046 def testInterruptedSendtoTimeout(self):
3047 # Passing an actual address here as Python's wrapper for
3048 # sendto() doesn't allow passing a zero-length one; POSIX
3049 # requires that the address is ignored since the socket is
3050 # connection-mode, however.
3051 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3052 self.serv_addr)
3053
Nick Coghlan2496f332011-09-19 20:26:31 +10003054 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003055 @requireAttrs(socket.socket, "sendmsg")
3056 def testInterruptedSendmsgTimeout(self):
3057 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3058
3059
Victor Stinner45df8202010-04-28 22:31:17 +00003060@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003061class TCPCloserTest(ThreadedTCPSocketTest):
3062
3063 def testClose(self):
3064 conn, addr = self.serv.accept()
3065 conn.close()
3066
3067 sd = self.cli
3068 read, write, err = select.select([sd], [], [], 1.0)
3069 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003070 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003071
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003072 # Calling close() many times should be safe.
3073 conn.close()
3074 conn.close()
3075
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003076 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003077 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003078 time.sleep(1.0)
3079
Victor Stinner45df8202010-04-28 22:31:17 +00003080@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003081class BasicSocketPairTest(SocketPairTest):
3082
3083 def __init__(self, methodName='runTest'):
3084 SocketPairTest.__init__(self, methodName=methodName)
3085
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003086 def _check_defaults(self, sock):
3087 self.assertIsInstance(sock, socket.socket)
3088 if hasattr(socket, 'AF_UNIX'):
3089 self.assertEqual(sock.family, socket.AF_UNIX)
3090 else:
3091 self.assertEqual(sock.family, socket.AF_INET)
3092 self.assertEqual(sock.type, socket.SOCK_STREAM)
3093 self.assertEqual(sock.proto, 0)
3094
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003095 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003096 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003097
3098 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003099 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003100
Dave Cole331708b2004-08-09 04:51:41 +00003101 def testRecv(self):
3102 msg = self.serv.recv(1024)
3103 self.assertEqual(msg, MSG)
3104
3105 def _testRecv(self):
3106 self.cli.send(MSG)
3107
3108 def testSend(self):
3109 self.serv.send(MSG)
3110
3111 def _testSend(self):
3112 msg = self.cli.recv(1024)
3113 self.assertEqual(msg, MSG)
3114
Victor Stinner45df8202010-04-28 22:31:17 +00003115@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003116class NonBlockingTCPTests(ThreadedTCPSocketTest):
3117
3118 def __init__(self, methodName='runTest'):
3119 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3120
3121 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003122 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003123 self.serv.setblocking(0)
3124 start = time.time()
3125 try:
3126 self.serv.accept()
3127 except socket.error:
3128 pass
3129 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003130 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003131
3132 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003133 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003134
Antoine Pitroub1c54962010-10-14 15:05:38 +00003135 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003136 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003137 def testInitNonBlocking(self):
3138 # reinit server socket
3139 self.serv.close()
3140 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003141 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003142 self.port = support.bind_port(self.serv)
3143 self.serv.listen(1)
3144 # actual testing
3145 start = time.time()
3146 try:
3147 self.serv.accept()
3148 except socket.error:
3149 pass
3150 end = time.time()
3151 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3152
3153 def _testInitNonBlocking(self):
3154 pass
3155
Antoine Pitrou600232b2011-01-05 21:03:42 +00003156 def testInheritFlags(self):
3157 # Issue #7995: when calling accept() on a listening socket with a
3158 # timeout, the resulting socket should not be non-blocking.
3159 self.serv.settimeout(10)
3160 try:
3161 conn, addr = self.serv.accept()
3162 message = conn.recv(len(MSG))
3163 finally:
3164 conn.close()
3165 self.serv.settimeout(None)
3166
3167 def _testInheritFlags(self):
3168 time.sleep(0.1)
3169 self.cli.connect((HOST, self.port))
3170 time.sleep(0.5)
3171 self.cli.send(MSG)
3172
Guido van Rossum24e4af82002-06-12 19:18:08 +00003173 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003174 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003175 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003176 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003177 conn, addr = self.serv.accept()
3178 except socket.error:
3179 pass
3180 else:
3181 self.fail("Error trying to do non-blocking accept.")
3182 read, write, err = select.select([self.serv], [], [])
3183 if self.serv in read:
3184 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003185 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003186 else:
3187 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003188
Guido van Rossum24e4af82002-06-12 19:18:08 +00003189 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003190 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003191 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003192
3193 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003194 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003195 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003196 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003197
3198 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003199 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003200 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003201
3202 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003203 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003204 conn, addr = self.serv.accept()
3205 conn.setblocking(0)
3206 try:
3207 msg = conn.recv(len(MSG))
3208 except socket.error:
3209 pass
3210 else:
3211 self.fail("Error trying to do non-blocking recv.")
3212 read, write, err = select.select([conn], [], [])
3213 if conn in read:
3214 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003215 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003216 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003217 else:
3218 self.fail("Error during select call to non-blocking socket.")
3219
3220 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003221 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003222 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003223 self.cli.send(MSG)
3224
Victor Stinner45df8202010-04-28 22:31:17 +00003225@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003226class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003227 """Unit tests for the object returned by socket.makefile()
3228
Antoine Pitrou834bd812010-10-13 16:17:14 +00003229 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003230 the client connection. You can read from this file to
3231 get output from the server.
3232
Antoine Pitrou834bd812010-10-13 16:17:14 +00003233 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003234 server connection. You can write to this file to send output
3235 to the client.
3236 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003237
Guido van Rossume9f66142002-08-07 15:46:19 +00003238 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003239 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003240 errors = 'strict'
3241 newline = None
3242
3243 read_mode = 'rb'
3244 read_msg = MSG
3245 write_mode = 'wb'
3246 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003247
Guido van Rossum24e4af82002-06-12 19:18:08 +00003248 def __init__(self, methodName='runTest'):
3249 SocketConnectedTest.__init__(self, methodName=methodName)
3250
3251 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003252 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3253 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003254 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003255 self.read_file = self.cli_conn.makefile(
3256 self.read_mode, self.bufsize,
3257 encoding = self.encoding,
3258 errors = self.errors,
3259 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003260
3261 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003262 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003263 self.read_file.close()
3264 self.assertTrue(self.read_file.closed)
3265 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003266 SocketConnectedTest.tearDown(self)
3267
3268 def clientSetUp(self):
3269 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003270 self.write_file = self.serv_conn.makefile(
3271 self.write_mode, self.bufsize,
3272 encoding = self.encoding,
3273 errors = self.errors,
3274 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003275
3276 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003277 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003278 self.write_file.close()
3279 self.assertTrue(self.write_file.closed)
3280 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003281 SocketConnectedTest.clientTearDown(self)
3282
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003283 def testReadAfterTimeout(self):
3284 # Issue #7322: A file object must disallow further reads
3285 # after a timeout has occurred.
3286 self.cli_conn.settimeout(1)
3287 self.read_file.read(3)
3288 # First read raises a timeout
3289 self.assertRaises(socket.timeout, self.read_file.read, 1)
3290 # Second read is disallowed
3291 with self.assertRaises(IOError) as ctx:
3292 self.read_file.read(1)
3293 self.assertIn("cannot read from timed out object", str(ctx.exception))
3294
3295 def _testReadAfterTimeout(self):
3296 self.write_file.write(self.write_msg[0:3])
3297 self.write_file.flush()
3298 self.serv_finished.wait()
3299
Guido van Rossum24e4af82002-06-12 19:18:08 +00003300 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003301 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003302 first_seg = self.read_file.read(len(self.read_msg)-3)
3303 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003304 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003305 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003306
3307 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003308 self.write_file.write(self.write_msg)
3309 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003310
Guido van Rossum8c943832002-08-08 01:00:28 +00003311 def testFullRead(self):
3312 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003313 msg = self.read_file.read()
3314 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003315
3316 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003317 self.write_file.write(self.write_msg)
3318 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003319
Guido van Rossum24e4af82002-06-12 19:18:08 +00003320 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003321 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003322 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003323 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003324 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003325 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003326 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003327 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003328 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003329
3330 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003331 self.write_file.write(self.write_msg)
3332 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003333
3334 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003335 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003336 line = self.read_file.readline()
3337 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003338
3339 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003340 self.write_file.write(self.write_msg)
3341 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003342
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003343 def testCloseAfterMakefile(self):
3344 # The file returned by makefile should keep the socket open.
3345 self.cli_conn.close()
3346 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003347 msg = self.read_file.read()
3348 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003349
3350 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003351 self.write_file.write(self.write_msg)
3352 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003353
3354 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003355 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003356 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003357 if isinstance(self.read_msg, str):
3358 msg = msg.decode()
3359 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003360
3361 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003362 self.write_file.write(self.write_msg)
3363 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003364
Tim Peters116d83c2004-03-28 02:20:45 +00003365 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003366 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003367
3368 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003369 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003370
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003371 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003372 self.assertEqual(self.read_file.mode, self.read_mode)
3373 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003374
3375 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003376 self.assertEqual(self.write_file.mode, self.write_mode)
3377 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003378
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003379 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003380 self.read_file.close()
3381 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003382 self.cli_conn.close()
3383 self.assertRaises(socket.error, self.cli_conn.getsockname)
3384
3385 def _testRealClose(self):
3386 pass
3387
3388
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003389class FileObjectInterruptedTestCase(unittest.TestCase):
3390 """Test that the file object correctly handles EINTR internally."""
3391
3392 class MockSocket(object):
3393 def __init__(self, recv_funcs=()):
3394 # A generator that returns callables that we'll call for each
3395 # call to recv().
3396 self._recv_step = iter(recv_funcs)
3397
3398 def recv_into(self, buffer):
3399 data = next(self._recv_step)()
3400 assert len(buffer) >= len(data)
3401 buffer[:len(data)] = data
3402 return len(data)
3403
3404 def _decref_socketios(self):
3405 pass
3406
3407 def _textiowrap_for_test(self, buffering=-1):
3408 raw = socket.SocketIO(self, "r")
3409 if buffering < 0:
3410 buffering = io.DEFAULT_BUFFER_SIZE
3411 if buffering == 0:
3412 return raw
3413 buffer = io.BufferedReader(raw, buffering)
3414 text = io.TextIOWrapper(buffer, None, None)
3415 text.mode = "rb"
3416 return text
3417
3418 @staticmethod
3419 def _raise_eintr():
3420 raise socket.error(errno.EINTR)
3421
3422 def _textiowrap_mock_socket(self, mock, buffering=-1):
3423 raw = socket.SocketIO(mock, "r")
3424 if buffering < 0:
3425 buffering = io.DEFAULT_BUFFER_SIZE
3426 if buffering == 0:
3427 return raw
3428 buffer = io.BufferedReader(raw, buffering)
3429 text = io.TextIOWrapper(buffer, None, None)
3430 text.mode = "rb"
3431 return text
3432
3433 def _test_readline(self, size=-1, buffering=-1):
3434 mock_sock = self.MockSocket(recv_funcs=[
3435 lambda : b"This is the first line\nAnd the sec",
3436 self._raise_eintr,
3437 lambda : b"ond line is here\n",
3438 lambda : b"",
3439 lambda : b"", # XXX(gps): io library does an extra EOF read
3440 ])
3441 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003442 self.assertEqual(fo.readline(size), "This is the first line\n")
3443 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003444
3445 def _test_read(self, size=-1, buffering=-1):
3446 mock_sock = self.MockSocket(recv_funcs=[
3447 lambda : b"This is the first line\nAnd the sec",
3448 self._raise_eintr,
3449 lambda : b"ond line is here\n",
3450 lambda : b"",
3451 lambda : b"", # XXX(gps): io library does an extra EOF read
3452 ])
3453 expecting = (b"This is the first line\n"
3454 b"And the second line is here\n")
3455 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3456 if buffering == 0:
3457 data = b''
3458 else:
3459 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003460 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003461 while len(data) != len(expecting):
3462 part = fo.read(size)
3463 if not part:
3464 break
3465 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003466 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003467
3468 def test_default(self):
3469 self._test_readline()
3470 self._test_readline(size=100)
3471 self._test_read()
3472 self._test_read(size=100)
3473
3474 def test_with_1k_buffer(self):
3475 self._test_readline(buffering=1024)
3476 self._test_readline(size=100, buffering=1024)
3477 self._test_read(buffering=1024)
3478 self._test_read(size=100, buffering=1024)
3479
3480 def _test_readline_no_buffer(self, size=-1):
3481 mock_sock = self.MockSocket(recv_funcs=[
3482 lambda : b"a",
3483 lambda : b"\n",
3484 lambda : b"B",
3485 self._raise_eintr,
3486 lambda : b"b",
3487 lambda : b"",
3488 ])
3489 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003490 self.assertEqual(fo.readline(size), b"a\n")
3491 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003492
3493 def test_no_buffer(self):
3494 self._test_readline_no_buffer()
3495 self._test_readline_no_buffer(size=4)
3496 self._test_read(buffering=0)
3497 self._test_read(size=100, buffering=0)
3498
3499
Guido van Rossume9f66142002-08-07 15:46:19 +00003500class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3501
3502 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003503
Guido van Rossume9f66142002-08-07 15:46:19 +00003504 In this case (and in this case only), it should be possible to
3505 create a file object, read a line from it, create another file
3506 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003507 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003508 when reading multiple requests from the same socket."""
3509
3510 bufsize = 0 # Use unbuffered mode
3511
3512 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003513 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003514 line = self.read_file.readline() # first line
3515 self.assertEqual(line, b"A. " + self.write_msg) # first line
3516 self.read_file = self.cli_conn.makefile('rb', 0)
3517 line = self.read_file.readline() # second line
3518 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003519
3520 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003521 self.write_file.write(b"A. " + self.write_msg)
3522 self.write_file.write(b"B. " + self.write_msg)
3523 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003524
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003525 def testMakefileClose(self):
3526 # The file returned by makefile should keep the socket open...
3527 self.cli_conn.close()
3528 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003529 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003530 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003531 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003532 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3533
3534 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003535 self.write_file.write(self.write_msg)
3536 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003537
3538 def testMakefileCloseSocketDestroy(self):
3539 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003540 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003541 refcount_after = sys.getrefcount(self.cli_conn)
3542 self.assertEqual(refcount_before - 1, refcount_after)
3543
3544 def _testMakefileCloseSocketDestroy(self):
3545 pass
3546
Antoine Pitrou98b46702010-09-18 22:59:00 +00003547 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003548 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003549 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3550
3551 def testSmallReadNonBlocking(self):
3552 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003553 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3554 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003555 self.evt1.set()
3556 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003557 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003558 if first_seg is None:
3559 # Data not arrived (can happen under Windows), wait a bit
3560 time.sleep(0.5)
3561 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003562 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003563 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003564 self.assertEqual(n, 3)
3565 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003566 self.assertEqual(msg, self.read_msg)
3567 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3568 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003569
3570 def _testSmallReadNonBlocking(self):
3571 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003572 self.write_file.write(self.write_msg)
3573 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003574 self.evt2.set()
3575 # Avoid cloding the socket before the server test has finished,
3576 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3577 self.serv_finished.wait(5.0)
3578
3579 def testWriteNonBlocking(self):
3580 self.cli_finished.wait(5.0)
3581 # The client thread can't skip directly - the SkipTest exception
3582 # would appear as a failure.
3583 if self.serv_skipped:
3584 self.skipTest(self.serv_skipped)
3585
3586 def _testWriteNonBlocking(self):
3587 self.serv_skipped = None
3588 self.serv_conn.setblocking(False)
3589 # Try to saturate the socket buffer pipe with repeated large writes.
3590 BIG = b"x" * (1024 ** 2)
3591 LIMIT = 10
3592 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003593 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003594 self.assertGreater(n, 0)
3595 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003596 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003597 if n is None:
3598 # Succeeded
3599 break
3600 self.assertGreater(n, 0)
3601 else:
3602 # Let us know that this test didn't manage to establish
3603 # the expected conditions. This is not a failure in itself but,
3604 # if it happens repeatedly, the test should be fixed.
3605 self.serv_skipped = "failed to saturate the socket buffer"
3606
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003607
Guido van Rossum8c943832002-08-08 01:00:28 +00003608class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3609
3610 bufsize = 1 # Default-buffered for reading; line-buffered for writing
3611
3612
3613class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3614
3615 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00003616
Thomas Woutersb2137042007-02-01 18:02:27 +00003617
Antoine Pitrou834bd812010-10-13 16:17:14 +00003618class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
3619 """Tests for socket.makefile() in text mode (rather than binary)"""
3620
3621 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003622 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003623 write_mode = 'wb'
3624 write_msg = MSG
3625 newline = ''
3626
3627
3628class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
3629 """Tests for socket.makefile() in text mode (rather than binary)"""
3630
3631 read_mode = 'rb'
3632 read_msg = MSG
3633 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003634 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003635 newline = ''
3636
3637
3638class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
3639 """Tests for socket.makefile() in text mode (rather than binary)"""
3640
3641 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003642 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003643 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003644 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003645 newline = ''
3646
3647
Guido van Rossumd8faa362007-04-27 19:54:29 +00003648class NetworkConnectionTest(object):
3649 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003650
Guido van Rossumd8faa362007-04-27 19:54:29 +00003651 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003652 # We're inherited below by BasicTCPTest2, which also inherits
3653 # BasicTCPTest, which defines self.port referenced below.
3654 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003655 self.serv_conn = self.cli
3656
3657class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
3658 """Tests that NetworkConnection does not break existing TCP functionality.
3659 """
3660
3661class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003662
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003663 class MockSocket(socket.socket):
3664 def connect(self, *args):
3665 raise socket.timeout('timed out')
3666
3667 @contextlib.contextmanager
3668 def mocked_socket_module(self):
3669 """Return a socket which times out on connect"""
3670 old_socket = socket.socket
3671 socket.socket = self.MockSocket
3672 try:
3673 yield
3674 finally:
3675 socket.socket = old_socket
3676
3677 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003678 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003679 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003680 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003681 with self.assertRaises(socket.error) as cm:
3682 cli.connect((HOST, port))
3683 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3684
3685 def test_create_connection(self):
3686 # Issue #9792: errors raised by create_connection() should have
3687 # a proper errno attribute.
3688 port = support.find_unused_port()
3689 with self.assertRaises(socket.error) as cm:
3690 socket.create_connection((HOST, port))
3691 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3692
3693 def test_create_connection_timeout(self):
3694 # Issue #9792: create_connection() should not recast timeout errors
3695 # as generic socket errors.
3696 with self.mocked_socket_module():
3697 with self.assertRaises(socket.timeout):
3698 socket.create_connection((HOST, 1234))
3699
Guido van Rossumd8faa362007-04-27 19:54:29 +00003700
Victor Stinner45df8202010-04-28 22:31:17 +00003701@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003702class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
3703
3704 def __init__(self, methodName='runTest'):
3705 SocketTCPTest.__init__(self, methodName=methodName)
3706 ThreadableTest.__init__(self)
3707
3708 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003709 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003710
3711 def clientTearDown(self):
3712 self.cli.close()
3713 self.cli = None
3714 ThreadableTest.clientTearDown(self)
3715
3716 def _justAccept(self):
3717 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003718 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003719
3720 testFamily = _justAccept
3721 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003722 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003723 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003724 self.assertEqual(self.cli.family, 2)
3725
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003726 testSourceAddress = _justAccept
3727 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003728 self.cli = socket.create_connection((HOST, self.port), timeout=30,
3729 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003730 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00003731 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003732 # The port number being used is sufficient to show that the bind()
3733 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00003734
Guido van Rossumd8faa362007-04-27 19:54:29 +00003735 testTimeoutDefault = _justAccept
3736 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00003737 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003738 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003739 socket.setdefaulttimeout(42)
3740 try:
3741 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003742 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003743 finally:
3744 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003745 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003746
3747 testTimeoutNone = _justAccept
3748 def _testTimeoutNone(self):
3749 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003750 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003751 socket.setdefaulttimeout(30)
3752 try:
3753 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003754 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003755 finally:
3756 socket.setdefaulttimeout(None)
3757 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003758
3759 testTimeoutValueNamed = _justAccept
3760 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003761 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003762 self.assertEqual(self.cli.gettimeout(), 30)
3763
3764 testTimeoutValueNonamed = _justAccept
3765 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003766 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003767 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003768 self.assertEqual(self.cli.gettimeout(), 30)
3769
Victor Stinner45df8202010-04-28 22:31:17 +00003770@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003771class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
3772
3773 def __init__(self, methodName='runTest'):
3774 SocketTCPTest.__init__(self, methodName=methodName)
3775 ThreadableTest.__init__(self)
3776
3777 def clientSetUp(self):
3778 pass
3779
3780 def clientTearDown(self):
3781 self.cli.close()
3782 self.cli = None
3783 ThreadableTest.clientTearDown(self)
3784
3785 def testInsideTimeout(self):
3786 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003787 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003788 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003789 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 testOutsideTimeout = testInsideTimeout
3791
3792 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003793 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003795 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003796
3797 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003798 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003799 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003800
3801
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003802class TCPTimeoutTest(SocketTCPTest):
3803
3804 def testTCPTimeout(self):
3805 def raise_timeout(*args, **kwargs):
3806 self.serv.settimeout(1.0)
3807 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003808 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003809 "Error generating a timeout exception (TCP)")
3810
3811 def testTimeoutZero(self):
3812 ok = False
3813 try:
3814 self.serv.settimeout(0.0)
3815 foo = self.serv.accept()
3816 except socket.timeout:
3817 self.fail("caught timeout instead of error (TCP)")
3818 except socket.error:
3819 ok = True
3820 except:
3821 self.fail("caught unexpected exception (TCP)")
3822 if not ok:
3823 self.fail("accept() returned success when we did not expect it")
3824
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003825 def testInterruptedTimeout(self):
3826 # XXX I don't know how to do this test on MSWindows or any other
3827 # plaform that doesn't support signal.alarm() or os.kill(), though
3828 # the bug should have existed on all platforms.
3829 if not hasattr(signal, "alarm"):
3830 return # can only test on *nix
3831 self.serv.settimeout(5.0) # must be longer than alarm
3832 class Alarm(Exception):
3833 pass
3834 def alarm_handler(signal, frame):
3835 raise Alarm
3836 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
3837 try:
3838 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
3839 try:
3840 foo = self.serv.accept()
3841 except socket.timeout:
3842 self.fail("caught timeout instead of Alarm")
3843 except Alarm:
3844 pass
3845 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00003846 self.fail("caught other exception instead of Alarm:"
3847 " %s(%s):\n%s" %
3848 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003849 else:
3850 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00003851 finally:
3852 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003853 except Alarm:
3854 self.fail("got Alarm in wrong place")
3855 finally:
3856 # no alarm can be pending. Safe to restore old handler.
3857 signal.signal(signal.SIGALRM, old_alarm)
3858
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003859class UDPTimeoutTest(SocketTCPTest):
3860
3861 def testUDPTimeout(self):
3862 def raise_timeout(*args, **kwargs):
3863 self.serv.settimeout(1.0)
3864 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003865 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003866 "Error generating a timeout exception (UDP)")
3867
3868 def testTimeoutZero(self):
3869 ok = False
3870 try:
3871 self.serv.settimeout(0.0)
3872 foo = self.serv.recv(1024)
3873 except socket.timeout:
3874 self.fail("caught timeout instead of error (UDP)")
3875 except socket.error:
3876 ok = True
3877 except:
3878 self.fail("caught unexpected exception (UDP)")
3879 if not ok:
3880 self.fail("recv() returned success when we did not expect it")
3881
3882class TestExceptions(unittest.TestCase):
3883
3884 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003885 self.assertTrue(issubclass(socket.error, Exception))
3886 self.assertTrue(issubclass(socket.herror, socket.error))
3887 self.assertTrue(issubclass(socket.gaierror, socket.error))
3888 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003889
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003890class TestLinuxAbstractNamespace(unittest.TestCase):
3891
3892 UNIX_PATH_MAX = 108
3893
3894 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003895 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00003896 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
3897 s1.bind(address)
3898 s1.listen(1)
3899 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
3900 s2.connect(s1.getsockname())
3901 with s1.accept()[0] as s3:
3902 self.assertEqual(s1.getsockname(), address)
3903 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003904
3905 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003906 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00003907 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
3908 s.bind(address)
3909 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003910
3911 def testNameOverflow(self):
3912 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00003913 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
3914 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003915
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003916
Victor Stinner45df8202010-04-28 22:31:17 +00003917@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00003918class BufferIOTest(SocketConnectedTest):
3919 """
3920 Test the buffer versions of socket.recv() and socket.send().
3921 """
3922 def __init__(self, methodName='runTest'):
3923 SocketConnectedTest.__init__(self, methodName=methodName)
3924
Antoine Pitrou25480782010-03-17 22:50:28 +00003925 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00003926 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003927 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003928 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003929 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00003930 self.assertEqual(msg, MSG)
3931
Antoine Pitrou25480782010-03-17 22:50:28 +00003932 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00003933 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003934 self.serv_conn.send(buf)
3935
Antoine Pitrou25480782010-03-17 22:50:28 +00003936 def testRecvIntoBytearray(self):
3937 buf = bytearray(1024)
3938 nbytes = self.cli_conn.recv_into(buf)
3939 self.assertEqual(nbytes, len(MSG))
3940 msg = buf[:len(MSG)]
3941 self.assertEqual(msg, MSG)
3942
3943 _testRecvIntoBytearray = _testRecvIntoArray
3944
3945 def testRecvIntoMemoryview(self):
3946 buf = bytearray(1024)
3947 nbytes = self.cli_conn.recv_into(memoryview(buf))
3948 self.assertEqual(nbytes, len(MSG))
3949 msg = buf[:len(MSG)]
3950 self.assertEqual(msg, MSG)
3951
3952 _testRecvIntoMemoryview = _testRecvIntoArray
3953
3954 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00003955 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003956 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003957 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003958 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00003959 self.assertEqual(msg, MSG)
3960
Antoine Pitrou25480782010-03-17 22:50:28 +00003961 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00003962 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003963 self.serv_conn.send(buf)
3964
Antoine Pitrou25480782010-03-17 22:50:28 +00003965 def testRecvFromIntoBytearray(self):
3966 buf = bytearray(1024)
3967 nbytes, addr = self.cli_conn.recvfrom_into(buf)
3968 self.assertEqual(nbytes, len(MSG))
3969 msg = buf[:len(MSG)]
3970 self.assertEqual(msg, MSG)
3971
3972 _testRecvFromIntoBytearray = _testRecvFromIntoArray
3973
3974 def testRecvFromIntoMemoryview(self):
3975 buf = bytearray(1024)
3976 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
3977 self.assertEqual(nbytes, len(MSG))
3978 msg = buf[:len(MSG)]
3979 self.assertEqual(msg, MSG)
3980
3981 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
3982
Christian Heimes043d6f62008-01-07 17:19:16 +00003983
3984TIPC_STYPE = 2000
3985TIPC_LOWER = 200
3986TIPC_UPPER = 210
3987
3988def isTipcAvailable():
3989 """Check if the TIPC module is loaded
3990
3991 The TIPC module is not loaded automatically on Ubuntu and probably
3992 other Linux distros.
3993 """
3994 if not hasattr(socket, "AF_TIPC"):
3995 return False
3996 if not os.path.isfile("/proc/modules"):
3997 return False
3998 with open("/proc/modules") as f:
3999 for line in f:
4000 if line.startswith("tipc "):
4001 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004002 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004003 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4004 return False
4005
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004006class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004007 def testRDM(self):
4008 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4009 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004010 self.addCleanup(srv.close)
4011 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004012
4013 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4014 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4015 TIPC_LOWER, TIPC_UPPER)
4016 srv.bind(srvaddr)
4017
4018 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4019 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4020 cli.sendto(MSG, sendaddr)
4021
4022 msg, recvaddr = srv.recvfrom(1024)
4023
4024 self.assertEqual(cli.getsockname(), recvaddr)
4025 self.assertEqual(msg, MSG)
4026
4027
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004028class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004029 def __init__(self, methodName = 'runTest'):
4030 unittest.TestCase.__init__(self, methodName = methodName)
4031 ThreadableTest.__init__(self)
4032
4033 def setUp(self):
4034 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004035 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004036 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4037 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4038 TIPC_LOWER, TIPC_UPPER)
4039 self.srv.bind(srvaddr)
4040 self.srv.listen(5)
4041 self.serverExplicitReady()
4042 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004043 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004044
4045 def clientSetUp(self):
4046 # The is a hittable race between serverExplicitReady() and the
4047 # accept() call; sleep a little while to avoid it, otherwise
4048 # we could get an exception
4049 time.sleep(0.1)
4050 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004051 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004052 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4053 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4054 self.cli.connect(addr)
4055 self.cliaddr = self.cli.getsockname()
4056
4057 def testStream(self):
4058 msg = self.conn.recv(1024)
4059 self.assertEqual(msg, MSG)
4060 self.assertEqual(self.cliaddr, self.connaddr)
4061
4062 def _testStream(self):
4063 self.cli.send(MSG)
4064 self.cli.close()
4065
4066
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004067@unittest.skipUnless(thread, 'Threading required for this test.')
4068class ContextManagersTest(ThreadedTCPSocketTest):
4069
4070 def _testSocketClass(self):
4071 # base test
4072 with socket.socket() as sock:
4073 self.assertFalse(sock._closed)
4074 self.assertTrue(sock._closed)
4075 # close inside with block
4076 with socket.socket() as sock:
4077 sock.close()
4078 self.assertTrue(sock._closed)
4079 # exception inside with block
4080 with socket.socket() as sock:
4081 self.assertRaises(socket.error, sock.sendall, b'foo')
4082 self.assertTrue(sock._closed)
4083
4084 def testCreateConnectionBase(self):
4085 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004086 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004087 data = conn.recv(1024)
4088 conn.sendall(data)
4089
4090 def _testCreateConnectionBase(self):
4091 address = self.serv.getsockname()
4092 with socket.create_connection(address) as sock:
4093 self.assertFalse(sock._closed)
4094 sock.sendall(b'foo')
4095 self.assertEqual(sock.recv(1024), b'foo')
4096 self.assertTrue(sock._closed)
4097
4098 def testCreateConnectionClose(self):
4099 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004100 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004101 data = conn.recv(1024)
4102 conn.sendall(data)
4103
4104 def _testCreateConnectionClose(self):
4105 address = self.serv.getsockname()
4106 with socket.create_connection(address) as sock:
4107 sock.close()
4108 self.assertTrue(sock._closed)
4109 self.assertRaises(socket.error, sock.sendall, b'foo')
4110
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004111
Antoine Pitroub1c54962010-10-14 15:05:38 +00004112@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4113 "SOCK_CLOEXEC not defined")
4114@unittest.skipUnless(fcntl, "module fcntl not available")
4115class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004116 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004117 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004118 with socket.socket(socket.AF_INET,
4119 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4120 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4121 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004122
4123
4124@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4125 "SOCK_NONBLOCK not defined")
4126class NonblockConstantTest(unittest.TestCase):
4127 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4128 if nonblock:
4129 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4130 self.assertEqual(s.gettimeout(), timeout)
4131 else:
4132 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4133 self.assertEqual(s.gettimeout(), None)
4134
Charles-François Natali239bb962011-06-03 12:55:15 +02004135 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004136 def test_SOCK_NONBLOCK(self):
4137 # a lot of it seems silly and redundant, but I wanted to test that
4138 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004139 with socket.socket(socket.AF_INET,
4140 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4141 self.checkNonblock(s)
4142 s.setblocking(1)
4143 self.checkNonblock(s, False)
4144 s.setblocking(0)
4145 self.checkNonblock(s)
4146 s.settimeout(None)
4147 self.checkNonblock(s, False)
4148 s.settimeout(2.0)
4149 self.checkNonblock(s, timeout=2.0)
4150 s.setblocking(1)
4151 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004152 # defaulttimeout
4153 t = socket.getdefaulttimeout()
4154 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004155 with socket.socket() as s:
4156 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004157 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004158 with socket.socket() as s:
4159 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004160 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004161 with socket.socket() as s:
4162 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004163 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004164 with socket.socket() as s:
4165 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004166 socket.setdefaulttimeout(t)
4167
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004168
Guido van Rossumb995eb72002-07-31 16:08:40 +00004169def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004170 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004171 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004172
4173 tests.extend([
4174 NonBlockingTCPTests,
4175 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004176 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004177 UnbufferedFileObjectClassTestCase,
4178 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004179 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004180 UnicodeReadFileObjectClassTestCase,
4181 UnicodeWriteFileObjectClassTestCase,
4182 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004183 NetworkConnectionNoServer,
4184 NetworkConnectionAttributesTest,
4185 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004186 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004187 CloexecConstantTest,
4188 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004189 ])
Dave Cole331708b2004-08-09 04:51:41 +00004190 if hasattr(socket, "socketpair"):
4191 tests.append(BasicSocketPairTest)
Victor Stinnere6747472011-08-21 00:39:18 +02004192 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004193 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004194 if isTipcAvailable():
4195 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004196 tests.append(TIPCThreadableTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004197 tests.extend([
4198 CmsgMacroTests,
4199 SendmsgUDPTest,
4200 RecvmsgUDPTest,
4201 RecvmsgIntoUDPTest,
4202 SendmsgUDP6Test,
4203 RecvmsgUDP6Test,
4204 RecvmsgRFC3542AncillaryUDP6Test,
4205 RecvmsgIntoRFC3542AncillaryUDP6Test,
4206 RecvmsgIntoUDP6Test,
4207 SendmsgTCPTest,
4208 RecvmsgTCPTest,
4209 RecvmsgIntoTCPTest,
4210 SendmsgSCTPStreamTest,
4211 RecvmsgSCTPStreamTest,
4212 RecvmsgIntoSCTPStreamTest,
4213 SendmsgUnixStreamTest,
4214 RecvmsgUnixStreamTest,
4215 RecvmsgIntoUnixStreamTest,
4216 RecvmsgSCMRightsStreamTest,
4217 RecvmsgIntoSCMRightsStreamTest,
4218 # These are slow when setitimer() is not available
4219 InterruptedRecvTimeoutTest,
4220 InterruptedSendTimeoutTest,
4221 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004222
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004223 thread_info = support.threading_setup()
4224 support.run_unittest(*tests)
4225 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004226
4227if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004228 test_main()