blob: f47e61e5f8818bad003ee143df40fc3876933875 [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()
164 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000165 self.clientSetUp()
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
1662 def testRecvmsgTrunc(self):
1663 # Receive part of message, check for truncation indicators.
1664 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1665 len(MSG) - 3)
1666 self.assertEqual(msg, MSG[:-3])
1667 self.checkRecvmsgAddress(addr, self.cli_addr)
1668 self.assertEqual(ancdata, [])
1669 self.checkFlags(flags, eor=False)
1670
1671 def _testRecvmsgTrunc(self):
1672 self.sendToServer(MSG)
1673
1674 def testRecvmsgShortAncillaryBuf(self):
1675 # Test ancillary data buffer too small to hold any ancillary data.
1676 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1677 len(MSG), 1)
1678 self.assertEqual(msg, MSG)
1679 self.checkRecvmsgAddress(addr, self.cli_addr)
1680 self.assertEqual(ancdata, [])
1681 self.checkFlags(flags, eor=True)
1682
1683 def _testRecvmsgShortAncillaryBuf(self):
1684 self.sendToServer(MSG)
1685
1686 def testRecvmsgLongAncillaryBuf(self):
1687 # Test large ancillary data buffer.
1688 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1689 len(MSG), 10240)
1690 self.assertEqual(msg, MSG)
1691 self.checkRecvmsgAddress(addr, self.cli_addr)
1692 self.assertEqual(ancdata, [])
1693 self.checkFlags(flags, eor=True)
1694
1695 def _testRecvmsgLongAncillaryBuf(self):
1696 self.sendToServer(MSG)
1697
1698 def testRecvmsgAfterClose(self):
1699 # Check that recvmsg[_into]() fails on a closed socket.
1700 self.serv_sock.close()
1701 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
1702
1703 def _testRecvmsgAfterClose(self):
1704 pass
1705
1706 def testRecvmsgTimeout(self):
1707 # Check that timeout works.
1708 try:
1709 self.serv_sock.settimeout(0.03)
1710 self.assertRaises(socket.timeout,
1711 self.doRecvmsg, self.serv_sock, len(MSG))
1712 finally:
1713 self.misc_event.set()
1714
1715 def _testRecvmsgTimeout(self):
1716 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1717
1718 @requireAttrs(socket, "MSG_PEEK")
1719 def testRecvmsgPeek(self):
1720 # Check that MSG_PEEK in flags enables examination of pending
1721 # data without consuming it.
1722
1723 # Receive part of data with MSG_PEEK.
1724 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1725 len(MSG) - 3, 0,
1726 socket.MSG_PEEK)
1727 self.assertEqual(msg, MSG[:-3])
1728 self.checkRecvmsgAddress(addr, self.cli_addr)
1729 self.assertEqual(ancdata, [])
1730 # Ignoring MSG_TRUNC here (so this test is the same for stream
1731 # and datagram sockets). Some wording in POSIX seems to
1732 # suggest that it needn't be set when peeking, but that may
1733 # just be a slip.
1734 self.checkFlags(flags, eor=False,
1735 ignore=getattr(socket, "MSG_TRUNC", 0))
1736
1737 # Receive all data with MSG_PEEK.
1738 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1739 len(MSG), 0,
1740 socket.MSG_PEEK)
1741 self.assertEqual(msg, MSG)
1742 self.checkRecvmsgAddress(addr, self.cli_addr)
1743 self.assertEqual(ancdata, [])
1744 self.checkFlags(flags, eor=True)
1745
1746 # Check that the same data can still be received normally.
1747 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1748 self.assertEqual(msg, MSG)
1749 self.checkRecvmsgAddress(addr, self.cli_addr)
1750 self.assertEqual(ancdata, [])
1751 self.checkFlags(flags, eor=True)
1752
1753 @testRecvmsgPeek.client_skip
1754 def _testRecvmsgPeek(self):
1755 self.sendToServer(MSG)
1756
1757 @requireAttrs(socket.socket, "sendmsg")
1758 def testRecvmsgFromSendmsg(self):
1759 # Test receiving with recvmsg[_into]() when message is sent
1760 # using sendmsg().
1761 self.serv_sock.settimeout(self.fail_timeout)
1762 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1763 self.assertEqual(msg, MSG)
1764 self.checkRecvmsgAddress(addr, self.cli_addr)
1765 self.assertEqual(ancdata, [])
1766 self.checkFlags(flags, eor=True)
1767
1768 @testRecvmsgFromSendmsg.client_skip
1769 def _testRecvmsgFromSendmsg(self):
1770 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1771
1772
1773class RecvmsgGenericStreamTests(RecvmsgGenericTests):
1774 # Tests which require a stream socket and can use either recvmsg()
1775 # or recvmsg_into().
1776
1777 def testRecvmsgEOF(self):
1778 # Receive end-of-stream indicator (b"", peer socket closed).
1779 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1780 self.assertEqual(msg, b"")
1781 self.checkRecvmsgAddress(addr, self.cli_addr)
1782 self.assertEqual(ancdata, [])
1783 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
1784
1785 def _testRecvmsgEOF(self):
1786 self.cli_sock.close()
1787
1788 def testRecvmsgOverflow(self):
1789 # Receive a message in more than one chunk.
1790 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1791 len(MSG) - 3)
1792 self.checkRecvmsgAddress(addr, self.cli_addr)
1793 self.assertEqual(ancdata, [])
1794 self.checkFlags(flags, eor=False)
1795
1796 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1797 self.checkRecvmsgAddress(addr, self.cli_addr)
1798 self.assertEqual(ancdata, [])
1799 self.checkFlags(flags, eor=True)
1800
1801 msg = seg1 + seg2
1802 self.assertEqual(msg, MSG)
1803
1804 def _testRecvmsgOverflow(self):
1805 self.sendToServer(MSG)
1806
1807
1808class RecvmsgTests(RecvmsgGenericTests):
1809 # Tests for recvmsg() which can use any socket type.
1810
1811 def testRecvmsgBadArgs(self):
1812 # Check that recvmsg() rejects invalid arguments.
1813 self.assertRaises(TypeError, self.serv_sock.recvmsg)
1814 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1815 -1, 0, 0)
1816 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1817 len(MSG), -1, 0)
1818 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1819 [bytearray(10)], 0, 0)
1820 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1821 object(), 0, 0)
1822 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1823 len(MSG), object(), 0)
1824 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1825 len(MSG), 0, object())
1826
1827 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
1828 self.assertEqual(msg, MSG)
1829 self.checkRecvmsgAddress(addr, self.cli_addr)
1830 self.assertEqual(ancdata, [])
1831 self.checkFlags(flags, eor=True)
1832
1833 def _testRecvmsgBadArgs(self):
1834 self.sendToServer(MSG)
1835
1836
1837class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
1838 # Tests for recvmsg_into() which can use any socket type.
1839
1840 def testRecvmsgIntoBadArgs(self):
1841 # Check that recvmsg_into() rejects invalid arguments.
1842 buf = bytearray(len(MSG))
1843 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
1844 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1845 len(MSG), 0, 0)
1846 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1847 buf, 0, 0)
1848 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1849 [object()], 0, 0)
1850 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1851 [b"I'm not writable"], 0, 0)
1852 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1853 [buf, object()], 0, 0)
1854 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
1855 [buf], -1, 0)
1856 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1857 [buf], object(), 0)
1858 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1859 [buf], 0, object())
1860
1861 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
1862 self.assertEqual(nbytes, len(MSG))
1863 self.assertEqual(buf, bytearray(MSG))
1864 self.checkRecvmsgAddress(addr, self.cli_addr)
1865 self.assertEqual(ancdata, [])
1866 self.checkFlags(flags, eor=True)
1867
1868 def _testRecvmsgIntoBadArgs(self):
1869 self.sendToServer(MSG)
1870
1871 def testRecvmsgIntoGenerator(self):
1872 # Receive into buffer obtained from a generator (not a sequence).
1873 buf = bytearray(len(MSG))
1874 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
1875 (o for o in [buf]))
1876 self.assertEqual(nbytes, len(MSG))
1877 self.assertEqual(buf, bytearray(MSG))
1878 self.checkRecvmsgAddress(addr, self.cli_addr)
1879 self.assertEqual(ancdata, [])
1880 self.checkFlags(flags, eor=True)
1881
1882 def _testRecvmsgIntoGenerator(self):
1883 self.sendToServer(MSG)
1884
1885 def testRecvmsgIntoArray(self):
1886 # Receive into an array rather than the usual bytearray.
1887 buf = array.array("B", [0] * len(MSG))
1888 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
1889 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02001890 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001891 self.checkRecvmsgAddress(addr, self.cli_addr)
1892 self.assertEqual(ancdata, [])
1893 self.checkFlags(flags, eor=True)
1894
1895 def _testRecvmsgIntoArray(self):
1896 self.sendToServer(MSG)
1897
1898 def testRecvmsgIntoScatter(self):
1899 # Receive into multiple buffers (scatter write).
1900 b1 = bytearray(b"----")
1901 b2 = bytearray(b"0123456789")
1902 b3 = bytearray(b"--------------")
1903 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
1904 [b1, memoryview(b2)[2:9], b3])
1905 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
1906 self.assertEqual(b1, bytearray(b"Mary"))
1907 self.assertEqual(b2, bytearray(b"01 had a 9"))
1908 self.assertEqual(b3, bytearray(b"little lamb---"))
1909 self.checkRecvmsgAddress(addr, self.cli_addr)
1910 self.assertEqual(ancdata, [])
1911 self.checkFlags(flags, eor=True)
1912
1913 def _testRecvmsgIntoScatter(self):
1914 self.sendToServer(b"Mary had a little lamb")
1915
1916
1917class CmsgMacroTests(unittest.TestCase):
1918 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
1919 # assumptions used by sendmsg() and recvmsg[_into](), which share
1920 # code with these functions.
1921
1922 # Match the definition in socketmodule.c
1923 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
1924
1925 @requireAttrs(socket, "CMSG_LEN")
1926 def testCMSG_LEN(self):
1927 # Test CMSG_LEN() with various valid and invalid values,
1928 # checking the assumptions used by recvmsg() and sendmsg().
1929 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
1930 values = list(range(257)) + list(range(toobig - 257, toobig))
1931
1932 # struct cmsghdr has at least three members, two of which are ints
1933 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
1934 for n in values:
1935 ret = socket.CMSG_LEN(n)
1936 # This is how recvmsg() calculates the data size
1937 self.assertEqual(ret - socket.CMSG_LEN(0), n)
1938 self.assertLessEqual(ret, self.socklen_t_limit)
1939
1940 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
1941 # sendmsg() shares code with these functions, and requires
1942 # that it reject values over the limit.
1943 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
1944 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
1945
1946 @requireAttrs(socket, "CMSG_SPACE")
1947 def testCMSG_SPACE(self):
1948 # Test CMSG_SPACE() with various valid and invalid values,
1949 # checking the assumptions used by sendmsg().
1950 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
1951 values = list(range(257)) + list(range(toobig - 257, toobig))
1952
1953 last = socket.CMSG_SPACE(0)
1954 # struct cmsghdr has at least three members, two of which are ints
1955 self.assertGreater(last, array.array("i").itemsize * 2)
1956 for n in values:
1957 ret = socket.CMSG_SPACE(n)
1958 self.assertGreaterEqual(ret, last)
1959 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
1960 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
1961 self.assertLessEqual(ret, self.socklen_t_limit)
1962 last = ret
1963
1964 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
1965 # sendmsg() shares code with these functions, and requires
1966 # that it reject values over the limit.
1967 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
1968 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
1969
1970
1971class SCMRightsTest(SendrecvmsgServerTimeoutBase):
1972 # Tests for file descriptor passing on Unix-domain sockets.
1973
1974 # Invalid file descriptor value that's unlikely to evaluate to a
1975 # real FD even if one of its bytes is replaced with a different
1976 # value (which shouldn't actually happen).
1977 badfd = -0x5555
1978
1979 def newFDs(self, n):
1980 # Return a list of n file descriptors for newly-created files
1981 # containing their list indices as ASCII numbers.
1982 fds = []
1983 for i in range(n):
1984 fd, path = tempfile.mkstemp()
1985 self.addCleanup(os.unlink, path)
1986 self.addCleanup(os.close, fd)
1987 os.write(fd, str(i).encode())
1988 fds.append(fd)
1989 return fds
1990
1991 def checkFDs(self, fds):
1992 # Check that the file descriptors in the given list contain
1993 # their correct list indices as ASCII numbers.
1994 for n, fd in enumerate(fds):
1995 os.lseek(fd, 0, os.SEEK_SET)
1996 self.assertEqual(os.read(fd, 1024), str(n).encode())
1997
1998 def registerRecvmsgResult(self, result):
1999 self.addCleanup(self.closeRecvmsgFDs, result)
2000
2001 def closeRecvmsgFDs(self, recvmsg_result):
2002 # Close all file descriptors specified in the ancillary data
2003 # of the given return value from recvmsg() or recvmsg_into().
2004 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2005 if (cmsg_level == socket.SOL_SOCKET and
2006 cmsg_type == socket.SCM_RIGHTS):
2007 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002008 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002009 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2010 for fd in fds:
2011 os.close(fd)
2012
2013 def createAndSendFDs(self, n):
2014 # Send n new file descriptors created by newFDs() to the
2015 # server, with the constant MSG as the non-ancillary data.
2016 self.assertEqual(
2017 self.sendmsgToServer([MSG],
2018 [(socket.SOL_SOCKET,
2019 socket.SCM_RIGHTS,
2020 array.array("i", self.newFDs(n)))]),
2021 len(MSG))
2022
2023 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2024 # Check that constant MSG was received with numfds file
2025 # descriptors in a maximum of maxcmsgs control messages (which
2026 # must contain only complete integers). By default, check
2027 # that MSG_CTRUNC is unset, but ignore any flags in
2028 # ignoreflags.
2029 msg, ancdata, flags, addr = result
2030 self.assertEqual(msg, MSG)
2031 self.checkRecvmsgAddress(addr, self.cli_addr)
2032 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2033 ignore=ignoreflags)
2034
2035 self.assertIsInstance(ancdata, list)
2036 self.assertLessEqual(len(ancdata), maxcmsgs)
2037 fds = array.array("i")
2038 for item in ancdata:
2039 self.assertIsInstance(item, tuple)
2040 cmsg_level, cmsg_type, cmsg_data = item
2041 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2042 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2043 self.assertIsInstance(cmsg_data, bytes)
2044 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002045 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002046
2047 self.assertEqual(len(fds), numfds)
2048 self.checkFDs(fds)
2049
2050 def testFDPassSimple(self):
2051 # Pass a single FD (array read from bytes object).
2052 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2053 len(MSG), 10240))
2054
2055 def _testFDPassSimple(self):
2056 self.assertEqual(
2057 self.sendmsgToServer(
2058 [MSG],
2059 [(socket.SOL_SOCKET,
2060 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002061 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002062 len(MSG))
2063
2064 def testMultipleFDPass(self):
2065 # Pass multiple FDs in a single array.
2066 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2067 len(MSG), 10240))
2068
2069 def _testMultipleFDPass(self):
2070 self.createAndSendFDs(4)
2071
2072 @requireAttrs(socket, "CMSG_SPACE")
2073 def testFDPassCMSG_SPACE(self):
2074 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2075 self.checkRecvmsgFDs(
2076 4, self.doRecvmsg(self.serv_sock, len(MSG),
2077 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2078
2079 @testFDPassCMSG_SPACE.client_skip
2080 def _testFDPassCMSG_SPACE(self):
2081 self.createAndSendFDs(4)
2082
2083 def testFDPassCMSG_LEN(self):
2084 # Test using CMSG_LEN() to calculate ancillary buffer size.
2085 self.checkRecvmsgFDs(1,
2086 self.doRecvmsg(self.serv_sock, len(MSG),
2087 socket.CMSG_LEN(4 * SIZEOF_INT)),
2088 # RFC 3542 says implementations may set
2089 # MSG_CTRUNC if there isn't enough space
2090 # for trailing padding.
2091 ignoreflags=socket.MSG_CTRUNC)
2092
2093 def _testFDPassCMSG_LEN(self):
2094 self.createAndSendFDs(1)
2095
Nick Coghlan2496f332011-09-19 20:26:31 +10002096 # Issue #12958: The following test has problems on Mac OS X
2097 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002098 @requireAttrs(socket, "CMSG_SPACE")
2099 def testFDPassSeparate(self):
2100 # Pass two FDs in two separate arrays. Arrays may be combined
2101 # into a single control message by the OS.
2102 self.checkRecvmsgFDs(2,
2103 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2104 maxcmsgs=2)
2105
2106 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002107 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002108 def _testFDPassSeparate(self):
2109 fd0, fd1 = self.newFDs(2)
2110 self.assertEqual(
2111 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2112 socket.SCM_RIGHTS,
2113 array.array("i", [fd0])),
2114 (socket.SOL_SOCKET,
2115 socket.SCM_RIGHTS,
2116 array.array("i", [fd1]))]),
2117 len(MSG))
2118
Nick Coghlan2496f332011-09-19 20:26:31 +10002119 # Issue #12958: The following test has problems on Mac OS X
2120 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002121 @requireAttrs(socket, "CMSG_SPACE")
2122 def testFDPassSeparateMinSpace(self):
2123 # Pass two FDs in two separate arrays, receiving them into the
2124 # minimum space for two arrays.
2125 self.checkRecvmsgFDs(2,
2126 self.doRecvmsg(self.serv_sock, len(MSG),
2127 socket.CMSG_SPACE(SIZEOF_INT) +
2128 socket.CMSG_LEN(SIZEOF_INT)),
2129 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2130
2131 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002132 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002133 def _testFDPassSeparateMinSpace(self):
2134 fd0, fd1 = self.newFDs(2)
2135 self.assertEqual(
2136 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2137 socket.SCM_RIGHTS,
2138 array.array("i", [fd0])),
2139 (socket.SOL_SOCKET,
2140 socket.SCM_RIGHTS,
2141 array.array("i", [fd1]))]),
2142 len(MSG))
2143
2144 def sendAncillaryIfPossible(self, msg, ancdata):
2145 # Try to send msg and ancdata to server, but if the system
2146 # call fails, just send msg with no ancillary data.
2147 try:
2148 nbytes = self.sendmsgToServer([msg], ancdata)
2149 except socket.error as e:
2150 # Check that it was the system call that failed
2151 self.assertIsInstance(e.errno, int)
2152 nbytes = self.sendmsgToServer([msg])
2153 self.assertEqual(nbytes, len(msg))
2154
2155 def testFDPassEmpty(self):
2156 # Try to pass an empty FD array. Can receive either no array
2157 # or an empty array.
2158 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2159 len(MSG), 10240),
2160 ignoreflags=socket.MSG_CTRUNC)
2161
2162 def _testFDPassEmpty(self):
2163 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2164 socket.SCM_RIGHTS,
2165 b"")])
2166
2167 def testFDPassPartialInt(self):
2168 # Try to pass a truncated FD array.
2169 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2170 len(MSG), 10240)
2171 self.assertEqual(msg, MSG)
2172 self.checkRecvmsgAddress(addr, self.cli_addr)
2173 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2174 self.assertLessEqual(len(ancdata), 1)
2175 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2176 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2177 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2178 self.assertLess(len(cmsg_data), SIZEOF_INT)
2179
2180 def _testFDPassPartialInt(self):
2181 self.sendAncillaryIfPossible(
2182 MSG,
2183 [(socket.SOL_SOCKET,
2184 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002185 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002186
2187 @requireAttrs(socket, "CMSG_SPACE")
2188 def testFDPassPartialIntInMiddle(self):
2189 # Try to pass two FD arrays, the first of which is truncated.
2190 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2191 len(MSG), 10240)
2192 self.assertEqual(msg, MSG)
2193 self.checkRecvmsgAddress(addr, self.cli_addr)
2194 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2195 self.assertLessEqual(len(ancdata), 2)
2196 fds = array.array("i")
2197 # Arrays may have been combined in a single control message
2198 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2199 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2200 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002201 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002202 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2203 self.assertLessEqual(len(fds), 2)
2204 self.checkFDs(fds)
2205
2206 @testFDPassPartialIntInMiddle.client_skip
2207 def _testFDPassPartialIntInMiddle(self):
2208 fd0, fd1 = self.newFDs(2)
2209 self.sendAncillaryIfPossible(
2210 MSG,
2211 [(socket.SOL_SOCKET,
2212 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002213 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002214 (socket.SOL_SOCKET,
2215 socket.SCM_RIGHTS,
2216 array.array("i", [fd1]))])
2217
2218 def checkTruncatedHeader(self, result, ignoreflags=0):
2219 # Check that no ancillary data items are returned when data is
2220 # truncated inside the cmsghdr structure.
2221 msg, ancdata, flags, addr = result
2222 self.assertEqual(msg, MSG)
2223 self.checkRecvmsgAddress(addr, self.cli_addr)
2224 self.assertEqual(ancdata, [])
2225 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2226 ignore=ignoreflags)
2227
2228 def testCmsgTruncNoBufSize(self):
2229 # Check that no ancillary data is received when no buffer size
2230 # is specified.
2231 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2232 # BSD seems to set MSG_CTRUNC only
2233 # if an item has been partially
2234 # received.
2235 ignoreflags=socket.MSG_CTRUNC)
2236
2237 def _testCmsgTruncNoBufSize(self):
2238 self.createAndSendFDs(1)
2239
2240 def testCmsgTrunc0(self):
2241 # Check that no ancillary data is received when buffer size is 0.
2242 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2243 ignoreflags=socket.MSG_CTRUNC)
2244
2245 def _testCmsgTrunc0(self):
2246 self.createAndSendFDs(1)
2247
2248 # Check that no ancillary data is returned for various non-zero
2249 # (but still too small) buffer sizes.
2250
2251 def testCmsgTrunc1(self):
2252 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2253
2254 def _testCmsgTrunc1(self):
2255 self.createAndSendFDs(1)
2256
2257 def testCmsgTrunc2Int(self):
2258 # The cmsghdr structure has at least three members, two of
2259 # which are ints, so we still shouldn't see any ancillary
2260 # data.
2261 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2262 SIZEOF_INT * 2))
2263
2264 def _testCmsgTrunc2Int(self):
2265 self.createAndSendFDs(1)
2266
2267 def testCmsgTruncLen0Minus1(self):
2268 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2269 socket.CMSG_LEN(0) - 1))
2270
2271 def _testCmsgTruncLen0Minus1(self):
2272 self.createAndSendFDs(1)
2273
2274 # The following tests try to truncate the control message in the
2275 # middle of the FD array.
2276
2277 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2278 # Check that file descriptor data is truncated to between
2279 # mindata and maxdata bytes when received with buffer size
2280 # ancbuf, and that any complete file descriptor numbers are
2281 # valid.
2282 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2283 len(MSG), ancbuf)
2284 self.assertEqual(msg, MSG)
2285 self.checkRecvmsgAddress(addr, self.cli_addr)
2286 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2287
2288 if mindata == 0 and ancdata == []:
2289 return
2290 self.assertEqual(len(ancdata), 1)
2291 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2292 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2293 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2294 self.assertGreaterEqual(len(cmsg_data), mindata)
2295 self.assertLessEqual(len(cmsg_data), maxdata)
2296 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002297 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002298 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2299 self.checkFDs(fds)
2300
2301 def testCmsgTruncLen0(self):
2302 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2303
2304 def _testCmsgTruncLen0(self):
2305 self.createAndSendFDs(1)
2306
2307 def testCmsgTruncLen0Plus1(self):
2308 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2309
2310 def _testCmsgTruncLen0Plus1(self):
2311 self.createAndSendFDs(2)
2312
2313 def testCmsgTruncLen1(self):
2314 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2315 maxdata=SIZEOF_INT)
2316
2317 def _testCmsgTruncLen1(self):
2318 self.createAndSendFDs(2)
2319
2320 def testCmsgTruncLen2Minus1(self):
2321 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2322 maxdata=(2 * SIZEOF_INT) - 1)
2323
2324 def _testCmsgTruncLen2Minus1(self):
2325 self.createAndSendFDs(2)
2326
2327
2328class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2329 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2330 # features of the RFC 3542 Advanced Sockets API for IPv6.
2331 # Currently we can only handle certain data items (e.g. traffic
2332 # class, hop limit, MTU discovery and fragmentation settings)
2333 # without resorting to unportable means such as the struct module,
2334 # but the tests here are aimed at testing the ancillary data
2335 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2336 # itself.
2337
2338 # Test value to use when setting hop limit of packet
2339 hop_limit = 2
2340
2341 # Test value to use when setting traffic class of packet.
2342 # -1 means "use kernel default".
2343 traffic_class = -1
2344
2345 def ancillaryMapping(self, ancdata):
2346 # Given ancillary data list ancdata, return a mapping from
2347 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2348 # Check that no (level, type) pair appears more than once.
2349 d = {}
2350 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2351 self.assertNotIn((cmsg_level, cmsg_type), d)
2352 d[(cmsg_level, cmsg_type)] = cmsg_data
2353 return d
2354
2355 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2356 # Receive hop limit into ancbufsize bytes of ancillary data
2357 # space. Check that data is MSG, ancillary data is not
2358 # truncated (but ignore any flags in ignoreflags), and hop
2359 # limit is between 0 and maxhop inclusive.
2360 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2361 socket.IPV6_RECVHOPLIMIT, 1)
2362 self.misc_event.set()
2363 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2364 len(MSG), ancbufsize)
2365
2366 self.assertEqual(msg, MSG)
2367 self.checkRecvmsgAddress(addr, self.cli_addr)
2368 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2369 ignore=ignoreflags)
2370
2371 self.assertEqual(len(ancdata), 1)
2372 self.assertIsInstance(ancdata[0], tuple)
2373 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2374 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2375 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2376 self.assertIsInstance(cmsg_data, bytes)
2377 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2378 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002379 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002380 self.assertGreaterEqual(a[0], 0)
2381 self.assertLessEqual(a[0], maxhop)
2382
2383 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2384 def testRecvHopLimit(self):
2385 # Test receiving the packet hop limit as ancillary data.
2386 self.checkHopLimit(ancbufsize=10240)
2387
2388 @testRecvHopLimit.client_skip
2389 def _testRecvHopLimit(self):
2390 # Need to wait until server has asked to receive ancillary
2391 # data, as implementations are not required to buffer it
2392 # otherwise.
2393 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2394 self.sendToServer(MSG)
2395
2396 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2397 def testRecvHopLimitCMSG_SPACE(self):
2398 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2399 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2400
2401 @testRecvHopLimitCMSG_SPACE.client_skip
2402 def _testRecvHopLimitCMSG_SPACE(self):
2403 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2404 self.sendToServer(MSG)
2405
2406 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2407 # 3542 says portable applications must provide space for trailing
2408 # padding. Implementations may set MSG_CTRUNC if there isn't
2409 # enough space for the padding.
2410
2411 @requireAttrs(socket.socket, "sendmsg")
2412 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2413 def testSetHopLimit(self):
2414 # Test setting hop limit on outgoing packet and receiving it
2415 # at the other end.
2416 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2417
2418 @testSetHopLimit.client_skip
2419 def _testSetHopLimit(self):
2420 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2421 self.assertEqual(
2422 self.sendmsgToServer([MSG],
2423 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2424 array.array("i", [self.hop_limit]))]),
2425 len(MSG))
2426
2427 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2428 ignoreflags=0):
2429 # Receive traffic class and hop limit into ancbufsize bytes of
2430 # ancillary data space. Check that data is MSG, ancillary
2431 # data is not truncated (but ignore any flags in ignoreflags),
2432 # and traffic class and hop limit are in range (hop limit no
2433 # more than maxhop).
2434 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2435 socket.IPV6_RECVHOPLIMIT, 1)
2436 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2437 socket.IPV6_RECVTCLASS, 1)
2438 self.misc_event.set()
2439 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2440 len(MSG), ancbufsize)
2441
2442 self.assertEqual(msg, MSG)
2443 self.checkRecvmsgAddress(addr, self.cli_addr)
2444 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2445 ignore=ignoreflags)
2446 self.assertEqual(len(ancdata), 2)
2447 ancmap = self.ancillaryMapping(ancdata)
2448
2449 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2450 self.assertEqual(len(tcdata), SIZEOF_INT)
2451 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002452 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002453 self.assertGreaterEqual(a[0], 0)
2454 self.assertLessEqual(a[0], 255)
2455
2456 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2457 self.assertEqual(len(hldata), SIZEOF_INT)
2458 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002459 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002460 self.assertGreaterEqual(a[0], 0)
2461 self.assertLessEqual(a[0], maxhop)
2462
2463 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2464 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2465 def testRecvTrafficClassAndHopLimit(self):
2466 # Test receiving traffic class and hop limit as ancillary data.
2467 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2468
2469 @testRecvTrafficClassAndHopLimit.client_skip
2470 def _testRecvTrafficClassAndHopLimit(self):
2471 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2472 self.sendToServer(MSG)
2473
2474 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2475 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2476 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2477 # Test receiving traffic class and hop limit, using
2478 # CMSG_SPACE() to calculate buffer size.
2479 self.checkTrafficClassAndHopLimit(
2480 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2481
2482 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2483 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2484 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2485 self.sendToServer(MSG)
2486
2487 @requireAttrs(socket.socket, "sendmsg")
2488 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2489 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2490 def testSetTrafficClassAndHopLimit(self):
2491 # Test setting traffic class and hop limit on outgoing packet,
2492 # and receiving them at the other end.
2493 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2494 maxhop=self.hop_limit)
2495
2496 @testSetTrafficClassAndHopLimit.client_skip
2497 def _testSetTrafficClassAndHopLimit(self):
2498 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2499 self.assertEqual(
2500 self.sendmsgToServer([MSG],
2501 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2502 array.array("i", [self.traffic_class])),
2503 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2504 array.array("i", [self.hop_limit]))]),
2505 len(MSG))
2506
2507 @requireAttrs(socket.socket, "sendmsg")
2508 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2509 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2510 def testOddCmsgSize(self):
2511 # Try to send ancillary data with first item one byte too
2512 # long. Fall back to sending with correct size if this fails,
2513 # and check that second item was handled correctly.
2514 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2515 maxhop=self.hop_limit)
2516
2517 @testOddCmsgSize.client_skip
2518 def _testOddCmsgSize(self):
2519 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2520 try:
2521 nbytes = self.sendmsgToServer(
2522 [MSG],
2523 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002524 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002525 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2526 array.array("i", [self.hop_limit]))])
2527 except socket.error as e:
2528 self.assertIsInstance(e.errno, int)
2529 nbytes = self.sendmsgToServer(
2530 [MSG],
2531 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2532 array.array("i", [self.traffic_class])),
2533 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2534 array.array("i", [self.hop_limit]))])
2535 self.assertEqual(nbytes, len(MSG))
2536
2537 # Tests for proper handling of truncated ancillary data
2538
2539 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2540 # Receive hop limit into ancbufsize bytes of ancillary data
2541 # space, which should be too small to contain the ancillary
2542 # data header (if ancbufsize is None, pass no second argument
2543 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2544 # (unless included in ignoreflags), and no ancillary data is
2545 # returned.
2546 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2547 socket.IPV6_RECVHOPLIMIT, 1)
2548 self.misc_event.set()
2549 args = () if ancbufsize is None else (ancbufsize,)
2550 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2551 len(MSG), *args)
2552
2553 self.assertEqual(msg, MSG)
2554 self.checkRecvmsgAddress(addr, self.cli_addr)
2555 self.assertEqual(ancdata, [])
2556 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2557 ignore=ignoreflags)
2558
2559 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2560 def testCmsgTruncNoBufSize(self):
2561 # Check that no ancillary data is received when no ancillary
2562 # buffer size is provided.
2563 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2564 # BSD seems to set
2565 # MSG_CTRUNC only if an item
2566 # has been partially
2567 # received.
2568 ignoreflags=socket.MSG_CTRUNC)
2569
2570 @testCmsgTruncNoBufSize.client_skip
2571 def _testCmsgTruncNoBufSize(self):
2572 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2573 self.sendToServer(MSG)
2574
2575 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2576 def testSingleCmsgTrunc0(self):
2577 # Check that no ancillary data is received when ancillary
2578 # buffer size is zero.
2579 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2580 ignoreflags=socket.MSG_CTRUNC)
2581
2582 @testSingleCmsgTrunc0.client_skip
2583 def _testSingleCmsgTrunc0(self):
2584 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2585 self.sendToServer(MSG)
2586
2587 # Check that no ancillary data is returned for various non-zero
2588 # (but still too small) buffer sizes.
2589
2590 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2591 def testSingleCmsgTrunc1(self):
2592 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2593
2594 @testSingleCmsgTrunc1.client_skip
2595 def _testSingleCmsgTrunc1(self):
2596 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2597 self.sendToServer(MSG)
2598
2599 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2600 def testSingleCmsgTrunc2Int(self):
2601 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
2602
2603 @testSingleCmsgTrunc2Int.client_skip
2604 def _testSingleCmsgTrunc2Int(self):
2605 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2606 self.sendToServer(MSG)
2607
2608 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2609 def testSingleCmsgTruncLen0Minus1(self):
2610 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
2611
2612 @testSingleCmsgTruncLen0Minus1.client_skip
2613 def _testSingleCmsgTruncLen0Minus1(self):
2614 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2615 self.sendToServer(MSG)
2616
2617 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2618 def testSingleCmsgTruncInData(self):
2619 # Test truncation of a control message inside its associated
2620 # data. The message may be returned with its data truncated,
2621 # or not returned at all.
2622 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2623 socket.IPV6_RECVHOPLIMIT, 1)
2624 self.misc_event.set()
2625 msg, ancdata, flags, addr = self.doRecvmsg(
2626 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
2627
2628 self.assertEqual(msg, MSG)
2629 self.checkRecvmsgAddress(addr, self.cli_addr)
2630 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2631
2632 self.assertLessEqual(len(ancdata), 1)
2633 if ancdata:
2634 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2635 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2636 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2637 self.assertLess(len(cmsg_data), SIZEOF_INT)
2638
2639 @testSingleCmsgTruncInData.client_skip
2640 def _testSingleCmsgTruncInData(self):
2641 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2642 self.sendToServer(MSG)
2643
2644 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
2645 # Receive traffic class and hop limit into ancbufsize bytes of
2646 # ancillary data space, which should be large enough to
2647 # contain the first item, but too small to contain the header
2648 # of the second. Check that data is MSG, MSG_CTRUNC is set
2649 # (unless included in ignoreflags), and only one ancillary
2650 # data item is returned.
2651 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2652 socket.IPV6_RECVHOPLIMIT, 1)
2653 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2654 socket.IPV6_RECVTCLASS, 1)
2655 self.misc_event.set()
2656 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2657 len(MSG), ancbufsize)
2658
2659 self.assertEqual(msg, MSG)
2660 self.checkRecvmsgAddress(addr, self.cli_addr)
2661 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2662 ignore=ignoreflags)
2663
2664 self.assertEqual(len(ancdata), 1)
2665 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2666 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2667 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
2668 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2669 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002670 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002671 self.assertGreaterEqual(a[0], 0)
2672 self.assertLessEqual(a[0], 255)
2673
2674 # Try the above test with various buffer sizes.
2675
2676 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2677 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2678 def testSecondCmsgTrunc0(self):
2679 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
2680 ignoreflags=socket.MSG_CTRUNC)
2681
2682 @testSecondCmsgTrunc0.client_skip
2683 def _testSecondCmsgTrunc0(self):
2684 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2685 self.sendToServer(MSG)
2686
2687 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2688 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2689 def testSecondCmsgTrunc1(self):
2690 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
2691
2692 @testSecondCmsgTrunc1.client_skip
2693 def _testSecondCmsgTrunc1(self):
2694 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2695 self.sendToServer(MSG)
2696
2697 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2698 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2699 def testSecondCmsgTrunc2Int(self):
2700 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2701 2 * SIZEOF_INT)
2702
2703 @testSecondCmsgTrunc2Int.client_skip
2704 def _testSecondCmsgTrunc2Int(self):
2705 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2706 self.sendToServer(MSG)
2707
2708 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2709 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2710 def testSecondCmsgTruncLen0Minus1(self):
2711 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2712 socket.CMSG_LEN(0) - 1)
2713
2714 @testSecondCmsgTruncLen0Minus1.client_skip
2715 def _testSecondCmsgTruncLen0Minus1(self):
2716 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2717 self.sendToServer(MSG)
2718
2719 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2720 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2721 def testSecomdCmsgTruncInData(self):
2722 # Test truncation of the second of two control messages inside
2723 # its associated data.
2724 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2725 socket.IPV6_RECVHOPLIMIT, 1)
2726 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2727 socket.IPV6_RECVTCLASS, 1)
2728 self.misc_event.set()
2729 msg, ancdata, flags, addr = self.doRecvmsg(
2730 self.serv_sock, len(MSG),
2731 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
2732
2733 self.assertEqual(msg, MSG)
2734 self.checkRecvmsgAddress(addr, self.cli_addr)
2735 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2736
2737 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
2738
2739 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2740 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2741 cmsg_types.remove(cmsg_type)
2742 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2743 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002744 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002745 self.assertGreaterEqual(a[0], 0)
2746 self.assertLessEqual(a[0], 255)
2747
2748 if ancdata:
2749 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2750 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2751 cmsg_types.remove(cmsg_type)
2752 self.assertLess(len(cmsg_data), SIZEOF_INT)
2753
2754 self.assertEqual(ancdata, [])
2755
2756 @testSecomdCmsgTruncInData.client_skip
2757 def _testSecomdCmsgTruncInData(self):
2758 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2759 self.sendToServer(MSG)
2760
2761
2762# Derive concrete test classes for different socket types.
2763
2764class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
2765 SendrecvmsgConnectionlessBase,
2766 ThreadedSocketTestMixin, UDPTestBase):
2767 pass
2768
2769@requireAttrs(socket.socket, "sendmsg")
2770@unittest.skipUnless(thread, 'Threading required for this test.')
2771class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
2772 pass
2773
2774@requireAttrs(socket.socket, "recvmsg")
2775@unittest.skipUnless(thread, 'Threading required for this test.')
2776class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
2777 pass
2778
2779@requireAttrs(socket.socket, "recvmsg_into")
2780@unittest.skipUnless(thread, 'Threading required for this test.')
2781class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
2782 pass
2783
2784
2785class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
2786 SendrecvmsgConnectionlessBase,
2787 ThreadedSocketTestMixin, UDP6TestBase):
2788 pass
2789
2790@requireAttrs(socket.socket, "sendmsg")
2791@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2792@requireSocket("AF_INET6", "SOCK_DGRAM")
2793@unittest.skipUnless(thread, 'Threading required for this test.')
2794class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
2795 pass
2796
2797@requireAttrs(socket.socket, "recvmsg")
2798@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2799@requireSocket("AF_INET6", "SOCK_DGRAM")
2800@unittest.skipUnless(thread, 'Threading required for this test.')
2801class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
2802 pass
2803
2804@requireAttrs(socket.socket, "recvmsg_into")
2805@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2806@requireSocket("AF_INET6", "SOCK_DGRAM")
2807@unittest.skipUnless(thread, 'Threading required for this test.')
2808class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
2809 pass
2810
2811@requireAttrs(socket.socket, "recvmsg")
2812@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2813@requireAttrs(socket, "IPPROTO_IPV6")
2814@requireSocket("AF_INET6", "SOCK_DGRAM")
2815@unittest.skipUnless(thread, 'Threading required for this test.')
2816class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
2817 SendrecvmsgUDP6TestBase):
2818 pass
2819
2820@requireAttrs(socket.socket, "recvmsg_into")
2821@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2822@requireAttrs(socket, "IPPROTO_IPV6")
2823@requireSocket("AF_INET6", "SOCK_DGRAM")
2824@unittest.skipUnless(thread, 'Threading required for this test.')
2825class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
2826 RFC3542AncillaryTest,
2827 SendrecvmsgUDP6TestBase):
2828 pass
2829
2830
2831class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
2832 ConnectedStreamTestMixin, TCPTestBase):
2833 pass
2834
2835@requireAttrs(socket.socket, "sendmsg")
2836@unittest.skipUnless(thread, 'Threading required for this test.')
2837class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
2838 pass
2839
2840@requireAttrs(socket.socket, "recvmsg")
2841@unittest.skipUnless(thread, 'Threading required for this test.')
2842class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
2843 SendrecvmsgTCPTestBase):
2844 pass
2845
2846@requireAttrs(socket.socket, "recvmsg_into")
2847@unittest.skipUnless(thread, 'Threading required for this test.')
2848class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
2849 SendrecvmsgTCPTestBase):
2850 pass
2851
2852
2853class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
2854 SendrecvmsgConnectedBase,
2855 ConnectedStreamTestMixin, SCTPStreamBase):
2856 pass
2857
2858@requireAttrs(socket.socket, "sendmsg")
2859@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
2860@unittest.skipUnless(thread, 'Threading required for this test.')
2861class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
2862 pass
2863
2864@requireAttrs(socket.socket, "recvmsg")
2865@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
2866@unittest.skipUnless(thread, 'Threading required for this test.')
2867class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
2868 SendrecvmsgSCTPStreamTestBase):
2869 pass
2870
2871@requireAttrs(socket.socket, "recvmsg_into")
2872@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
2873@unittest.skipUnless(thread, 'Threading required for this test.')
2874class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
2875 SendrecvmsgSCTPStreamTestBase):
2876 pass
2877
2878
2879class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
2880 ConnectedStreamTestMixin, UnixStreamBase):
2881 pass
2882
2883@requireAttrs(socket.socket, "sendmsg")
2884@requireAttrs(socket, "AF_UNIX")
2885@unittest.skipUnless(thread, 'Threading required for this test.')
2886class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
2887 pass
2888
2889@requireAttrs(socket.socket, "recvmsg")
2890@requireAttrs(socket, "AF_UNIX")
2891@unittest.skipUnless(thread, 'Threading required for this test.')
2892class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
2893 SendrecvmsgUnixStreamTestBase):
2894 pass
2895
2896@requireAttrs(socket.socket, "recvmsg_into")
2897@requireAttrs(socket, "AF_UNIX")
2898@unittest.skipUnless(thread, 'Threading required for this test.')
2899class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
2900 SendrecvmsgUnixStreamTestBase):
2901 pass
2902
2903@requireAttrs(socket.socket, "sendmsg", "recvmsg")
2904@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
2905@unittest.skipUnless(thread, 'Threading required for this test.')
2906class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
2907 pass
2908
2909@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
2910@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
2911@unittest.skipUnless(thread, 'Threading required for this test.')
2912class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
2913 SendrecvmsgUnixStreamTestBase):
2914 pass
2915
2916
2917# Test interrupting the interruptible send/receive methods with a
2918# signal when a timeout is set. These tests avoid having multiple
2919# threads alive during the test so that the OS cannot deliver the
2920# signal to the wrong one.
2921
2922class InterruptedTimeoutBase(unittest.TestCase):
2923 # Base class for interrupted send/receive tests. Installs an
2924 # empty handler for SIGALRM and removes it on teardown, along with
2925 # any scheduled alarms.
2926
2927 def setUp(self):
2928 super().setUp()
2929 orig_alrm_handler = signal.signal(signal.SIGALRM,
2930 lambda signum, frame: None)
2931 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
2932 self.addCleanup(self.setAlarm, 0)
2933
2934 # Timeout for socket operations
2935 timeout = 4.0
2936
2937 # Provide setAlarm() method to schedule delivery of SIGALRM after
2938 # given number of seconds, or cancel it if zero, and an
2939 # appropriate time value to use. Use setitimer() if available.
2940 if hasattr(signal, "setitimer"):
2941 alarm_time = 0.05
2942
2943 def setAlarm(self, seconds):
2944 signal.setitimer(signal.ITIMER_REAL, seconds)
2945 else:
2946 # Old systems may deliver the alarm up to one second early
2947 alarm_time = 2
2948
2949 def setAlarm(self, seconds):
2950 signal.alarm(seconds)
2951
2952
2953# Require siginterrupt() in order to ensure that system calls are
2954# interrupted by default.
2955@requireAttrs(signal, "siginterrupt")
2956@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
2957 "Don't have signal.alarm or signal.setitimer")
2958class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
2959 # Test interrupting the recv*() methods with signals when a
2960 # timeout is set.
2961
2962 def setUp(self):
2963 super().setUp()
2964 self.serv.settimeout(self.timeout)
2965
2966 def checkInterruptedRecv(self, func, *args, **kwargs):
2967 # Check that func(*args, **kwargs) raises socket.error with an
2968 # errno of EINTR when interrupted by a signal.
2969 self.setAlarm(self.alarm_time)
2970 with self.assertRaises(socket.error) as cm:
2971 func(*args, **kwargs)
2972 self.assertNotIsInstance(cm.exception, socket.timeout)
2973 self.assertEqual(cm.exception.errno, errno.EINTR)
2974
2975 def testInterruptedRecvTimeout(self):
2976 self.checkInterruptedRecv(self.serv.recv, 1024)
2977
2978 def testInterruptedRecvIntoTimeout(self):
2979 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
2980
2981 def testInterruptedRecvfromTimeout(self):
2982 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
2983
2984 def testInterruptedRecvfromIntoTimeout(self):
2985 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
2986
2987 @requireAttrs(socket.socket, "recvmsg")
2988 def testInterruptedRecvmsgTimeout(self):
2989 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
2990
2991 @requireAttrs(socket.socket, "recvmsg_into")
2992 def testInterruptedRecvmsgIntoTimeout(self):
2993 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
2994
2995
2996# Require siginterrupt() in order to ensure that system calls are
2997# interrupted by default.
2998@requireAttrs(signal, "siginterrupt")
2999@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3000 "Don't have signal.alarm or signal.setitimer")
3001@unittest.skipUnless(thread, 'Threading required for this test.')
3002class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3003 ThreadSafeCleanupTestCase,
3004 SocketListeningTestMixin, TCPTestBase):
3005 # Test interrupting the interruptible send*() methods with signals
3006 # when a timeout is set.
3007
3008 def setUp(self):
3009 super().setUp()
3010 self.serv_conn = self.newSocket()
3011 self.addCleanup(self.serv_conn.close)
3012 # Use a thread to complete the connection, but wait for it to
3013 # terminate before running the test, so that there is only one
3014 # thread to accept the signal.
3015 cli_thread = threading.Thread(target=self.doConnect)
3016 cli_thread.start()
3017 self.cli_conn, addr = self.serv.accept()
3018 self.addCleanup(self.cli_conn.close)
3019 cli_thread.join()
3020 self.serv_conn.settimeout(self.timeout)
3021
3022 def doConnect(self):
3023 self.serv_conn.connect(self.serv_addr)
3024
3025 def checkInterruptedSend(self, func, *args, **kwargs):
3026 # Check that func(*args, **kwargs), run in a loop, raises
3027 # socket.error with an errno of EINTR when interrupted by a
3028 # signal.
3029 with self.assertRaises(socket.error) as cm:
3030 while True:
3031 self.setAlarm(self.alarm_time)
3032 func(*args, **kwargs)
3033 self.assertNotIsInstance(cm.exception, socket.timeout)
3034 self.assertEqual(cm.exception.errno, errno.EINTR)
3035
Nick Coghlan2496f332011-09-19 20:26:31 +10003036 # Issue #12958: The following tests have problems on Mac OS X
3037 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003038 def testInterruptedSendTimeout(self):
3039 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3040
Nick Coghlan2496f332011-09-19 20:26:31 +10003041 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003042 def testInterruptedSendtoTimeout(self):
3043 # Passing an actual address here as Python's wrapper for
3044 # sendto() doesn't allow passing a zero-length one; POSIX
3045 # requires that the address is ignored since the socket is
3046 # connection-mode, however.
3047 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3048 self.serv_addr)
3049
Nick Coghlan2496f332011-09-19 20:26:31 +10003050 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003051 @requireAttrs(socket.socket, "sendmsg")
3052 def testInterruptedSendmsgTimeout(self):
3053 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3054
3055
Victor Stinner45df8202010-04-28 22:31:17 +00003056@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003057class TCPCloserTest(ThreadedTCPSocketTest):
3058
3059 def testClose(self):
3060 conn, addr = self.serv.accept()
3061 conn.close()
3062
3063 sd = self.cli
3064 read, write, err = select.select([sd], [], [], 1.0)
3065 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003066 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003067
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003068 # Calling close() many times should be safe.
3069 conn.close()
3070 conn.close()
3071
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003072 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003073 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003074 time.sleep(1.0)
3075
Victor Stinner45df8202010-04-28 22:31:17 +00003076@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003077class BasicSocketPairTest(SocketPairTest):
3078
3079 def __init__(self, methodName='runTest'):
3080 SocketPairTest.__init__(self, methodName=methodName)
3081
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003082 def _check_defaults(self, sock):
3083 self.assertIsInstance(sock, socket.socket)
3084 if hasattr(socket, 'AF_UNIX'):
3085 self.assertEqual(sock.family, socket.AF_UNIX)
3086 else:
3087 self.assertEqual(sock.family, socket.AF_INET)
3088 self.assertEqual(sock.type, socket.SOCK_STREAM)
3089 self.assertEqual(sock.proto, 0)
3090
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003091 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003092 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003093
3094 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003095 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003096
Dave Cole331708b2004-08-09 04:51:41 +00003097 def testRecv(self):
3098 msg = self.serv.recv(1024)
3099 self.assertEqual(msg, MSG)
3100
3101 def _testRecv(self):
3102 self.cli.send(MSG)
3103
3104 def testSend(self):
3105 self.serv.send(MSG)
3106
3107 def _testSend(self):
3108 msg = self.cli.recv(1024)
3109 self.assertEqual(msg, MSG)
3110
Victor Stinner45df8202010-04-28 22:31:17 +00003111@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003112class NonBlockingTCPTests(ThreadedTCPSocketTest):
3113
3114 def __init__(self, methodName='runTest'):
3115 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3116
3117 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003118 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003119 self.serv.setblocking(0)
3120 start = time.time()
3121 try:
3122 self.serv.accept()
3123 except socket.error:
3124 pass
3125 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003126 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003127
3128 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003129 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003130
Antoine Pitroub1c54962010-10-14 15:05:38 +00003131 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003132 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003133 def testInitNonBlocking(self):
3134 # reinit server socket
3135 self.serv.close()
3136 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003137 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003138 self.port = support.bind_port(self.serv)
3139 self.serv.listen(1)
3140 # actual testing
3141 start = time.time()
3142 try:
3143 self.serv.accept()
3144 except socket.error:
3145 pass
3146 end = time.time()
3147 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3148
3149 def _testInitNonBlocking(self):
3150 pass
3151
Antoine Pitrou600232b2011-01-05 21:03:42 +00003152 def testInheritFlags(self):
3153 # Issue #7995: when calling accept() on a listening socket with a
3154 # timeout, the resulting socket should not be non-blocking.
3155 self.serv.settimeout(10)
3156 try:
3157 conn, addr = self.serv.accept()
3158 message = conn.recv(len(MSG))
3159 finally:
3160 conn.close()
3161 self.serv.settimeout(None)
3162
3163 def _testInheritFlags(self):
3164 time.sleep(0.1)
3165 self.cli.connect((HOST, self.port))
3166 time.sleep(0.5)
3167 self.cli.send(MSG)
3168
Guido van Rossum24e4af82002-06-12 19:18:08 +00003169 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003170 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003171 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003172 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003173 conn, addr = self.serv.accept()
3174 except socket.error:
3175 pass
3176 else:
3177 self.fail("Error trying to do non-blocking accept.")
3178 read, write, err = select.select([self.serv], [], [])
3179 if self.serv in read:
3180 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003181 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003182 else:
3183 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003184
Guido van Rossum24e4af82002-06-12 19:18:08 +00003185 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003186 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003187 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003188
3189 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003190 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003191 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003192 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003193
3194 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003195 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003196 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003197
3198 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003199 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003200 conn, addr = self.serv.accept()
3201 conn.setblocking(0)
3202 try:
3203 msg = conn.recv(len(MSG))
3204 except socket.error:
3205 pass
3206 else:
3207 self.fail("Error trying to do non-blocking recv.")
3208 read, write, err = select.select([conn], [], [])
3209 if conn in read:
3210 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003211 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003212 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003213 else:
3214 self.fail("Error during select call to non-blocking socket.")
3215
3216 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003217 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003218 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003219 self.cli.send(MSG)
3220
Victor Stinner45df8202010-04-28 22:31:17 +00003221@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003222class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003223 """Unit tests for the object returned by socket.makefile()
3224
Antoine Pitrou834bd812010-10-13 16:17:14 +00003225 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003226 the client connection. You can read from this file to
3227 get output from the server.
3228
Antoine Pitrou834bd812010-10-13 16:17:14 +00003229 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003230 server connection. You can write to this file to send output
3231 to the client.
3232 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003233
Guido van Rossume9f66142002-08-07 15:46:19 +00003234 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003235 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003236 errors = 'strict'
3237 newline = None
3238
3239 read_mode = 'rb'
3240 read_msg = MSG
3241 write_mode = 'wb'
3242 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003243
Guido van Rossum24e4af82002-06-12 19:18:08 +00003244 def __init__(self, methodName='runTest'):
3245 SocketConnectedTest.__init__(self, methodName=methodName)
3246
3247 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003248 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3249 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003250 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003251 self.read_file = self.cli_conn.makefile(
3252 self.read_mode, self.bufsize,
3253 encoding = self.encoding,
3254 errors = self.errors,
3255 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003256
3257 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003258 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003259 self.read_file.close()
3260 self.assertTrue(self.read_file.closed)
3261 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003262 SocketConnectedTest.tearDown(self)
3263
3264 def clientSetUp(self):
3265 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003266 self.write_file = self.serv_conn.makefile(
3267 self.write_mode, self.bufsize,
3268 encoding = self.encoding,
3269 errors = self.errors,
3270 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003271
3272 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003273 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003274 self.write_file.close()
3275 self.assertTrue(self.write_file.closed)
3276 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003277 SocketConnectedTest.clientTearDown(self)
3278
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003279 def testReadAfterTimeout(self):
3280 # Issue #7322: A file object must disallow further reads
3281 # after a timeout has occurred.
3282 self.cli_conn.settimeout(1)
3283 self.read_file.read(3)
3284 # First read raises a timeout
3285 self.assertRaises(socket.timeout, self.read_file.read, 1)
3286 # Second read is disallowed
3287 with self.assertRaises(IOError) as ctx:
3288 self.read_file.read(1)
3289 self.assertIn("cannot read from timed out object", str(ctx.exception))
3290
3291 def _testReadAfterTimeout(self):
3292 self.write_file.write(self.write_msg[0:3])
3293 self.write_file.flush()
3294 self.serv_finished.wait()
3295
Guido van Rossum24e4af82002-06-12 19:18:08 +00003296 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003297 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003298 first_seg = self.read_file.read(len(self.read_msg)-3)
3299 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003300 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003301 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003302
3303 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003304 self.write_file.write(self.write_msg)
3305 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003306
Guido van Rossum8c943832002-08-08 01:00:28 +00003307 def testFullRead(self):
3308 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003309 msg = self.read_file.read()
3310 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003311
3312 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003313 self.write_file.write(self.write_msg)
3314 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003315
Guido van Rossum24e4af82002-06-12 19:18:08 +00003316 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003317 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003318 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003319 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003320 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003321 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003322 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003323 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003324 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003325
3326 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003327 self.write_file.write(self.write_msg)
3328 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003329
3330 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003331 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003332 line = self.read_file.readline()
3333 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003334
3335 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003336 self.write_file.write(self.write_msg)
3337 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003338
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003339 def testCloseAfterMakefile(self):
3340 # The file returned by makefile should keep the socket open.
3341 self.cli_conn.close()
3342 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003343 msg = self.read_file.read()
3344 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003345
3346 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003347 self.write_file.write(self.write_msg)
3348 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003349
3350 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003351 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003352 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003353 if isinstance(self.read_msg, str):
3354 msg = msg.decode()
3355 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003356
3357 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003358 self.write_file.write(self.write_msg)
3359 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003360
Tim Peters116d83c2004-03-28 02:20:45 +00003361 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003362 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003363
3364 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003365 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003366
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003367 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003368 self.assertEqual(self.read_file.mode, self.read_mode)
3369 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003370
3371 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003372 self.assertEqual(self.write_file.mode, self.write_mode)
3373 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003374
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003375 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003376 self.read_file.close()
3377 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003378 self.cli_conn.close()
3379 self.assertRaises(socket.error, self.cli_conn.getsockname)
3380
3381 def _testRealClose(self):
3382 pass
3383
3384
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003385class FileObjectInterruptedTestCase(unittest.TestCase):
3386 """Test that the file object correctly handles EINTR internally."""
3387
3388 class MockSocket(object):
3389 def __init__(self, recv_funcs=()):
3390 # A generator that returns callables that we'll call for each
3391 # call to recv().
3392 self._recv_step = iter(recv_funcs)
3393
3394 def recv_into(self, buffer):
3395 data = next(self._recv_step)()
3396 assert len(buffer) >= len(data)
3397 buffer[:len(data)] = data
3398 return len(data)
3399
3400 def _decref_socketios(self):
3401 pass
3402
3403 def _textiowrap_for_test(self, buffering=-1):
3404 raw = socket.SocketIO(self, "r")
3405 if buffering < 0:
3406 buffering = io.DEFAULT_BUFFER_SIZE
3407 if buffering == 0:
3408 return raw
3409 buffer = io.BufferedReader(raw, buffering)
3410 text = io.TextIOWrapper(buffer, None, None)
3411 text.mode = "rb"
3412 return text
3413
3414 @staticmethod
3415 def _raise_eintr():
3416 raise socket.error(errno.EINTR)
3417
3418 def _textiowrap_mock_socket(self, mock, buffering=-1):
3419 raw = socket.SocketIO(mock, "r")
3420 if buffering < 0:
3421 buffering = io.DEFAULT_BUFFER_SIZE
3422 if buffering == 0:
3423 return raw
3424 buffer = io.BufferedReader(raw, buffering)
3425 text = io.TextIOWrapper(buffer, None, None)
3426 text.mode = "rb"
3427 return text
3428
3429 def _test_readline(self, size=-1, buffering=-1):
3430 mock_sock = self.MockSocket(recv_funcs=[
3431 lambda : b"This is the first line\nAnd the sec",
3432 self._raise_eintr,
3433 lambda : b"ond line is here\n",
3434 lambda : b"",
3435 lambda : b"", # XXX(gps): io library does an extra EOF read
3436 ])
3437 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003438 self.assertEqual(fo.readline(size), "This is the first line\n")
3439 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003440
3441 def _test_read(self, size=-1, buffering=-1):
3442 mock_sock = self.MockSocket(recv_funcs=[
3443 lambda : b"This is the first line\nAnd the sec",
3444 self._raise_eintr,
3445 lambda : b"ond line is here\n",
3446 lambda : b"",
3447 lambda : b"", # XXX(gps): io library does an extra EOF read
3448 ])
3449 expecting = (b"This is the first line\n"
3450 b"And the second line is here\n")
3451 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3452 if buffering == 0:
3453 data = b''
3454 else:
3455 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003456 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003457 while len(data) != len(expecting):
3458 part = fo.read(size)
3459 if not part:
3460 break
3461 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003462 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003463
3464 def test_default(self):
3465 self._test_readline()
3466 self._test_readline(size=100)
3467 self._test_read()
3468 self._test_read(size=100)
3469
3470 def test_with_1k_buffer(self):
3471 self._test_readline(buffering=1024)
3472 self._test_readline(size=100, buffering=1024)
3473 self._test_read(buffering=1024)
3474 self._test_read(size=100, buffering=1024)
3475
3476 def _test_readline_no_buffer(self, size=-1):
3477 mock_sock = self.MockSocket(recv_funcs=[
3478 lambda : b"a",
3479 lambda : b"\n",
3480 lambda : b"B",
3481 self._raise_eintr,
3482 lambda : b"b",
3483 lambda : b"",
3484 ])
3485 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003486 self.assertEqual(fo.readline(size), b"a\n")
3487 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003488
3489 def test_no_buffer(self):
3490 self._test_readline_no_buffer()
3491 self._test_readline_no_buffer(size=4)
3492 self._test_read(buffering=0)
3493 self._test_read(size=100, buffering=0)
3494
3495
Guido van Rossume9f66142002-08-07 15:46:19 +00003496class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3497
3498 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003499
Guido van Rossume9f66142002-08-07 15:46:19 +00003500 In this case (and in this case only), it should be possible to
3501 create a file object, read a line from it, create another file
3502 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003503 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003504 when reading multiple requests from the same socket."""
3505
3506 bufsize = 0 # Use unbuffered mode
3507
3508 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003509 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003510 line = self.read_file.readline() # first line
3511 self.assertEqual(line, b"A. " + self.write_msg) # first line
3512 self.read_file = self.cli_conn.makefile('rb', 0)
3513 line = self.read_file.readline() # second line
3514 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003515
3516 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003517 self.write_file.write(b"A. " + self.write_msg)
3518 self.write_file.write(b"B. " + self.write_msg)
3519 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003520
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003521 def testMakefileClose(self):
3522 # The file returned by makefile should keep the socket open...
3523 self.cli_conn.close()
3524 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003525 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003526 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003527 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003528 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3529
3530 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003531 self.write_file.write(self.write_msg)
3532 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003533
3534 def testMakefileCloseSocketDestroy(self):
3535 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003536 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003537 refcount_after = sys.getrefcount(self.cli_conn)
3538 self.assertEqual(refcount_before - 1, refcount_after)
3539
3540 def _testMakefileCloseSocketDestroy(self):
3541 pass
3542
Antoine Pitrou98b46702010-09-18 22:59:00 +00003543 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003544 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003545 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3546
3547 def testSmallReadNonBlocking(self):
3548 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003549 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3550 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003551 self.evt1.set()
3552 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003553 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003554 if first_seg is None:
3555 # Data not arrived (can happen under Windows), wait a bit
3556 time.sleep(0.5)
3557 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003558 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003559 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003560 self.assertEqual(n, 3)
3561 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003562 self.assertEqual(msg, self.read_msg)
3563 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3564 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003565
3566 def _testSmallReadNonBlocking(self):
3567 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003568 self.write_file.write(self.write_msg)
3569 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003570 self.evt2.set()
3571 # Avoid cloding the socket before the server test has finished,
3572 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3573 self.serv_finished.wait(5.0)
3574
3575 def testWriteNonBlocking(self):
3576 self.cli_finished.wait(5.0)
3577 # The client thread can't skip directly - the SkipTest exception
3578 # would appear as a failure.
3579 if self.serv_skipped:
3580 self.skipTest(self.serv_skipped)
3581
3582 def _testWriteNonBlocking(self):
3583 self.serv_skipped = None
3584 self.serv_conn.setblocking(False)
3585 # Try to saturate the socket buffer pipe with repeated large writes.
3586 BIG = b"x" * (1024 ** 2)
3587 LIMIT = 10
3588 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003589 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003590 self.assertGreater(n, 0)
3591 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003592 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003593 if n is None:
3594 # Succeeded
3595 break
3596 self.assertGreater(n, 0)
3597 else:
3598 # Let us know that this test didn't manage to establish
3599 # the expected conditions. This is not a failure in itself but,
3600 # if it happens repeatedly, the test should be fixed.
3601 self.serv_skipped = "failed to saturate the socket buffer"
3602
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003603
Guido van Rossum8c943832002-08-08 01:00:28 +00003604class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3605
3606 bufsize = 1 # Default-buffered for reading; line-buffered for writing
3607
3608
3609class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3610
3611 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00003612
Thomas Woutersb2137042007-02-01 18:02:27 +00003613
Antoine Pitrou834bd812010-10-13 16:17:14 +00003614class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
3615 """Tests for socket.makefile() in text mode (rather than binary)"""
3616
3617 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003618 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003619 write_mode = 'wb'
3620 write_msg = MSG
3621 newline = ''
3622
3623
3624class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
3625 """Tests for socket.makefile() in text mode (rather than binary)"""
3626
3627 read_mode = 'rb'
3628 read_msg = MSG
3629 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003630 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003631 newline = ''
3632
3633
3634class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
3635 """Tests for socket.makefile() in text mode (rather than binary)"""
3636
3637 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003638 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003639 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003640 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003641 newline = ''
3642
3643
Guido van Rossumd8faa362007-04-27 19:54:29 +00003644class NetworkConnectionTest(object):
3645 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003646
Guido van Rossumd8faa362007-04-27 19:54:29 +00003647 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003648 # We're inherited below by BasicTCPTest2, which also inherits
3649 # BasicTCPTest, which defines self.port referenced below.
3650 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003651 self.serv_conn = self.cli
3652
3653class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
3654 """Tests that NetworkConnection does not break existing TCP functionality.
3655 """
3656
3657class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003658
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003659 class MockSocket(socket.socket):
3660 def connect(self, *args):
3661 raise socket.timeout('timed out')
3662
3663 @contextlib.contextmanager
3664 def mocked_socket_module(self):
3665 """Return a socket which times out on connect"""
3666 old_socket = socket.socket
3667 socket.socket = self.MockSocket
3668 try:
3669 yield
3670 finally:
3671 socket.socket = old_socket
3672
3673 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003674 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003675 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003676 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003677 with self.assertRaises(socket.error) as cm:
3678 cli.connect((HOST, port))
3679 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3680
3681 def test_create_connection(self):
3682 # Issue #9792: errors raised by create_connection() should have
3683 # a proper errno attribute.
3684 port = support.find_unused_port()
3685 with self.assertRaises(socket.error) as cm:
3686 socket.create_connection((HOST, port))
3687 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3688
3689 def test_create_connection_timeout(self):
3690 # Issue #9792: create_connection() should not recast timeout errors
3691 # as generic socket errors.
3692 with self.mocked_socket_module():
3693 with self.assertRaises(socket.timeout):
3694 socket.create_connection((HOST, 1234))
3695
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696
Victor Stinner45df8202010-04-28 22:31:17 +00003697@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003698class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
3699
3700 def __init__(self, methodName='runTest'):
3701 SocketTCPTest.__init__(self, methodName=methodName)
3702 ThreadableTest.__init__(self)
3703
3704 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003705 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003706
3707 def clientTearDown(self):
3708 self.cli.close()
3709 self.cli = None
3710 ThreadableTest.clientTearDown(self)
3711
3712 def _justAccept(self):
3713 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003714 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003715
3716 testFamily = _justAccept
3717 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003718 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003719 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003720 self.assertEqual(self.cli.family, 2)
3721
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003722 testSourceAddress = _justAccept
3723 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003724 self.cli = socket.create_connection((HOST, self.port), timeout=30,
3725 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003726 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00003727 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003728 # The port number being used is sufficient to show that the bind()
3729 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00003730
Guido van Rossumd8faa362007-04-27 19:54:29 +00003731 testTimeoutDefault = _justAccept
3732 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00003733 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003734 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003735 socket.setdefaulttimeout(42)
3736 try:
3737 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003738 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003739 finally:
3740 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003741 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003742
3743 testTimeoutNone = _justAccept
3744 def _testTimeoutNone(self):
3745 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003746 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003747 socket.setdefaulttimeout(30)
3748 try:
3749 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003750 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003751 finally:
3752 socket.setdefaulttimeout(None)
3753 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003754
3755 testTimeoutValueNamed = _justAccept
3756 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003757 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003758 self.assertEqual(self.cli.gettimeout(), 30)
3759
3760 testTimeoutValueNonamed = _justAccept
3761 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003762 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003763 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003764 self.assertEqual(self.cli.gettimeout(), 30)
3765
Victor Stinner45df8202010-04-28 22:31:17 +00003766@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003767class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
3768
3769 def __init__(self, methodName='runTest'):
3770 SocketTCPTest.__init__(self, methodName=methodName)
3771 ThreadableTest.__init__(self)
3772
3773 def clientSetUp(self):
3774 pass
3775
3776 def clientTearDown(self):
3777 self.cli.close()
3778 self.cli = None
3779 ThreadableTest.clientTearDown(self)
3780
3781 def testInsideTimeout(self):
3782 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003783 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003784 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003785 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003786 testOutsideTimeout = testInsideTimeout
3787
3788 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003789 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003791 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003792
3793 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003794 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003795 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003796
3797
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003798class TCPTimeoutTest(SocketTCPTest):
3799
3800 def testTCPTimeout(self):
3801 def raise_timeout(*args, **kwargs):
3802 self.serv.settimeout(1.0)
3803 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003804 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003805 "Error generating a timeout exception (TCP)")
3806
3807 def testTimeoutZero(self):
3808 ok = False
3809 try:
3810 self.serv.settimeout(0.0)
3811 foo = self.serv.accept()
3812 except socket.timeout:
3813 self.fail("caught timeout instead of error (TCP)")
3814 except socket.error:
3815 ok = True
3816 except:
3817 self.fail("caught unexpected exception (TCP)")
3818 if not ok:
3819 self.fail("accept() returned success when we did not expect it")
3820
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003821 def testInterruptedTimeout(self):
3822 # XXX I don't know how to do this test on MSWindows or any other
3823 # plaform that doesn't support signal.alarm() or os.kill(), though
3824 # the bug should have existed on all platforms.
3825 if not hasattr(signal, "alarm"):
3826 return # can only test on *nix
3827 self.serv.settimeout(5.0) # must be longer than alarm
3828 class Alarm(Exception):
3829 pass
3830 def alarm_handler(signal, frame):
3831 raise Alarm
3832 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
3833 try:
3834 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
3835 try:
3836 foo = self.serv.accept()
3837 except socket.timeout:
3838 self.fail("caught timeout instead of Alarm")
3839 except Alarm:
3840 pass
3841 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00003842 self.fail("caught other exception instead of Alarm:"
3843 " %s(%s):\n%s" %
3844 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003845 else:
3846 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00003847 finally:
3848 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003849 except Alarm:
3850 self.fail("got Alarm in wrong place")
3851 finally:
3852 # no alarm can be pending. Safe to restore old handler.
3853 signal.signal(signal.SIGALRM, old_alarm)
3854
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003855class UDPTimeoutTest(SocketTCPTest):
3856
3857 def testUDPTimeout(self):
3858 def raise_timeout(*args, **kwargs):
3859 self.serv.settimeout(1.0)
3860 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003861 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003862 "Error generating a timeout exception (UDP)")
3863
3864 def testTimeoutZero(self):
3865 ok = False
3866 try:
3867 self.serv.settimeout(0.0)
3868 foo = self.serv.recv(1024)
3869 except socket.timeout:
3870 self.fail("caught timeout instead of error (UDP)")
3871 except socket.error:
3872 ok = True
3873 except:
3874 self.fail("caught unexpected exception (UDP)")
3875 if not ok:
3876 self.fail("recv() returned success when we did not expect it")
3877
3878class TestExceptions(unittest.TestCase):
3879
3880 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003881 self.assertTrue(issubclass(socket.error, Exception))
3882 self.assertTrue(issubclass(socket.herror, socket.error))
3883 self.assertTrue(issubclass(socket.gaierror, socket.error))
3884 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003885
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003886class TestLinuxAbstractNamespace(unittest.TestCase):
3887
3888 UNIX_PATH_MAX = 108
3889
3890 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003891 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00003892 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
3893 s1.bind(address)
3894 s1.listen(1)
3895 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
3896 s2.connect(s1.getsockname())
3897 with s1.accept()[0] as s3:
3898 self.assertEqual(s1.getsockname(), address)
3899 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003900
3901 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003902 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00003903 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
3904 s.bind(address)
3905 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003906
3907 def testNameOverflow(self):
3908 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00003909 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
3910 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003911
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003912
Victor Stinner45df8202010-04-28 22:31:17 +00003913@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00003914class BufferIOTest(SocketConnectedTest):
3915 """
3916 Test the buffer versions of socket.recv() and socket.send().
3917 """
3918 def __init__(self, methodName='runTest'):
3919 SocketConnectedTest.__init__(self, methodName=methodName)
3920
Antoine Pitrou25480782010-03-17 22:50:28 +00003921 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00003922 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003923 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003924 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003925 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00003926 self.assertEqual(msg, MSG)
3927
Antoine Pitrou25480782010-03-17 22:50:28 +00003928 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00003929 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003930 self.serv_conn.send(buf)
3931
Antoine Pitrou25480782010-03-17 22:50:28 +00003932 def testRecvIntoBytearray(self):
3933 buf = bytearray(1024)
3934 nbytes = self.cli_conn.recv_into(buf)
3935 self.assertEqual(nbytes, len(MSG))
3936 msg = buf[:len(MSG)]
3937 self.assertEqual(msg, MSG)
3938
3939 _testRecvIntoBytearray = _testRecvIntoArray
3940
3941 def testRecvIntoMemoryview(self):
3942 buf = bytearray(1024)
3943 nbytes = self.cli_conn.recv_into(memoryview(buf))
3944 self.assertEqual(nbytes, len(MSG))
3945 msg = buf[:len(MSG)]
3946 self.assertEqual(msg, MSG)
3947
3948 _testRecvIntoMemoryview = _testRecvIntoArray
3949
3950 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00003951 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003952 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003953 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003954 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00003955 self.assertEqual(msg, MSG)
3956
Antoine Pitrou25480782010-03-17 22:50:28 +00003957 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00003958 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003959 self.serv_conn.send(buf)
3960
Antoine Pitrou25480782010-03-17 22:50:28 +00003961 def testRecvFromIntoBytearray(self):
3962 buf = bytearray(1024)
3963 nbytes, addr = self.cli_conn.recvfrom_into(buf)
3964 self.assertEqual(nbytes, len(MSG))
3965 msg = buf[:len(MSG)]
3966 self.assertEqual(msg, MSG)
3967
3968 _testRecvFromIntoBytearray = _testRecvFromIntoArray
3969
3970 def testRecvFromIntoMemoryview(self):
3971 buf = bytearray(1024)
3972 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
3973 self.assertEqual(nbytes, len(MSG))
3974 msg = buf[:len(MSG)]
3975 self.assertEqual(msg, MSG)
3976
3977 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
3978
Christian Heimes043d6f62008-01-07 17:19:16 +00003979
3980TIPC_STYPE = 2000
3981TIPC_LOWER = 200
3982TIPC_UPPER = 210
3983
3984def isTipcAvailable():
3985 """Check if the TIPC module is loaded
3986
3987 The TIPC module is not loaded automatically on Ubuntu and probably
3988 other Linux distros.
3989 """
3990 if not hasattr(socket, "AF_TIPC"):
3991 return False
3992 if not os.path.isfile("/proc/modules"):
3993 return False
3994 with open("/proc/modules") as f:
3995 for line in f:
3996 if line.startswith("tipc "):
3997 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003998 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00003999 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4000 return False
4001
4002class TIPCTest (unittest.TestCase):
4003 def testRDM(self):
4004 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4005 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4006
4007 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4008 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4009 TIPC_LOWER, TIPC_UPPER)
4010 srv.bind(srvaddr)
4011
4012 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4013 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4014 cli.sendto(MSG, sendaddr)
4015
4016 msg, recvaddr = srv.recvfrom(1024)
4017
4018 self.assertEqual(cli.getsockname(), recvaddr)
4019 self.assertEqual(msg, MSG)
4020
4021
4022class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
4023 def __init__(self, methodName = 'runTest'):
4024 unittest.TestCase.__init__(self, methodName = methodName)
4025 ThreadableTest.__init__(self)
4026
4027 def setUp(self):
4028 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
4029 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4030 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4031 TIPC_LOWER, TIPC_UPPER)
4032 self.srv.bind(srvaddr)
4033 self.srv.listen(5)
4034 self.serverExplicitReady()
4035 self.conn, self.connaddr = self.srv.accept()
4036
4037 def clientSetUp(self):
4038 # The is a hittable race between serverExplicitReady() and the
4039 # accept() call; sleep a little while to avoid it, otherwise
4040 # we could get an exception
4041 time.sleep(0.1)
4042 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
4043 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4044 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4045 self.cli.connect(addr)
4046 self.cliaddr = self.cli.getsockname()
4047
4048 def testStream(self):
4049 msg = self.conn.recv(1024)
4050 self.assertEqual(msg, MSG)
4051 self.assertEqual(self.cliaddr, self.connaddr)
4052
4053 def _testStream(self):
4054 self.cli.send(MSG)
4055 self.cli.close()
4056
4057
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004058@unittest.skipUnless(thread, 'Threading required for this test.')
4059class ContextManagersTest(ThreadedTCPSocketTest):
4060
4061 def _testSocketClass(self):
4062 # base test
4063 with socket.socket() as sock:
4064 self.assertFalse(sock._closed)
4065 self.assertTrue(sock._closed)
4066 # close inside with block
4067 with socket.socket() as sock:
4068 sock.close()
4069 self.assertTrue(sock._closed)
4070 # exception inside with block
4071 with socket.socket() as sock:
4072 self.assertRaises(socket.error, sock.sendall, b'foo')
4073 self.assertTrue(sock._closed)
4074
4075 def testCreateConnectionBase(self):
4076 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004077 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004078 data = conn.recv(1024)
4079 conn.sendall(data)
4080
4081 def _testCreateConnectionBase(self):
4082 address = self.serv.getsockname()
4083 with socket.create_connection(address) as sock:
4084 self.assertFalse(sock._closed)
4085 sock.sendall(b'foo')
4086 self.assertEqual(sock.recv(1024), b'foo')
4087 self.assertTrue(sock._closed)
4088
4089 def testCreateConnectionClose(self):
4090 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004091 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004092 data = conn.recv(1024)
4093 conn.sendall(data)
4094
4095 def _testCreateConnectionClose(self):
4096 address = self.serv.getsockname()
4097 with socket.create_connection(address) as sock:
4098 sock.close()
4099 self.assertTrue(sock._closed)
4100 self.assertRaises(socket.error, sock.sendall, b'foo')
4101
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004102
Antoine Pitroub1c54962010-10-14 15:05:38 +00004103@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4104 "SOCK_CLOEXEC not defined")
4105@unittest.skipUnless(fcntl, "module fcntl not available")
4106class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004107 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004108 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004109 with socket.socket(socket.AF_INET,
4110 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4111 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4112 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004113
4114
4115@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4116 "SOCK_NONBLOCK not defined")
4117class NonblockConstantTest(unittest.TestCase):
4118 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4119 if nonblock:
4120 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4121 self.assertEqual(s.gettimeout(), timeout)
4122 else:
4123 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4124 self.assertEqual(s.gettimeout(), None)
4125
Charles-François Natali239bb962011-06-03 12:55:15 +02004126 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004127 def test_SOCK_NONBLOCK(self):
4128 # a lot of it seems silly and redundant, but I wanted to test that
4129 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004130 with socket.socket(socket.AF_INET,
4131 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4132 self.checkNonblock(s)
4133 s.setblocking(1)
4134 self.checkNonblock(s, False)
4135 s.setblocking(0)
4136 self.checkNonblock(s)
4137 s.settimeout(None)
4138 self.checkNonblock(s, False)
4139 s.settimeout(2.0)
4140 self.checkNonblock(s, timeout=2.0)
4141 s.setblocking(1)
4142 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004143 # defaulttimeout
4144 t = socket.getdefaulttimeout()
4145 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004146 with socket.socket() as s:
4147 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004148 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004149 with socket.socket() as s:
4150 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004151 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004152 with socket.socket() as s:
4153 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004154 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004155 with socket.socket() as s:
4156 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004157 socket.setdefaulttimeout(t)
4158
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004159
Guido van Rossumb995eb72002-07-31 16:08:40 +00004160def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004161 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004162 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004163
4164 tests.extend([
4165 NonBlockingTCPTests,
4166 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004167 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004168 UnbufferedFileObjectClassTestCase,
4169 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004170 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004171 UnicodeReadFileObjectClassTestCase,
4172 UnicodeWriteFileObjectClassTestCase,
4173 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004174 NetworkConnectionNoServer,
4175 NetworkConnectionAttributesTest,
4176 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004177 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004178 CloexecConstantTest,
4179 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004180 ])
Dave Cole331708b2004-08-09 04:51:41 +00004181 if hasattr(socket, "socketpair"):
4182 tests.append(BasicSocketPairTest)
Victor Stinnere6747472011-08-21 00:39:18 +02004183 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004184 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004185 if isTipcAvailable():
4186 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004187 tests.append(TIPCThreadableTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004188 tests.extend([
4189 CmsgMacroTests,
4190 SendmsgUDPTest,
4191 RecvmsgUDPTest,
4192 RecvmsgIntoUDPTest,
4193 SendmsgUDP6Test,
4194 RecvmsgUDP6Test,
4195 RecvmsgRFC3542AncillaryUDP6Test,
4196 RecvmsgIntoRFC3542AncillaryUDP6Test,
4197 RecvmsgIntoUDP6Test,
4198 SendmsgTCPTest,
4199 RecvmsgTCPTest,
4200 RecvmsgIntoTCPTest,
4201 SendmsgSCTPStreamTest,
4202 RecvmsgSCTPStreamTest,
4203 RecvmsgIntoSCTPStreamTest,
4204 SendmsgUnixStreamTest,
4205 RecvmsgUnixStreamTest,
4206 RecvmsgIntoUnixStreamTest,
4207 RecvmsgSCMRightsStreamTest,
4208 RecvmsgIntoSCMRightsStreamTest,
4209 # These are slow when setitimer() is not available
4210 InterruptedRecvTimeoutTest,
4211 InterruptedSendTimeoutTest,
4212 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004213
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004214 thread_info = support.threading_setup()
4215 support.run_unittest(*tests)
4216 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004217
4218if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004219 test_main()