blob: bbc9b7864b02721c0d329cc5700ad853f0677f2a [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()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000170 except BaseException as e:
171 self.queue.put(e)
172 finally:
173 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000174
175 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000176 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000177
178 def clientTearDown(self):
179 self.done.set()
180 thread.exit()
181
182class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
183
184 def __init__(self, methodName='runTest'):
185 SocketTCPTest.__init__(self, methodName=methodName)
186 ThreadableTest.__init__(self)
187
188 def clientSetUp(self):
189 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
190
191 def clientTearDown(self):
192 self.cli.close()
193 self.cli = None
194 ThreadableTest.clientTearDown(self)
195
196class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
197
198 def __init__(self, methodName='runTest'):
199 SocketUDPTest.__init__(self, methodName=methodName)
200 ThreadableTest.__init__(self)
201
202 def clientSetUp(self):
203 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
204
Brian Curtin3beb38f2010-11-04 03:41:43 +0000205 def clientTearDown(self):
206 self.cli.close()
207 self.cli = None
208 ThreadableTest.clientTearDown(self)
209
Guido van Rossum24e4af82002-06-12 19:18:08 +0000210class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000211 """Socket tests for client-server connection.
212
213 self.cli_conn is a client socket connected to the server. The
214 setUp() method guarantees that it is connected to the server.
215 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000216
217 def __init__(self, methodName='runTest'):
218 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
219
220 def setUp(self):
221 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000222 # Indicate explicitly we're ready for the client thread to
223 # proceed and then perform the blocking call to accept
224 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000225 conn, addr = self.serv.accept()
226 self.cli_conn = conn
227
228 def tearDown(self):
229 self.cli_conn.close()
230 self.cli_conn = None
231 ThreadedTCPSocketTest.tearDown(self)
232
233 def clientSetUp(self):
234 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000235 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236 self.serv_conn = self.cli
237
238 def clientTearDown(self):
239 self.serv_conn.close()
240 self.serv_conn = None
241 ThreadedTCPSocketTest.clientTearDown(self)
242
Dave Cole331708b2004-08-09 04:51:41 +0000243class SocketPairTest(unittest.TestCase, ThreadableTest):
244
245 def __init__(self, methodName='runTest'):
246 unittest.TestCase.__init__(self, methodName=methodName)
247 ThreadableTest.__init__(self)
248
249 def setUp(self):
250 self.serv, self.cli = socket.socketpair()
251
252 def tearDown(self):
253 self.serv.close()
254 self.serv = None
255
256 def clientSetUp(self):
257 pass
258
259 def clientTearDown(self):
260 self.cli.close()
261 self.cli = None
262 ThreadableTest.clientTearDown(self)
263
Tim Peters494aaee2004-08-09 18:54:11 +0000264
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000265# The following classes are used by the sendmsg()/recvmsg() tests.
266# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
267# gives a drop-in replacement for SocketConnectedTest, but different
268# address families can be used, and the attributes serv_addr and
269# cli_addr will be set to the addresses of the endpoints.
270
271class SocketTestBase(unittest.TestCase):
272 """A base class for socket tests.
273
274 Subclasses must provide methods newSocket() to return a new socket
275 and bindSock(sock) to bind it to an unused address.
276
277 Creates a socket self.serv and sets self.serv_addr to its address.
278 """
279
280 def setUp(self):
281 self.serv = self.newSocket()
282 self.bindServer()
283
284 def bindServer(self):
285 """Bind server socket and set self.serv_addr to its address."""
286 self.bindSock(self.serv)
287 self.serv_addr = self.serv.getsockname()
288
289 def tearDown(self):
290 self.serv.close()
291 self.serv = None
292
293
294class SocketListeningTestMixin(SocketTestBase):
295 """Mixin to listen on the server socket."""
296
297 def setUp(self):
298 super().setUp()
299 self.serv.listen(1)
300
301
302class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
303 ThreadableTest):
304 """Mixin to add client socket and allow client/server tests.
305
306 Client socket is self.cli and its address is self.cli_addr. See
307 ThreadableTest for usage information.
308 """
309
310 def __init__(self, *args, **kwargs):
311 super().__init__(*args, **kwargs)
312 ThreadableTest.__init__(self)
313
314 def clientSetUp(self):
315 self.cli = self.newClientSocket()
316 self.bindClient()
317
318 def newClientSocket(self):
319 """Return a new socket for use as client."""
320 return self.newSocket()
321
322 def bindClient(self):
323 """Bind client socket and set self.cli_addr to its address."""
324 self.bindSock(self.cli)
325 self.cli_addr = self.cli.getsockname()
326
327 def clientTearDown(self):
328 self.cli.close()
329 self.cli = None
330 ThreadableTest.clientTearDown(self)
331
332
333class ConnectedStreamTestMixin(SocketListeningTestMixin,
334 ThreadedSocketTestMixin):
335 """Mixin to allow client/server stream tests with connected client.
336
337 Server's socket representing connection to client is self.cli_conn
338 and client's connection to server is self.serv_conn. (Based on
339 SocketConnectedTest.)
340 """
341
342 def setUp(self):
343 super().setUp()
344 # Indicate explicitly we're ready for the client thread to
345 # proceed and then perform the blocking call to accept
346 self.serverExplicitReady()
347 conn, addr = self.serv.accept()
348 self.cli_conn = conn
349
350 def tearDown(self):
351 self.cli_conn.close()
352 self.cli_conn = None
353 super().tearDown()
354
355 def clientSetUp(self):
356 super().clientSetUp()
357 self.cli.connect(self.serv_addr)
358 self.serv_conn = self.cli
359
360 def clientTearDown(self):
361 self.serv_conn.close()
362 self.serv_conn = None
363 super().clientTearDown()
364
365
366class UnixSocketTestBase(SocketTestBase):
367 """Base class for Unix-domain socket tests."""
368
369 # This class is used for file descriptor passing tests, so we
370 # create the sockets in a private directory so that other users
371 # can't send anything that might be problematic for a privileged
372 # user running the tests.
373
374 def setUp(self):
375 self.dir_path = tempfile.mkdtemp()
376 self.addCleanup(os.rmdir, self.dir_path)
377 super().setUp()
378
379 def bindSock(self, sock):
380 path = tempfile.mktemp(dir=self.dir_path)
381 sock.bind(path)
382 self.addCleanup(support.unlink, path)
383
384class UnixStreamBase(UnixSocketTestBase):
385 """Base class for Unix-domain SOCK_STREAM tests."""
386
387 def newSocket(self):
388 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
389
390
391class InetTestBase(SocketTestBase):
392 """Base class for IPv4 socket tests."""
393
394 host = HOST
395
396 def setUp(self):
397 super().setUp()
398 self.port = self.serv_addr[1]
399
400 def bindSock(self, sock):
401 support.bind_port(sock, host=self.host)
402
403class TCPTestBase(InetTestBase):
404 """Base class for TCP-over-IPv4 tests."""
405
406 def newSocket(self):
407 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
408
409class UDPTestBase(InetTestBase):
410 """Base class for UDP-over-IPv4 tests."""
411
412 def newSocket(self):
413 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
414
415class SCTPStreamBase(InetTestBase):
416 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
417
418 def newSocket(self):
419 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
420 socket.IPPROTO_SCTP)
421
422
423class Inet6TestBase(InetTestBase):
424 """Base class for IPv6 socket tests."""
425
426 # Don't use "localhost" here - it may not have an IPv6 address
427 # assigned to it by default (e.g. in /etc/hosts), and if someone
428 # has assigned it an IPv4-mapped address, then it's unlikely to
429 # work with the full IPv6 API.
430 host = "::1"
431
432class UDP6TestBase(Inet6TestBase):
433 """Base class for UDP-over-IPv6 tests."""
434
435 def newSocket(self):
436 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
437
438
439# Test-skipping decorators for use with ThreadableTest.
440
441def skipWithClientIf(condition, reason):
442 """Skip decorated test if condition is true, add client_skip decorator.
443
444 If the decorated object is not a class, sets its attribute
445 "client_skip" to a decorator which will return an empty function
446 if the test is to be skipped, or the original function if it is
447 not. This can be used to avoid running the client part of a
448 skipped test when using ThreadableTest.
449 """
450 def client_pass(*args, **kwargs):
451 pass
452 def skipdec(obj):
453 retval = unittest.skip(reason)(obj)
454 if not isinstance(obj, type):
455 retval.client_skip = lambda f: client_pass
456 return retval
457 def noskipdec(obj):
458 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
459 obj.client_skip = lambda f: f
460 return obj
461 return skipdec if condition else noskipdec
462
463
464def requireAttrs(obj, *attributes):
465 """Skip decorated test if obj is missing any of the given attributes.
466
467 Sets client_skip attribute as skipWithClientIf() does.
468 """
469 missing = [name for name in attributes if not hasattr(obj, name)]
470 return skipWithClientIf(
471 missing, "don't have " + ", ".join(name for name in missing))
472
473
474def requireSocket(*args):
475 """Skip decorated test if a socket cannot be created with given arguments.
476
477 When an argument is given as a string, will use the value of that
478 attribute of the socket module, or skip the test if it doesn't
479 exist. Sets client_skip attribute as skipWithClientIf() does.
480 """
481 err = None
482 missing = [obj for obj in args if
483 isinstance(obj, str) and not hasattr(socket, obj)]
484 if missing:
485 err = "don't have " + ", ".join(name for name in missing)
486 else:
487 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
488 for obj in args]
489 try:
490 s = socket.socket(*callargs)
491 except socket.error as e:
492 # XXX: check errno?
493 err = str(e)
494 else:
495 s.close()
496 return skipWithClientIf(
497 err is not None,
498 "can't create socket({0}): {1}".format(
499 ", ".join(str(o) for o in args), err))
500
501
Guido van Rossum24e4af82002-06-12 19:18:08 +0000502#######################################################################
503## Begin Tests
504
505class GeneralModuleTests(unittest.TestCase):
506
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000507 def test_repr(self):
508 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000509 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000510 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000511
Raymond Hettinger027bb632004-05-31 03:09:25 +0000512 def test_weakref(self):
513 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
514 p = proxy(s)
515 self.assertEqual(p.fileno(), s.fileno())
516 s.close()
517 s = None
518 try:
519 p.fileno()
520 except ReferenceError:
521 pass
522 else:
523 self.fail('Socket proxy still exists')
524
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000526 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300527 msg = "Error raising socket exception (%s)."
528 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000529 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300530 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300532 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534
Ezio Melotti63e42302011-05-07 19:47:48 +0300535 def testSendtoErrors(self):
536 # Testing that sendto doens't masks failures. See #10169.
537 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
538 self.addCleanup(s.close)
539 s.bind(('', 0))
540 sockname = s.getsockname()
541 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300542 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300543 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300544 self.assertEqual(str(cm.exception),
545 "'str' does not support the buffer interface")
546 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300547 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300548 self.assertEqual(str(cm.exception),
549 "'complex' does not support the buffer interface")
550 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300551 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300552 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300553 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300554 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300555 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300556 self.assertEqual(str(cm.exception),
557 "'str' does not support the buffer interface")
558 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300559 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300560 self.assertEqual(str(cm.exception),
561 "'complex' does not support the buffer interface")
562 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300563 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300564 self.assertIn('not NoneType', str(cm.exception))
565 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300566 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300567 self.assertIn('an integer is required', str(cm.exception))
568 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300569 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300570 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300571 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300572 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300573 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300574 self.assertIn('(1 given)', str(cm.exception))
575 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300576 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300577 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300578
Guido van Rossum24e4af82002-06-12 19:18:08 +0000579 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000580 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000581 socket.AF_INET
582 socket.SOCK_STREAM
583 socket.SOCK_DGRAM
584 socket.SOCK_RAW
585 socket.SOCK_RDM
586 socket.SOCK_SEQPACKET
587 socket.SOL_SOCKET
588 socket.SO_REUSEADDR
589
Guido van Rossum654c11e2002-06-13 20:24:17 +0000590 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000591 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000592 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000593 try:
594 ip = socket.gethostbyname(hostname)
595 except socket.error:
596 # Probably name lookup wasn't set up right; skip this test
597 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000598 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000599 try:
600 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
601 except socket.error:
602 # Probably a similar problem as above; skip this test
603 return
Brett Cannon01668a12005-03-11 00:04:17 +0000604 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000605 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000606 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000607 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000608
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000609 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
610 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
611 def test_sethostname(self):
612 oldhn = socket.gethostname()
613 try:
614 socket.sethostname('new')
615 except socket.error as e:
616 if e.errno == errno.EPERM:
617 self.skipTest("test should be run as root")
618 else:
619 raise
620 try:
621 # running test as root!
622 self.assertEqual(socket.gethostname(), 'new')
623 # Should work with bytes objects too
624 socket.sethostname(b'bar')
625 self.assertEqual(socket.gethostname(), 'bar')
626 finally:
627 socket.sethostname(oldhn)
628
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700629 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
630 'socket.if_nameindex() not available.')
631 def testInterfaceNameIndex(self):
632 interfaces = socket.if_nameindex()
633 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200634 self.assertIsInstance(index, int)
635 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700636 # interface indices are non-zero integers
637 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200638 _index = socket.if_nametoindex(name)
639 self.assertIsInstance(_index, int)
640 self.assertEqual(index, _index)
641 _name = socket.if_indextoname(index)
642 self.assertIsInstance(_name, str)
643 self.assertEqual(name, _name)
644
645 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
646 'socket.if_nameindex() not available.')
647 def testInvalidInterfaceNameIndex(self):
648 # test nonexistent interface index/name
649 self.assertRaises(socket.error, socket.if_indextoname, 0)
650 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
651 # test with invalid values
652 self.assertRaises(TypeError, socket.if_nametoindex, 0)
653 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700654
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000655 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000656 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000657 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000658 try:
659 # On some versions, this loses a reference
660 orig = sys.getrefcount(__name__)
661 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000662 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000663 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000664 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000665
Guido van Rossum24e4af82002-06-12 19:18:08 +0000666 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000667 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000668 try:
669 # On some versions, this crashes the interpreter.
670 socket.getnameinfo(('x', 0, 0, 0), 0)
671 except socket.error:
672 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000673
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000674 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000675 # This just checks that htons etc. are their own inverse,
676 # when looking at the lower 16 or 32 bits.
677 sizes = {socket.htonl: 32, socket.ntohl: 32,
678 socket.htons: 16, socket.ntohs: 16}
679 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000680 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000681 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
682 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000683
Guido van Rossuma2627af2002-09-14 00:58:46 +0000684 swapped = func(mask)
685 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000686 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000687
Guido van Rossum018919a2007-01-15 00:07:32 +0000688 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000689 good_values = [ 1, 2, 3, 1, 2, 3 ]
690 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000691 for k in good_values:
692 socket.ntohl(k)
693 socket.ntohs(k)
694 socket.htonl(k)
695 socket.htons(k)
696 for k in bad_values:
697 self.assertRaises(OverflowError, socket.ntohl, k)
698 self.assertRaises(OverflowError, socket.ntohs, k)
699 self.assertRaises(OverflowError, socket.htonl, k)
700 self.assertRaises(OverflowError, socket.htons, k)
701
Barry Warsaw11b91a02004-06-28 00:50:43 +0000702 def testGetServBy(self):
703 eq = self.assertEqual
704 # Find one service that exists, then check all the related interfaces.
705 # I've ordered this by protocols that have both a tcp and udp
706 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200707 if (sys.platform.startswith(('freebsd', 'netbsd'))
708 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000709 # avoid the 'echo' service on this platform, as there is an
710 # assumption breaking non-standard port/protocol entry
711 services = ('daytime', 'qotd', 'domain')
712 else:
713 services = ('echo', 'daytime', 'domain')
714 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000715 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000716 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000717 break
718 except socket.error:
719 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000720 else:
721 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000722 # Try same call with optional protocol omitted
723 port2 = socket.getservbyname(service)
724 eq(port, port2)
725 # Try udp, but don't barf it it doesn't exist
726 try:
727 udpport = socket.getservbyname(service, 'udp')
728 except socket.error:
729 udpport = None
730 else:
731 eq(udpport, port)
732 # Now make sure the lookup by port returns the same service name
733 eq(socket.getservbyport(port2), service)
734 eq(socket.getservbyport(port, 'tcp'), service)
735 if udpport is not None:
736 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000737 # Make sure getservbyport does not accept out of range ports.
738 self.assertRaises(OverflowError, socket.getservbyport, -1)
739 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000741 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000742 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000743 # The default timeout should initially be None
744 self.assertEqual(socket.getdefaulttimeout(), None)
745 s = socket.socket()
746 self.assertEqual(s.gettimeout(), None)
747 s.close()
748
749 # Set the default timeout to 10, and see if it propagates
750 socket.setdefaulttimeout(10)
751 self.assertEqual(socket.getdefaulttimeout(), 10)
752 s = socket.socket()
753 self.assertEqual(s.gettimeout(), 10)
754 s.close()
755
756 # Reset the default timeout to None, and see if it propagates
757 socket.setdefaulttimeout(None)
758 self.assertEqual(socket.getdefaulttimeout(), None)
759 s = socket.socket()
760 self.assertEqual(s.gettimeout(), None)
761 s.close()
762
763 # Check that setting it to an invalid value raises ValueError
764 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
765
766 # Check that setting it to an invalid type raises TypeError
767 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
768
Benjamin Petersonf91df042009-02-13 02:50:59 +0000769 def testIPv4_inet_aton_fourbytes(self):
770 if not hasattr(socket, 'inet_aton'):
771 return # No inet_aton, nothing to check
772 # Test that issue1008086 and issue767150 are fixed.
773 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000774 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
775 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000776
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000777 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000778 if not hasattr(socket, 'inet_pton'):
779 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000780 from socket import inet_aton as f, inet_pton, AF_INET
781 g = lambda a: inet_pton(AF_INET, a)
782
Ezio Melottib3aedd42010-11-20 19:04:17 +0000783 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
784 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
785 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
786 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
787 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000788
Ezio Melottib3aedd42010-11-20 19:04:17 +0000789 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
790 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
791 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
792 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000793
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000794 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000795 if not hasattr(socket, 'inet_pton'):
796 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000797 try:
798 from socket import inet_pton, AF_INET6, has_ipv6
799 if not has_ipv6:
800 return
801 except ImportError:
802 return
803 f = lambda a: inet_pton(AF_INET6, a)
804
Ezio Melottib3aedd42010-11-20 19:04:17 +0000805 self.assertEqual(b'\x00' * 16, f('::'))
806 self.assertEqual(b'\x00' * 16, f('0::0'))
807 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
808 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000809 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 +0000810 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
811 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000812
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000813 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000814 if not hasattr(socket, 'inet_ntop'):
815 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000816 from socket import inet_ntoa as f, inet_ntop, AF_INET
817 g = lambda a: inet_ntop(AF_INET, a)
818
Ezio Melottib3aedd42010-11-20 19:04:17 +0000819 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
820 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
821 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
822 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000823
Ezio Melottib3aedd42010-11-20 19:04:17 +0000824 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
825 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
826 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000827
828 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000829 if not hasattr(socket, 'inet_ntop'):
830 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000831 try:
832 from socket import inet_ntop, AF_INET6, has_ipv6
833 if not has_ipv6:
834 return
835 except ImportError:
836 return
837 f = lambda a: inet_ntop(AF_INET6, a)
838
Ezio Melottib3aedd42010-11-20 19:04:17 +0000839 self.assertEqual('::', f(b'\x00' * 16))
840 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
841 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000842 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000843 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 +0000844 )
845
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000846 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000847
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000848 def testSockName(self):
849 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200850 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000851 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000852 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000853 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000855 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
856 # it reasonable to get the host's addr in addition to 0.0.0.0.
857 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000858 try:
859 my_ip_addr = socket.gethostbyname(socket.gethostname())
860 except socket.error:
861 # Probably name lookup wasn't set up right; skip this test
862 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000863 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000864 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865
866 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000867 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 # We know a socket should start without reuse==0
869 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000870 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000872 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000873
874 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000875 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000877 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
879 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000880 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000881
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000882 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000883 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000884 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
885 sock.settimeout(1)
886 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000887 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000888
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000889 def testNewAttributes(self):
890 # testing .family, .type and .protocol
891 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
892 self.assertEqual(sock.family, socket.AF_INET)
893 self.assertEqual(sock.type, socket.SOCK_STREAM)
894 self.assertEqual(sock.proto, 0)
895 sock.close()
896
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000897 def test_getsockaddrarg(self):
898 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200899 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000900 big_port = port + 65536
901 neg_port = port - 65536
902 sock = socket.socket()
903 try:
904 self.assertRaises(OverflowError, sock.bind, (host, big_port))
905 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
906 sock.bind((host, port))
907 finally:
908 sock.close()
909
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000910 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000911 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000912 self.assertTrue(hasattr(socket.socket, 'ioctl'))
913 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
914 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
915 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000916 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
917 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000918 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000919 self.assertRaises(ValueError, s.ioctl, -1, None)
920 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000921
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000922 def testGetaddrinfo(self):
923 try:
924 socket.getaddrinfo('localhost', 80)
925 except socket.gaierror as err:
926 if err.errno == socket.EAI_SERVICE:
927 # see http://bugs.python.org/issue1282647
928 self.skipTest("buggy libc version")
929 raise
930 # len of every sequence is supposed to be == 5
931 for info in socket.getaddrinfo(HOST, None):
932 self.assertEqual(len(info), 5)
933 # host can be a domain name, a string representation of an
934 # IPv4/v6 address or None
935 socket.getaddrinfo('localhost', 80)
936 socket.getaddrinfo('127.0.0.1', 80)
937 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200938 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000939 socket.getaddrinfo('::1', 80)
940 # port can be a string service name such as "http", a numeric
941 # port number or None
942 socket.getaddrinfo(HOST, "http")
943 socket.getaddrinfo(HOST, 80)
944 socket.getaddrinfo(HOST, None)
945 # test family and socktype filters
946 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
947 for family, _, _, _, _ in infos:
948 self.assertEqual(family, socket.AF_INET)
949 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
950 for _, socktype, _, _, _ in infos:
951 self.assertEqual(socktype, socket.SOCK_STREAM)
952 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000953 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000954 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
955 # a server willing to support both IPv4 and IPv6 will
956 # usually do this
957 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
958 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000959 # test keyword arguments
960 a = socket.getaddrinfo(HOST, None)
961 b = socket.getaddrinfo(host=HOST, port=None)
962 self.assertEqual(a, b)
963 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
964 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
965 self.assertEqual(a, b)
966 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
967 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
968 self.assertEqual(a, b)
969 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
970 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
971 self.assertEqual(a, b)
972 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
973 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
974 self.assertEqual(a, b)
975 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
976 socket.AI_PASSIVE)
977 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
978 type=socket.SOCK_STREAM, proto=0,
979 flags=socket.AI_PASSIVE)
980 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000981 # Issue #6697.
982 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000983
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000984 def test_getnameinfo(self):
985 # only IP addresses are allowed
986 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
987
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000988 @unittest.skipUnless(support.is_resource_enabled('network'),
989 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000990 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000991 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000992 # these should all be successful
993 socket.gethostbyname('испытание.python.org')
994 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000995 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
996 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
997 # have a reverse entry yet
998 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000999
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001000 def check_sendall_interrupted(self, with_timeout):
1001 # socketpair() is not stricly required, but it makes things easier.
1002 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1003 self.skipTest("signal.alarm and socket.socketpair required for this test")
1004 # Our signal handlers clobber the C errno by calling a math function
1005 # with an invalid domain value.
1006 def ok_handler(*args):
1007 self.assertRaises(ValueError, math.acosh, 0)
1008 def raising_handler(*args):
1009 self.assertRaises(ValueError, math.acosh, 0)
1010 1 // 0
1011 c, s = socket.socketpair()
1012 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1013 try:
1014 if with_timeout:
1015 # Just above the one second minimum for signal.alarm
1016 c.settimeout(1.5)
1017 with self.assertRaises(ZeroDivisionError):
1018 signal.alarm(1)
1019 c.sendall(b"x" * (1024**2))
1020 if with_timeout:
1021 signal.signal(signal.SIGALRM, ok_handler)
1022 signal.alarm(1)
1023 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1024 finally:
1025 signal.signal(signal.SIGALRM, old_alarm)
1026 c.close()
1027 s.close()
1028
1029 def test_sendall_interrupted(self):
1030 self.check_sendall_interrupted(False)
1031
1032 def test_sendall_interrupted_with_timeout(self):
1033 self.check_sendall_interrupted(True)
1034
Antoine Pitroue033e062010-10-29 10:38:18 +00001035 def test_dealloc_warn(self):
1036 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1037 r = repr(sock)
1038 with self.assertWarns(ResourceWarning) as cm:
1039 sock = None
1040 support.gc_collect()
1041 self.assertIn(r, str(cm.warning.args[0]))
1042 # An open socket file object gets dereferenced after the socket
1043 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1044 f = sock.makefile('rb')
1045 r = repr(sock)
1046 sock = None
1047 support.gc_collect()
1048 with self.assertWarns(ResourceWarning):
1049 f = None
1050 support.gc_collect()
1051
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001052 def test_name_closed_socketio(self):
1053 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1054 fp = sock.makefile("rb")
1055 fp.close()
1056 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1057
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001058 def test_pickle(self):
1059 sock = socket.socket()
1060 with sock:
1061 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1062 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1063
Antoine Pitrou3cade992011-05-10 19:19:13 +02001064 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001065 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1066 srv.bind((HOST, 0))
1067 # backlog = 0
1068 srv.listen(0)
1069 srv.close()
1070
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001071
Victor Stinner45df8202010-04-28 22:31:17 +00001072@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001073class BasicTCPTest(SocketConnectedTest):
1074
1075 def __init__(self, methodName='runTest'):
1076 SocketConnectedTest.__init__(self, methodName=methodName)
1077
1078 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001079 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001080 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001081 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082
1083 def _testRecv(self):
1084 self.serv_conn.send(MSG)
1085
1086 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001087 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001088 seg1 = self.cli_conn.recv(len(MSG) - 3)
1089 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001090 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001091 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001092
1093 def _testOverFlowRecv(self):
1094 self.serv_conn.send(MSG)
1095
1096 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001097 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001099 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001100
1101 def _testRecvFrom(self):
1102 self.serv_conn.send(MSG)
1103
1104 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001105 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001106 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1107 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001108 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001109 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001110
1111 def _testOverFlowRecvFrom(self):
1112 self.serv_conn.send(MSG)
1113
1114 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001115 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001116 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001117 while 1:
1118 read = self.cli_conn.recv(1024)
1119 if not read:
1120 break
Guido van Rossume531e292002-08-08 20:28:34 +00001121 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001122 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001123
1124 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001125 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126 self.serv_conn.sendall(big_chunk)
1127
1128 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001129 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001130 fd = self.cli_conn.fileno()
1131 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001132 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001133 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001134 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001135 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001136
1137 def _testFromFd(self):
1138 self.serv_conn.send(MSG)
1139
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001140 def testDup(self):
1141 # Testing dup()
1142 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001143 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001144 msg = sock.recv(1024)
1145 self.assertEqual(msg, MSG)
1146
1147 def _testDup(self):
1148 self.serv_conn.send(MSG)
1149
Guido van Rossum24e4af82002-06-12 19:18:08 +00001150 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001151 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001152 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001153 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001154 # wait for _testShutdown to finish: on OS X, when the server
1155 # closes the connection the client also becomes disconnected,
1156 # and the client's shutdown call will fail. (Issue #4397.)
1157 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001158
1159 def _testShutdown(self):
1160 self.serv_conn.send(MSG)
1161 self.serv_conn.shutdown(2)
1162
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001163 def testDetach(self):
1164 # Testing detach()
1165 fileno = self.cli_conn.fileno()
1166 f = self.cli_conn.detach()
1167 self.assertEqual(f, fileno)
1168 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001169 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1170 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001171 # ...but we can create another socket using the (still open)
1172 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001173 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001174 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001175 msg = sock.recv(1024)
1176 self.assertEqual(msg, MSG)
1177
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001178 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001179 self.serv_conn.send(MSG)
1180
Victor Stinner45df8202010-04-28 22:31:17 +00001181@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001182class BasicUDPTest(ThreadedUDPSocketTest):
1183
1184 def __init__(self, methodName='runTest'):
1185 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1186
1187 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001188 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001189 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001190 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001191
1192 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001193 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001194
Guido van Rossum1c938012002-06-12 21:17:20 +00001195 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001196 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001197 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001198 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001199
Guido van Rossum1c938012002-06-12 21:17:20 +00001200 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001201 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001202
Guido van Rossumd8faa362007-04-27 19:54:29 +00001203 def testRecvFromNegative(self):
1204 # Negative lengths passed to recvfrom should give ValueError.
1205 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1206
1207 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001208 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001209
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001210
1211# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1212# same test code is used with different families and types of socket
1213# (e.g. stream, datagram), and tests using recvmsg() are repeated
1214# using recvmsg_into().
1215#
1216# The generic test classes such as SendmsgTests and
1217# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1218# supplied with sockets cli_sock and serv_sock representing the
1219# client's and the server's end of the connection respectively, and
1220# attributes cli_addr and serv_addr holding their (numeric where
1221# appropriate) addresses.
1222#
1223# The final concrete test classes combine these with subclasses of
1224# SocketTestBase which set up client and server sockets of a specific
1225# type, and with subclasses of SendrecvmsgBase such as
1226# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1227# sockets to cli_sock and serv_sock and override the methods and
1228# attributes of SendrecvmsgBase to fill in destination addresses if
1229# needed when sending, check for specific flags in msg_flags, etc.
1230#
1231# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1232# recvmsg_into().
1233
1234# XXX: like the other datagram (UDP) tests in this module, the code
1235# here assumes that datagram delivery on the local machine will be
1236# reliable.
1237
1238class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1239 # Base class for sendmsg()/recvmsg() tests.
1240
1241 # Time in seconds to wait before considering a test failed, or
1242 # None for no timeout. Not all tests actually set a timeout.
1243 fail_timeout = 3.0
1244
1245 def setUp(self):
1246 self.misc_event = threading.Event()
1247 super().setUp()
1248
1249 def sendToServer(self, msg):
1250 # Send msg to the server.
1251 return self.cli_sock.send(msg)
1252
1253 # Tuple of alternative default arguments for sendmsg() when called
1254 # via sendmsgToServer() (e.g. to include a destination address).
1255 sendmsg_to_server_defaults = ()
1256
1257 def sendmsgToServer(self, *args):
1258 # Call sendmsg() on self.cli_sock with the given arguments,
1259 # filling in any arguments which are not supplied with the
1260 # corresponding items of self.sendmsg_to_server_defaults, if
1261 # any.
1262 return self.cli_sock.sendmsg(
1263 *(args + self.sendmsg_to_server_defaults[len(args):]))
1264
1265 def doRecvmsg(self, sock, bufsize, *args):
1266 # Call recvmsg() on sock with given arguments and return its
1267 # result. Should be used for tests which can use either
1268 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1269 # this method with one which emulates it using recvmsg_into(),
1270 # thus allowing the same test to be used for both methods.
1271 result = sock.recvmsg(bufsize, *args)
1272 self.registerRecvmsgResult(result)
1273 return result
1274
1275 def registerRecvmsgResult(self, result):
1276 # Called by doRecvmsg() with the return value of recvmsg() or
1277 # recvmsg_into(). Can be overridden to arrange cleanup based
1278 # on the returned ancillary data, for instance.
1279 pass
1280
1281 def checkRecvmsgAddress(self, addr1, addr2):
1282 # Called to compare the received address with the address of
1283 # the peer.
1284 self.assertEqual(addr1, addr2)
1285
1286 # Flags that are normally unset in msg_flags
1287 msg_flags_common_unset = 0
1288 for name in ("MSG_CTRUNC", "MSG_OOB"):
1289 msg_flags_common_unset |= getattr(socket, name, 0)
1290
1291 # Flags that are normally set
1292 msg_flags_common_set = 0
1293
1294 # Flags set when a complete record has been received (e.g. MSG_EOR
1295 # for SCTP)
1296 msg_flags_eor_indicator = 0
1297
1298 # Flags set when a complete record has not been received
1299 # (e.g. MSG_TRUNC for datagram sockets)
1300 msg_flags_non_eor_indicator = 0
1301
1302 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1303 # Method to check the value of msg_flags returned by recvmsg[_into]().
1304 #
1305 # Checks that all bits in msg_flags_common_set attribute are
1306 # set in "flags" and all bits in msg_flags_common_unset are
1307 # unset.
1308 #
1309 # The "eor" argument specifies whether the flags should
1310 # indicate that a full record (or datagram) has been received.
1311 # If "eor" is None, no checks are done; otherwise, checks
1312 # that:
1313 #
1314 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1315 # set and all bits in msg_flags_non_eor_indicator are unset
1316 #
1317 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1318 # are set and all bits in msg_flags_eor_indicator are unset
1319 #
1320 # If "checkset" and/or "checkunset" are supplied, they require
1321 # the given bits to be set or unset respectively, overriding
1322 # what the attributes require for those bits.
1323 #
1324 # If any bits are set in "ignore", they will not be checked,
1325 # regardless of the other inputs.
1326 #
1327 # Will raise Exception if the inputs require a bit to be both
1328 # set and unset, and it is not ignored.
1329
1330 defaultset = self.msg_flags_common_set
1331 defaultunset = self.msg_flags_common_unset
1332
1333 if eor:
1334 defaultset |= self.msg_flags_eor_indicator
1335 defaultunset |= self.msg_flags_non_eor_indicator
1336 elif eor is not None:
1337 defaultset |= self.msg_flags_non_eor_indicator
1338 defaultunset |= self.msg_flags_eor_indicator
1339
1340 # Function arguments override defaults
1341 defaultset &= ~checkunset
1342 defaultunset &= ~checkset
1343
1344 # Merge arguments with remaining defaults, and check for conflicts
1345 checkset |= defaultset
1346 checkunset |= defaultunset
1347 inboth = checkset & checkunset & ~ignore
1348 if inboth:
1349 raise Exception("contradictory set, unset requirements for flags "
1350 "{0:#x}".format(inboth))
1351
1352 # Compare with given msg_flags value
1353 mask = (checkset | checkunset) & ~ignore
1354 self.assertEqual(flags & mask, checkset & mask)
1355
1356
1357class RecvmsgIntoMixin(SendrecvmsgBase):
1358 # Mixin to implement doRecvmsg() using recvmsg_into().
1359
1360 def doRecvmsg(self, sock, bufsize, *args):
1361 buf = bytearray(bufsize)
1362 result = sock.recvmsg_into([buf], *args)
1363 self.registerRecvmsgResult(result)
1364 self.assertGreaterEqual(result[0], 0)
1365 self.assertLessEqual(result[0], bufsize)
1366 return (bytes(buf[:result[0]]),) + result[1:]
1367
1368
1369class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1370 # Defines flags to be checked in msg_flags for datagram sockets.
1371
1372 @property
1373 def msg_flags_non_eor_indicator(self):
1374 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1375
1376
1377class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1378 # Defines flags to be checked in msg_flags for SCTP sockets.
1379
1380 @property
1381 def msg_flags_eor_indicator(self):
1382 return super().msg_flags_eor_indicator | socket.MSG_EOR
1383
1384
1385class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1386 # Base class for tests on connectionless-mode sockets. Users must
1387 # supply sockets on attributes cli and serv to be mapped to
1388 # cli_sock and serv_sock respectively.
1389
1390 @property
1391 def serv_sock(self):
1392 return self.serv
1393
1394 @property
1395 def cli_sock(self):
1396 return self.cli
1397
1398 @property
1399 def sendmsg_to_server_defaults(self):
1400 return ([], [], 0, self.serv_addr)
1401
1402 def sendToServer(self, msg):
1403 return self.cli_sock.sendto(msg, self.serv_addr)
1404
1405
1406class SendrecvmsgConnectedBase(SendrecvmsgBase):
1407 # Base class for tests on connected sockets. Users must supply
1408 # sockets on attributes serv_conn and cli_conn (representing the
1409 # connections *to* the server and the client), to be mapped to
1410 # cli_sock and serv_sock respectively.
1411
1412 @property
1413 def serv_sock(self):
1414 return self.cli_conn
1415
1416 @property
1417 def cli_sock(self):
1418 return self.serv_conn
1419
1420 def checkRecvmsgAddress(self, addr1, addr2):
1421 # Address is currently "unspecified" for a connected socket,
1422 # so we don't examine it
1423 pass
1424
1425
1426class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1427 # Base class to set a timeout on server's socket.
1428
1429 def setUp(self):
1430 super().setUp()
1431 self.serv_sock.settimeout(self.fail_timeout)
1432
1433
1434class SendmsgTests(SendrecvmsgServerTimeoutBase):
1435 # Tests for sendmsg() which can use any socket type and do not
1436 # involve recvmsg() or recvmsg_into().
1437
1438 def testSendmsg(self):
1439 # Send a simple message with sendmsg().
1440 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1441
1442 def _testSendmsg(self):
1443 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1444
1445 def testSendmsgDataGenerator(self):
1446 # Send from buffer obtained from a generator (not a sequence).
1447 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1448
1449 def _testSendmsgDataGenerator(self):
1450 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1451 len(MSG))
1452
1453 def testSendmsgAncillaryGenerator(self):
1454 # Gather (empty) ancillary data from a generator.
1455 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1456
1457 def _testSendmsgAncillaryGenerator(self):
1458 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1459 len(MSG))
1460
1461 def testSendmsgArray(self):
1462 # Send data from an array instead of the usual bytes object.
1463 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1464
1465 def _testSendmsgArray(self):
1466 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1467 len(MSG))
1468
1469 def testSendmsgGather(self):
1470 # Send message data from more than one buffer (gather write).
1471 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1472
1473 def _testSendmsgGather(self):
1474 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1475
1476 def testSendmsgBadArgs(self):
1477 # Check that sendmsg() rejects invalid arguments.
1478 self.assertEqual(self.serv_sock.recv(1000), b"done")
1479
1480 def _testSendmsgBadArgs(self):
1481 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1482 self.assertRaises(TypeError, self.sendmsgToServer,
1483 b"not in an iterable")
1484 self.assertRaises(TypeError, self.sendmsgToServer,
1485 object())
1486 self.assertRaises(TypeError, self.sendmsgToServer,
1487 [object()])
1488 self.assertRaises(TypeError, self.sendmsgToServer,
1489 [MSG, object()])
1490 self.assertRaises(TypeError, self.sendmsgToServer,
1491 [MSG], object())
1492 self.assertRaises(TypeError, self.sendmsgToServer,
1493 [MSG], [], object())
1494 self.assertRaises(TypeError, self.sendmsgToServer,
1495 [MSG], [], 0, object())
1496 self.sendToServer(b"done")
1497
1498 def testSendmsgBadCmsg(self):
1499 # Check that invalid ancillary data items are rejected.
1500 self.assertEqual(self.serv_sock.recv(1000), b"done")
1501
1502 def _testSendmsgBadCmsg(self):
1503 self.assertRaises(TypeError, self.sendmsgToServer,
1504 [MSG], [object()])
1505 self.assertRaises(TypeError, self.sendmsgToServer,
1506 [MSG], [(object(), 0, b"data")])
1507 self.assertRaises(TypeError, self.sendmsgToServer,
1508 [MSG], [(0, object(), b"data")])
1509 self.assertRaises(TypeError, self.sendmsgToServer,
1510 [MSG], [(0, 0, object())])
1511 self.assertRaises(TypeError, self.sendmsgToServer,
1512 [MSG], [(0, 0)])
1513 self.assertRaises(TypeError, self.sendmsgToServer,
1514 [MSG], [(0, 0, b"data", 42)])
1515 self.sendToServer(b"done")
1516
1517 @requireAttrs(socket, "CMSG_SPACE")
1518 def testSendmsgBadMultiCmsg(self):
1519 # Check that invalid ancillary data items are rejected when
1520 # more than one item is present.
1521 self.assertEqual(self.serv_sock.recv(1000), b"done")
1522
1523 @testSendmsgBadMultiCmsg.client_skip
1524 def _testSendmsgBadMultiCmsg(self):
1525 self.assertRaises(TypeError, self.sendmsgToServer,
1526 [MSG], [0, 0, b""])
1527 self.assertRaises(TypeError, self.sendmsgToServer,
1528 [MSG], [(0, 0, b""), object()])
1529 self.sendToServer(b"done")
1530
1531 def testSendmsgExcessCmsgReject(self):
1532 # Check that sendmsg() rejects excess ancillary data items
1533 # when the number that can be sent is limited.
1534 self.assertEqual(self.serv_sock.recv(1000), b"done")
1535
1536 def _testSendmsgExcessCmsgReject(self):
1537 if not hasattr(socket, "CMSG_SPACE"):
1538 # Can only send one item
1539 with self.assertRaises(socket.error) as cm:
1540 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1541 self.assertIsNone(cm.exception.errno)
1542 self.sendToServer(b"done")
1543
1544 def testSendmsgAfterClose(self):
1545 # Check that sendmsg() fails on a closed socket.
1546 pass
1547
1548 def _testSendmsgAfterClose(self):
1549 self.cli_sock.close()
1550 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1551
1552
1553class SendmsgStreamTests(SendmsgTests):
1554 # Tests for sendmsg() which require a stream socket and do not
1555 # involve recvmsg() or recvmsg_into().
1556
1557 def testSendmsgExplicitNoneAddr(self):
1558 # Check that peer address can be specified as None.
1559 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1560
1561 def _testSendmsgExplicitNoneAddr(self):
1562 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1563
1564 def testSendmsgTimeout(self):
1565 # Check that timeout works with sendmsg().
1566 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1567 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1568
1569 def _testSendmsgTimeout(self):
1570 try:
1571 self.cli_sock.settimeout(0.03)
1572 with self.assertRaises(socket.timeout):
1573 while True:
1574 self.sendmsgToServer([b"a"*512])
1575 finally:
1576 self.misc_event.set()
1577
1578 # XXX: would be nice to have more tests for sendmsg flags argument.
1579
1580 # Linux supports MSG_DONTWAIT when sending, but in general, it
1581 # only works when receiving. Could add other platforms if they
1582 # support it too.
1583 @skipWithClientIf(sys.platform not in {"linux2"},
1584 "MSG_DONTWAIT not known to work on this platform when "
1585 "sending")
1586 def testSendmsgDontWait(self):
1587 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1588 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1589 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1590
1591 @testSendmsgDontWait.client_skip
1592 def _testSendmsgDontWait(self):
1593 try:
1594 with self.assertRaises(socket.error) as cm:
1595 while True:
1596 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1597 self.assertIn(cm.exception.errno,
1598 (errno.EAGAIN, errno.EWOULDBLOCK))
1599 finally:
1600 self.misc_event.set()
1601
1602
1603class SendmsgConnectionlessTests(SendmsgTests):
1604 # Tests for sendmsg() which require a connectionless-mode
1605 # (e.g. datagram) socket, and do not involve recvmsg() or
1606 # recvmsg_into().
1607
1608 def testSendmsgNoDestAddr(self):
1609 # Check that sendmsg() fails when no destination address is
1610 # given for unconnected socket.
1611 pass
1612
1613 def _testSendmsgNoDestAddr(self):
1614 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1615 [MSG])
1616 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1617 [MSG], [], 0, None)
1618
1619
1620class RecvmsgGenericTests(SendrecvmsgBase):
1621 # Tests for recvmsg() which can also be emulated using
1622 # recvmsg_into(), and can use any socket type.
1623
1624 def testRecvmsg(self):
1625 # Receive a simple message with recvmsg[_into]().
1626 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1627 self.assertEqual(msg, MSG)
1628 self.checkRecvmsgAddress(addr, self.cli_addr)
1629 self.assertEqual(ancdata, [])
1630 self.checkFlags(flags, eor=True)
1631
1632 def _testRecvmsg(self):
1633 self.sendToServer(MSG)
1634
1635 def testRecvmsgExplicitDefaults(self):
1636 # Test recvmsg[_into]() with default arguments provided explicitly.
1637 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1638 len(MSG), 0, 0)
1639 self.assertEqual(msg, MSG)
1640 self.checkRecvmsgAddress(addr, self.cli_addr)
1641 self.assertEqual(ancdata, [])
1642 self.checkFlags(flags, eor=True)
1643
1644 def _testRecvmsgExplicitDefaults(self):
1645 self.sendToServer(MSG)
1646
1647 def testRecvmsgShorter(self):
1648 # Receive a message smaller than buffer.
1649 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1650 len(MSG) + 42)
1651 self.assertEqual(msg, MSG)
1652 self.checkRecvmsgAddress(addr, self.cli_addr)
1653 self.assertEqual(ancdata, [])
1654 self.checkFlags(flags, eor=True)
1655
1656 def _testRecvmsgShorter(self):
1657 self.sendToServer(MSG)
1658
1659 def testRecvmsgTrunc(self):
1660 # Receive part of message, check for truncation indicators.
1661 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1662 len(MSG) - 3)
1663 self.assertEqual(msg, MSG[:-3])
1664 self.checkRecvmsgAddress(addr, self.cli_addr)
1665 self.assertEqual(ancdata, [])
1666 self.checkFlags(flags, eor=False)
1667
1668 def _testRecvmsgTrunc(self):
1669 self.sendToServer(MSG)
1670
1671 def testRecvmsgShortAncillaryBuf(self):
1672 # Test ancillary data buffer too small to hold any ancillary data.
1673 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1674 len(MSG), 1)
1675 self.assertEqual(msg, MSG)
1676 self.checkRecvmsgAddress(addr, self.cli_addr)
1677 self.assertEqual(ancdata, [])
1678 self.checkFlags(flags, eor=True)
1679
1680 def _testRecvmsgShortAncillaryBuf(self):
1681 self.sendToServer(MSG)
1682
1683 def testRecvmsgLongAncillaryBuf(self):
1684 # Test large ancillary data buffer.
1685 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1686 len(MSG), 10240)
1687 self.assertEqual(msg, MSG)
1688 self.checkRecvmsgAddress(addr, self.cli_addr)
1689 self.assertEqual(ancdata, [])
1690 self.checkFlags(flags, eor=True)
1691
1692 def _testRecvmsgLongAncillaryBuf(self):
1693 self.sendToServer(MSG)
1694
1695 def testRecvmsgAfterClose(self):
1696 # Check that recvmsg[_into]() fails on a closed socket.
1697 self.serv_sock.close()
1698 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
1699
1700 def _testRecvmsgAfterClose(self):
1701 pass
1702
1703 def testRecvmsgTimeout(self):
1704 # Check that timeout works.
1705 try:
1706 self.serv_sock.settimeout(0.03)
1707 self.assertRaises(socket.timeout,
1708 self.doRecvmsg, self.serv_sock, len(MSG))
1709 finally:
1710 self.misc_event.set()
1711
1712 def _testRecvmsgTimeout(self):
1713 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1714
1715 @requireAttrs(socket, "MSG_PEEK")
1716 def testRecvmsgPeek(self):
1717 # Check that MSG_PEEK in flags enables examination of pending
1718 # data without consuming it.
1719
1720 # Receive part of data with MSG_PEEK.
1721 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1722 len(MSG) - 3, 0,
1723 socket.MSG_PEEK)
1724 self.assertEqual(msg, MSG[:-3])
1725 self.checkRecvmsgAddress(addr, self.cli_addr)
1726 self.assertEqual(ancdata, [])
1727 # Ignoring MSG_TRUNC here (so this test is the same for stream
1728 # and datagram sockets). Some wording in POSIX seems to
1729 # suggest that it needn't be set when peeking, but that may
1730 # just be a slip.
1731 self.checkFlags(flags, eor=False,
1732 ignore=getattr(socket, "MSG_TRUNC", 0))
1733
1734 # Receive all data with MSG_PEEK.
1735 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1736 len(MSG), 0,
1737 socket.MSG_PEEK)
1738 self.assertEqual(msg, MSG)
1739 self.checkRecvmsgAddress(addr, self.cli_addr)
1740 self.assertEqual(ancdata, [])
1741 self.checkFlags(flags, eor=True)
1742
1743 # Check that the same data can still be received normally.
1744 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1745 self.assertEqual(msg, MSG)
1746 self.checkRecvmsgAddress(addr, self.cli_addr)
1747 self.assertEqual(ancdata, [])
1748 self.checkFlags(flags, eor=True)
1749
1750 @testRecvmsgPeek.client_skip
1751 def _testRecvmsgPeek(self):
1752 self.sendToServer(MSG)
1753
1754 @requireAttrs(socket.socket, "sendmsg")
1755 def testRecvmsgFromSendmsg(self):
1756 # Test receiving with recvmsg[_into]() when message is sent
1757 # using sendmsg().
1758 self.serv_sock.settimeout(self.fail_timeout)
1759 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1760 self.assertEqual(msg, MSG)
1761 self.checkRecvmsgAddress(addr, self.cli_addr)
1762 self.assertEqual(ancdata, [])
1763 self.checkFlags(flags, eor=True)
1764
1765 @testRecvmsgFromSendmsg.client_skip
1766 def _testRecvmsgFromSendmsg(self):
1767 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1768
1769
1770class RecvmsgGenericStreamTests(RecvmsgGenericTests):
1771 # Tests which require a stream socket and can use either recvmsg()
1772 # or recvmsg_into().
1773
1774 def testRecvmsgEOF(self):
1775 # Receive end-of-stream indicator (b"", peer socket closed).
1776 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1777 self.assertEqual(msg, b"")
1778 self.checkRecvmsgAddress(addr, self.cli_addr)
1779 self.assertEqual(ancdata, [])
1780 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
1781
1782 def _testRecvmsgEOF(self):
1783 self.cli_sock.close()
1784
1785 def testRecvmsgOverflow(self):
1786 # Receive a message in more than one chunk.
1787 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1788 len(MSG) - 3)
1789 self.checkRecvmsgAddress(addr, self.cli_addr)
1790 self.assertEqual(ancdata, [])
1791 self.checkFlags(flags, eor=False)
1792
1793 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1794 self.checkRecvmsgAddress(addr, self.cli_addr)
1795 self.assertEqual(ancdata, [])
1796 self.checkFlags(flags, eor=True)
1797
1798 msg = seg1 + seg2
1799 self.assertEqual(msg, MSG)
1800
1801 def _testRecvmsgOverflow(self):
1802 self.sendToServer(MSG)
1803
1804
1805class RecvmsgTests(RecvmsgGenericTests):
1806 # Tests for recvmsg() which can use any socket type.
1807
1808 def testRecvmsgBadArgs(self):
1809 # Check that recvmsg() rejects invalid arguments.
1810 self.assertRaises(TypeError, self.serv_sock.recvmsg)
1811 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1812 -1, 0, 0)
1813 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1814 len(MSG), -1, 0)
1815 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1816 [bytearray(10)], 0, 0)
1817 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1818 object(), 0, 0)
1819 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1820 len(MSG), object(), 0)
1821 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1822 len(MSG), 0, object())
1823
1824 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
1825 self.assertEqual(msg, MSG)
1826 self.checkRecvmsgAddress(addr, self.cli_addr)
1827 self.assertEqual(ancdata, [])
1828 self.checkFlags(flags, eor=True)
1829
1830 def _testRecvmsgBadArgs(self):
1831 self.sendToServer(MSG)
1832
1833
1834class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
1835 # Tests for recvmsg_into() which can use any socket type.
1836
1837 def testRecvmsgIntoBadArgs(self):
1838 # Check that recvmsg_into() rejects invalid arguments.
1839 buf = bytearray(len(MSG))
1840 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
1841 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1842 len(MSG), 0, 0)
1843 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1844 buf, 0, 0)
1845 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1846 [object()], 0, 0)
1847 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1848 [b"I'm not writable"], 0, 0)
1849 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1850 [buf, object()], 0, 0)
1851 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
1852 [buf], -1, 0)
1853 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1854 [buf], object(), 0)
1855 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
1856 [buf], 0, object())
1857
1858 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
1859 self.assertEqual(nbytes, len(MSG))
1860 self.assertEqual(buf, bytearray(MSG))
1861 self.checkRecvmsgAddress(addr, self.cli_addr)
1862 self.assertEqual(ancdata, [])
1863 self.checkFlags(flags, eor=True)
1864
1865 def _testRecvmsgIntoBadArgs(self):
1866 self.sendToServer(MSG)
1867
1868 def testRecvmsgIntoGenerator(self):
1869 # Receive into buffer obtained from a generator (not a sequence).
1870 buf = bytearray(len(MSG))
1871 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
1872 (o for o in [buf]))
1873 self.assertEqual(nbytes, len(MSG))
1874 self.assertEqual(buf, bytearray(MSG))
1875 self.checkRecvmsgAddress(addr, self.cli_addr)
1876 self.assertEqual(ancdata, [])
1877 self.checkFlags(flags, eor=True)
1878
1879 def _testRecvmsgIntoGenerator(self):
1880 self.sendToServer(MSG)
1881
1882 def testRecvmsgIntoArray(self):
1883 # Receive into an array rather than the usual bytearray.
1884 buf = array.array("B", [0] * len(MSG))
1885 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
1886 self.assertEqual(nbytes, len(MSG))
1887 self.assertEqual(buf.tostring(), MSG)
1888 self.checkRecvmsgAddress(addr, self.cli_addr)
1889 self.assertEqual(ancdata, [])
1890 self.checkFlags(flags, eor=True)
1891
1892 def _testRecvmsgIntoArray(self):
1893 self.sendToServer(MSG)
1894
1895 def testRecvmsgIntoScatter(self):
1896 # Receive into multiple buffers (scatter write).
1897 b1 = bytearray(b"----")
1898 b2 = bytearray(b"0123456789")
1899 b3 = bytearray(b"--------------")
1900 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
1901 [b1, memoryview(b2)[2:9], b3])
1902 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
1903 self.assertEqual(b1, bytearray(b"Mary"))
1904 self.assertEqual(b2, bytearray(b"01 had a 9"))
1905 self.assertEqual(b3, bytearray(b"little lamb---"))
1906 self.checkRecvmsgAddress(addr, self.cli_addr)
1907 self.assertEqual(ancdata, [])
1908 self.checkFlags(flags, eor=True)
1909
1910 def _testRecvmsgIntoScatter(self):
1911 self.sendToServer(b"Mary had a little lamb")
1912
1913
1914class CmsgMacroTests(unittest.TestCase):
1915 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
1916 # assumptions used by sendmsg() and recvmsg[_into](), which share
1917 # code with these functions.
1918
1919 # Match the definition in socketmodule.c
1920 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
1921
1922 @requireAttrs(socket, "CMSG_LEN")
1923 def testCMSG_LEN(self):
1924 # Test CMSG_LEN() with various valid and invalid values,
1925 # checking the assumptions used by recvmsg() and sendmsg().
1926 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
1927 values = list(range(257)) + list(range(toobig - 257, toobig))
1928
1929 # struct cmsghdr has at least three members, two of which are ints
1930 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
1931 for n in values:
1932 ret = socket.CMSG_LEN(n)
1933 # This is how recvmsg() calculates the data size
1934 self.assertEqual(ret - socket.CMSG_LEN(0), n)
1935 self.assertLessEqual(ret, self.socklen_t_limit)
1936
1937 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
1938 # sendmsg() shares code with these functions, and requires
1939 # that it reject values over the limit.
1940 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
1941 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
1942
1943 @requireAttrs(socket, "CMSG_SPACE")
1944 def testCMSG_SPACE(self):
1945 # Test CMSG_SPACE() with various valid and invalid values,
1946 # checking the assumptions used by sendmsg().
1947 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
1948 values = list(range(257)) + list(range(toobig - 257, toobig))
1949
1950 last = socket.CMSG_SPACE(0)
1951 # struct cmsghdr has at least three members, two of which are ints
1952 self.assertGreater(last, array.array("i").itemsize * 2)
1953 for n in values:
1954 ret = socket.CMSG_SPACE(n)
1955 self.assertGreaterEqual(ret, last)
1956 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
1957 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
1958 self.assertLessEqual(ret, self.socklen_t_limit)
1959 last = ret
1960
1961 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
1962 # sendmsg() shares code with these functions, and requires
1963 # that it reject values over the limit.
1964 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
1965 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
1966
1967
1968class SCMRightsTest(SendrecvmsgServerTimeoutBase):
1969 # Tests for file descriptor passing on Unix-domain sockets.
1970
1971 # Invalid file descriptor value that's unlikely to evaluate to a
1972 # real FD even if one of its bytes is replaced with a different
1973 # value (which shouldn't actually happen).
1974 badfd = -0x5555
1975
1976 def newFDs(self, n):
1977 # Return a list of n file descriptors for newly-created files
1978 # containing their list indices as ASCII numbers.
1979 fds = []
1980 for i in range(n):
1981 fd, path = tempfile.mkstemp()
1982 self.addCleanup(os.unlink, path)
1983 self.addCleanup(os.close, fd)
1984 os.write(fd, str(i).encode())
1985 fds.append(fd)
1986 return fds
1987
1988 def checkFDs(self, fds):
1989 # Check that the file descriptors in the given list contain
1990 # their correct list indices as ASCII numbers.
1991 for n, fd in enumerate(fds):
1992 os.lseek(fd, 0, os.SEEK_SET)
1993 self.assertEqual(os.read(fd, 1024), str(n).encode())
1994
1995 def registerRecvmsgResult(self, result):
1996 self.addCleanup(self.closeRecvmsgFDs, result)
1997
1998 def closeRecvmsgFDs(self, recvmsg_result):
1999 # Close all file descriptors specified in the ancillary data
2000 # of the given return value from recvmsg() or recvmsg_into().
2001 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2002 if (cmsg_level == socket.SOL_SOCKET and
2003 cmsg_type == socket.SCM_RIGHTS):
2004 fds = array.array("i")
2005 fds.fromstring(cmsg_data[:
2006 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2007 for fd in fds:
2008 os.close(fd)
2009
2010 def createAndSendFDs(self, n):
2011 # Send n new file descriptors created by newFDs() to the
2012 # server, with the constant MSG as the non-ancillary data.
2013 self.assertEqual(
2014 self.sendmsgToServer([MSG],
2015 [(socket.SOL_SOCKET,
2016 socket.SCM_RIGHTS,
2017 array.array("i", self.newFDs(n)))]),
2018 len(MSG))
2019
2020 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2021 # Check that constant MSG was received with numfds file
2022 # descriptors in a maximum of maxcmsgs control messages (which
2023 # must contain only complete integers). By default, check
2024 # that MSG_CTRUNC is unset, but ignore any flags in
2025 # ignoreflags.
2026 msg, ancdata, flags, addr = result
2027 self.assertEqual(msg, MSG)
2028 self.checkRecvmsgAddress(addr, self.cli_addr)
2029 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2030 ignore=ignoreflags)
2031
2032 self.assertIsInstance(ancdata, list)
2033 self.assertLessEqual(len(ancdata), maxcmsgs)
2034 fds = array.array("i")
2035 for item in ancdata:
2036 self.assertIsInstance(item, tuple)
2037 cmsg_level, cmsg_type, cmsg_data = item
2038 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2039 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2040 self.assertIsInstance(cmsg_data, bytes)
2041 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
2042 fds.fromstring(cmsg_data)
2043
2044 self.assertEqual(len(fds), numfds)
2045 self.checkFDs(fds)
2046
2047 def testFDPassSimple(self):
2048 # Pass a single FD (array read from bytes object).
2049 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2050 len(MSG), 10240))
2051
2052 def _testFDPassSimple(self):
2053 self.assertEqual(
2054 self.sendmsgToServer(
2055 [MSG],
2056 [(socket.SOL_SOCKET,
2057 socket.SCM_RIGHTS,
2058 array.array("i", self.newFDs(1)).tostring())]),
2059 len(MSG))
2060
2061 def testMultipleFDPass(self):
2062 # Pass multiple FDs in a single array.
2063 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2064 len(MSG), 10240))
2065
2066 def _testMultipleFDPass(self):
2067 self.createAndSendFDs(4)
2068
2069 @requireAttrs(socket, "CMSG_SPACE")
2070 def testFDPassCMSG_SPACE(self):
2071 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2072 self.checkRecvmsgFDs(
2073 4, self.doRecvmsg(self.serv_sock, len(MSG),
2074 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2075
2076 @testFDPassCMSG_SPACE.client_skip
2077 def _testFDPassCMSG_SPACE(self):
2078 self.createAndSendFDs(4)
2079
2080 def testFDPassCMSG_LEN(self):
2081 # Test using CMSG_LEN() to calculate ancillary buffer size.
2082 self.checkRecvmsgFDs(1,
2083 self.doRecvmsg(self.serv_sock, len(MSG),
2084 socket.CMSG_LEN(4 * SIZEOF_INT)),
2085 # RFC 3542 says implementations may set
2086 # MSG_CTRUNC if there isn't enough space
2087 # for trailing padding.
2088 ignoreflags=socket.MSG_CTRUNC)
2089
2090 def _testFDPassCMSG_LEN(self):
2091 self.createAndSendFDs(1)
2092
2093 @requireAttrs(socket, "CMSG_SPACE")
2094 def testFDPassSeparate(self):
2095 # Pass two FDs in two separate arrays. Arrays may be combined
2096 # into a single control message by the OS.
2097 self.checkRecvmsgFDs(2,
2098 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2099 maxcmsgs=2)
2100
2101 @testFDPassSeparate.client_skip
2102 def _testFDPassSeparate(self):
2103 fd0, fd1 = self.newFDs(2)
2104 self.assertEqual(
2105 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2106 socket.SCM_RIGHTS,
2107 array.array("i", [fd0])),
2108 (socket.SOL_SOCKET,
2109 socket.SCM_RIGHTS,
2110 array.array("i", [fd1]))]),
2111 len(MSG))
2112
2113 @requireAttrs(socket, "CMSG_SPACE")
2114 def testFDPassSeparateMinSpace(self):
2115 # Pass two FDs in two separate arrays, receiving them into the
2116 # minimum space for two arrays.
2117 self.checkRecvmsgFDs(2,
2118 self.doRecvmsg(self.serv_sock, len(MSG),
2119 socket.CMSG_SPACE(SIZEOF_INT) +
2120 socket.CMSG_LEN(SIZEOF_INT)),
2121 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2122
2123 @testFDPassSeparateMinSpace.client_skip
2124 def _testFDPassSeparateMinSpace(self):
2125 fd0, fd1 = self.newFDs(2)
2126 self.assertEqual(
2127 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2128 socket.SCM_RIGHTS,
2129 array.array("i", [fd0])),
2130 (socket.SOL_SOCKET,
2131 socket.SCM_RIGHTS,
2132 array.array("i", [fd1]))]),
2133 len(MSG))
2134
2135 def sendAncillaryIfPossible(self, msg, ancdata):
2136 # Try to send msg and ancdata to server, but if the system
2137 # call fails, just send msg with no ancillary data.
2138 try:
2139 nbytes = self.sendmsgToServer([msg], ancdata)
2140 except socket.error as e:
2141 # Check that it was the system call that failed
2142 self.assertIsInstance(e.errno, int)
2143 nbytes = self.sendmsgToServer([msg])
2144 self.assertEqual(nbytes, len(msg))
2145
2146 def testFDPassEmpty(self):
2147 # Try to pass an empty FD array. Can receive either no array
2148 # or an empty array.
2149 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2150 len(MSG), 10240),
2151 ignoreflags=socket.MSG_CTRUNC)
2152
2153 def _testFDPassEmpty(self):
2154 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2155 socket.SCM_RIGHTS,
2156 b"")])
2157
2158 def testFDPassPartialInt(self):
2159 # Try to pass a truncated FD array.
2160 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2161 len(MSG), 10240)
2162 self.assertEqual(msg, MSG)
2163 self.checkRecvmsgAddress(addr, self.cli_addr)
2164 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2165 self.assertLessEqual(len(ancdata), 1)
2166 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2167 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2168 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2169 self.assertLess(len(cmsg_data), SIZEOF_INT)
2170
2171 def _testFDPassPartialInt(self):
2172 self.sendAncillaryIfPossible(
2173 MSG,
2174 [(socket.SOL_SOCKET,
2175 socket.SCM_RIGHTS,
2176 array.array("i", [self.badfd]).tostring()[:-1])])
2177
2178 @requireAttrs(socket, "CMSG_SPACE")
2179 def testFDPassPartialIntInMiddle(self):
2180 # Try to pass two FD arrays, the first of which is truncated.
2181 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2182 len(MSG), 10240)
2183 self.assertEqual(msg, MSG)
2184 self.checkRecvmsgAddress(addr, self.cli_addr)
2185 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2186 self.assertLessEqual(len(ancdata), 2)
2187 fds = array.array("i")
2188 # Arrays may have been combined in a single control message
2189 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2190 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2191 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2192 fds.fromstring(cmsg_data[:
2193 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2194 self.assertLessEqual(len(fds), 2)
2195 self.checkFDs(fds)
2196
2197 @testFDPassPartialIntInMiddle.client_skip
2198 def _testFDPassPartialIntInMiddle(self):
2199 fd0, fd1 = self.newFDs(2)
2200 self.sendAncillaryIfPossible(
2201 MSG,
2202 [(socket.SOL_SOCKET,
2203 socket.SCM_RIGHTS,
2204 array.array("i", [fd0, self.badfd]).tostring()[:-1]),
2205 (socket.SOL_SOCKET,
2206 socket.SCM_RIGHTS,
2207 array.array("i", [fd1]))])
2208
2209 def checkTruncatedHeader(self, result, ignoreflags=0):
2210 # Check that no ancillary data items are returned when data is
2211 # truncated inside the cmsghdr structure.
2212 msg, ancdata, flags, addr = result
2213 self.assertEqual(msg, MSG)
2214 self.checkRecvmsgAddress(addr, self.cli_addr)
2215 self.assertEqual(ancdata, [])
2216 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2217 ignore=ignoreflags)
2218
2219 def testCmsgTruncNoBufSize(self):
2220 # Check that no ancillary data is received when no buffer size
2221 # is specified.
2222 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2223 # BSD seems to set MSG_CTRUNC only
2224 # if an item has been partially
2225 # received.
2226 ignoreflags=socket.MSG_CTRUNC)
2227
2228 def _testCmsgTruncNoBufSize(self):
2229 self.createAndSendFDs(1)
2230
2231 def testCmsgTrunc0(self):
2232 # Check that no ancillary data is received when buffer size is 0.
2233 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2234 ignoreflags=socket.MSG_CTRUNC)
2235
2236 def _testCmsgTrunc0(self):
2237 self.createAndSendFDs(1)
2238
2239 # Check that no ancillary data is returned for various non-zero
2240 # (but still too small) buffer sizes.
2241
2242 def testCmsgTrunc1(self):
2243 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2244
2245 def _testCmsgTrunc1(self):
2246 self.createAndSendFDs(1)
2247
2248 def testCmsgTrunc2Int(self):
2249 # The cmsghdr structure has at least three members, two of
2250 # which are ints, so we still shouldn't see any ancillary
2251 # data.
2252 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2253 SIZEOF_INT * 2))
2254
2255 def _testCmsgTrunc2Int(self):
2256 self.createAndSendFDs(1)
2257
2258 def testCmsgTruncLen0Minus1(self):
2259 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2260 socket.CMSG_LEN(0) - 1))
2261
2262 def _testCmsgTruncLen0Minus1(self):
2263 self.createAndSendFDs(1)
2264
2265 # The following tests try to truncate the control message in the
2266 # middle of the FD array.
2267
2268 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2269 # Check that file descriptor data is truncated to between
2270 # mindata and maxdata bytes when received with buffer size
2271 # ancbuf, and that any complete file descriptor numbers are
2272 # valid.
2273 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2274 len(MSG), ancbuf)
2275 self.assertEqual(msg, MSG)
2276 self.checkRecvmsgAddress(addr, self.cli_addr)
2277 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2278
2279 if mindata == 0 and ancdata == []:
2280 return
2281 self.assertEqual(len(ancdata), 1)
2282 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2283 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2284 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2285 self.assertGreaterEqual(len(cmsg_data), mindata)
2286 self.assertLessEqual(len(cmsg_data), maxdata)
2287 fds = array.array("i")
2288 fds.fromstring(cmsg_data[:
2289 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2290 self.checkFDs(fds)
2291
2292 def testCmsgTruncLen0(self):
2293 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2294
2295 def _testCmsgTruncLen0(self):
2296 self.createAndSendFDs(1)
2297
2298 def testCmsgTruncLen0Plus1(self):
2299 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2300
2301 def _testCmsgTruncLen0Plus1(self):
2302 self.createAndSendFDs(2)
2303
2304 def testCmsgTruncLen1(self):
2305 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2306 maxdata=SIZEOF_INT)
2307
2308 def _testCmsgTruncLen1(self):
2309 self.createAndSendFDs(2)
2310
2311 def testCmsgTruncLen2Minus1(self):
2312 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2313 maxdata=(2 * SIZEOF_INT) - 1)
2314
2315 def _testCmsgTruncLen2Minus1(self):
2316 self.createAndSendFDs(2)
2317
2318
2319class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2320 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2321 # features of the RFC 3542 Advanced Sockets API for IPv6.
2322 # Currently we can only handle certain data items (e.g. traffic
2323 # class, hop limit, MTU discovery and fragmentation settings)
2324 # without resorting to unportable means such as the struct module,
2325 # but the tests here are aimed at testing the ancillary data
2326 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2327 # itself.
2328
2329 # Test value to use when setting hop limit of packet
2330 hop_limit = 2
2331
2332 # Test value to use when setting traffic class of packet.
2333 # -1 means "use kernel default".
2334 traffic_class = -1
2335
2336 def ancillaryMapping(self, ancdata):
2337 # Given ancillary data list ancdata, return a mapping from
2338 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2339 # Check that no (level, type) pair appears more than once.
2340 d = {}
2341 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2342 self.assertNotIn((cmsg_level, cmsg_type), d)
2343 d[(cmsg_level, cmsg_type)] = cmsg_data
2344 return d
2345
2346 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2347 # Receive hop limit into ancbufsize bytes of ancillary data
2348 # space. Check that data is MSG, ancillary data is not
2349 # truncated (but ignore any flags in ignoreflags), and hop
2350 # limit is between 0 and maxhop inclusive.
2351 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2352 socket.IPV6_RECVHOPLIMIT, 1)
2353 self.misc_event.set()
2354 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2355 len(MSG), ancbufsize)
2356
2357 self.assertEqual(msg, MSG)
2358 self.checkRecvmsgAddress(addr, self.cli_addr)
2359 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2360 ignore=ignoreflags)
2361
2362 self.assertEqual(len(ancdata), 1)
2363 self.assertIsInstance(ancdata[0], tuple)
2364 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2365 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2366 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2367 self.assertIsInstance(cmsg_data, bytes)
2368 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2369 a = array.array("i")
2370 a.fromstring(cmsg_data)
2371 self.assertGreaterEqual(a[0], 0)
2372 self.assertLessEqual(a[0], maxhop)
2373
2374 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2375 def testRecvHopLimit(self):
2376 # Test receiving the packet hop limit as ancillary data.
2377 self.checkHopLimit(ancbufsize=10240)
2378
2379 @testRecvHopLimit.client_skip
2380 def _testRecvHopLimit(self):
2381 # Need to wait until server has asked to receive ancillary
2382 # data, as implementations are not required to buffer it
2383 # otherwise.
2384 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2385 self.sendToServer(MSG)
2386
2387 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2388 def testRecvHopLimitCMSG_SPACE(self):
2389 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2390 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2391
2392 @testRecvHopLimitCMSG_SPACE.client_skip
2393 def _testRecvHopLimitCMSG_SPACE(self):
2394 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2395 self.sendToServer(MSG)
2396
2397 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2398 # 3542 says portable applications must provide space for trailing
2399 # padding. Implementations may set MSG_CTRUNC if there isn't
2400 # enough space for the padding.
2401
2402 @requireAttrs(socket.socket, "sendmsg")
2403 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2404 def testSetHopLimit(self):
2405 # Test setting hop limit on outgoing packet and receiving it
2406 # at the other end.
2407 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2408
2409 @testSetHopLimit.client_skip
2410 def _testSetHopLimit(self):
2411 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2412 self.assertEqual(
2413 self.sendmsgToServer([MSG],
2414 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2415 array.array("i", [self.hop_limit]))]),
2416 len(MSG))
2417
2418 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2419 ignoreflags=0):
2420 # Receive traffic class and hop limit into ancbufsize bytes of
2421 # ancillary data space. Check that data is MSG, ancillary
2422 # data is not truncated (but ignore any flags in ignoreflags),
2423 # and traffic class and hop limit are in range (hop limit no
2424 # more than maxhop).
2425 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2426 socket.IPV6_RECVHOPLIMIT, 1)
2427 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2428 socket.IPV6_RECVTCLASS, 1)
2429 self.misc_event.set()
2430 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2431 len(MSG), ancbufsize)
2432
2433 self.assertEqual(msg, MSG)
2434 self.checkRecvmsgAddress(addr, self.cli_addr)
2435 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2436 ignore=ignoreflags)
2437 self.assertEqual(len(ancdata), 2)
2438 ancmap = self.ancillaryMapping(ancdata)
2439
2440 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2441 self.assertEqual(len(tcdata), SIZEOF_INT)
2442 a = array.array("i")
2443 a.fromstring(tcdata)
2444 self.assertGreaterEqual(a[0], 0)
2445 self.assertLessEqual(a[0], 255)
2446
2447 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2448 self.assertEqual(len(hldata), SIZEOF_INT)
2449 a = array.array("i")
2450 a.fromstring(hldata)
2451 self.assertGreaterEqual(a[0], 0)
2452 self.assertLessEqual(a[0], maxhop)
2453
2454 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2455 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2456 def testRecvTrafficClassAndHopLimit(self):
2457 # Test receiving traffic class and hop limit as ancillary data.
2458 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2459
2460 @testRecvTrafficClassAndHopLimit.client_skip
2461 def _testRecvTrafficClassAndHopLimit(self):
2462 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2463 self.sendToServer(MSG)
2464
2465 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2466 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2467 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2468 # Test receiving traffic class and hop limit, using
2469 # CMSG_SPACE() to calculate buffer size.
2470 self.checkTrafficClassAndHopLimit(
2471 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2472
2473 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2474 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2475 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2476 self.sendToServer(MSG)
2477
2478 @requireAttrs(socket.socket, "sendmsg")
2479 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2480 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2481 def testSetTrafficClassAndHopLimit(self):
2482 # Test setting traffic class and hop limit on outgoing packet,
2483 # and receiving them at the other end.
2484 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2485 maxhop=self.hop_limit)
2486
2487 @testSetTrafficClassAndHopLimit.client_skip
2488 def _testSetTrafficClassAndHopLimit(self):
2489 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2490 self.assertEqual(
2491 self.sendmsgToServer([MSG],
2492 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2493 array.array("i", [self.traffic_class])),
2494 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2495 array.array("i", [self.hop_limit]))]),
2496 len(MSG))
2497
2498 @requireAttrs(socket.socket, "sendmsg")
2499 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2500 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2501 def testOddCmsgSize(self):
2502 # Try to send ancillary data with first item one byte too
2503 # long. Fall back to sending with correct size if this fails,
2504 # and check that second item was handled correctly.
2505 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2506 maxhop=self.hop_limit)
2507
2508 @testOddCmsgSize.client_skip
2509 def _testOddCmsgSize(self):
2510 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2511 try:
2512 nbytes = self.sendmsgToServer(
2513 [MSG],
2514 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2515 array.array("i", [self.traffic_class]).tostring() + b"\x00"),
2516 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2517 array.array("i", [self.hop_limit]))])
2518 except socket.error as e:
2519 self.assertIsInstance(e.errno, int)
2520 nbytes = self.sendmsgToServer(
2521 [MSG],
2522 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2523 array.array("i", [self.traffic_class])),
2524 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2525 array.array("i", [self.hop_limit]))])
2526 self.assertEqual(nbytes, len(MSG))
2527
2528 # Tests for proper handling of truncated ancillary data
2529
2530 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2531 # Receive hop limit into ancbufsize bytes of ancillary data
2532 # space, which should be too small to contain the ancillary
2533 # data header (if ancbufsize is None, pass no second argument
2534 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2535 # (unless included in ignoreflags), and no ancillary data is
2536 # returned.
2537 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2538 socket.IPV6_RECVHOPLIMIT, 1)
2539 self.misc_event.set()
2540 args = () if ancbufsize is None else (ancbufsize,)
2541 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2542 len(MSG), *args)
2543
2544 self.assertEqual(msg, MSG)
2545 self.checkRecvmsgAddress(addr, self.cli_addr)
2546 self.assertEqual(ancdata, [])
2547 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2548 ignore=ignoreflags)
2549
2550 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2551 def testCmsgTruncNoBufSize(self):
2552 # Check that no ancillary data is received when no ancillary
2553 # buffer size is provided.
2554 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2555 # BSD seems to set
2556 # MSG_CTRUNC only if an item
2557 # has been partially
2558 # received.
2559 ignoreflags=socket.MSG_CTRUNC)
2560
2561 @testCmsgTruncNoBufSize.client_skip
2562 def _testCmsgTruncNoBufSize(self):
2563 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2564 self.sendToServer(MSG)
2565
2566 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2567 def testSingleCmsgTrunc0(self):
2568 # Check that no ancillary data is received when ancillary
2569 # buffer size is zero.
2570 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2571 ignoreflags=socket.MSG_CTRUNC)
2572
2573 @testSingleCmsgTrunc0.client_skip
2574 def _testSingleCmsgTrunc0(self):
2575 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2576 self.sendToServer(MSG)
2577
2578 # Check that no ancillary data is returned for various non-zero
2579 # (but still too small) buffer sizes.
2580
2581 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2582 def testSingleCmsgTrunc1(self):
2583 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2584
2585 @testSingleCmsgTrunc1.client_skip
2586 def _testSingleCmsgTrunc1(self):
2587 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2588 self.sendToServer(MSG)
2589
2590 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2591 def testSingleCmsgTrunc2Int(self):
2592 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
2593
2594 @testSingleCmsgTrunc2Int.client_skip
2595 def _testSingleCmsgTrunc2Int(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 testSingleCmsgTruncLen0Minus1(self):
2601 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
2602
2603 @testSingleCmsgTruncLen0Minus1.client_skip
2604 def _testSingleCmsgTruncLen0Minus1(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 testSingleCmsgTruncInData(self):
2610 # Test truncation of a control message inside its associated
2611 # data. The message may be returned with its data truncated,
2612 # or not returned at all.
2613 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2614 socket.IPV6_RECVHOPLIMIT, 1)
2615 self.misc_event.set()
2616 msg, ancdata, flags, addr = self.doRecvmsg(
2617 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
2618
2619 self.assertEqual(msg, MSG)
2620 self.checkRecvmsgAddress(addr, self.cli_addr)
2621 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2622
2623 self.assertLessEqual(len(ancdata), 1)
2624 if ancdata:
2625 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2626 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2627 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2628 self.assertLess(len(cmsg_data), SIZEOF_INT)
2629
2630 @testSingleCmsgTruncInData.client_skip
2631 def _testSingleCmsgTruncInData(self):
2632 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2633 self.sendToServer(MSG)
2634
2635 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
2636 # Receive traffic class and hop limit into ancbufsize bytes of
2637 # ancillary data space, which should be large enough to
2638 # contain the first item, but too small to contain the header
2639 # of the second. Check that data is MSG, MSG_CTRUNC is set
2640 # (unless included in ignoreflags), and only one ancillary
2641 # data item is returned.
2642 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2643 socket.IPV6_RECVHOPLIMIT, 1)
2644 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2645 socket.IPV6_RECVTCLASS, 1)
2646 self.misc_event.set()
2647 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2648 len(MSG), ancbufsize)
2649
2650 self.assertEqual(msg, MSG)
2651 self.checkRecvmsgAddress(addr, self.cli_addr)
2652 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2653 ignore=ignoreflags)
2654
2655 self.assertEqual(len(ancdata), 1)
2656 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2657 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2658 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
2659 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2660 a = array.array("i")
2661 a.fromstring(cmsg_data)
2662 self.assertGreaterEqual(a[0], 0)
2663 self.assertLessEqual(a[0], 255)
2664
2665 # Try the above test with various buffer sizes.
2666
2667 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2668 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2669 def testSecondCmsgTrunc0(self):
2670 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
2671 ignoreflags=socket.MSG_CTRUNC)
2672
2673 @testSecondCmsgTrunc0.client_skip
2674 def _testSecondCmsgTrunc0(self):
2675 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2676 self.sendToServer(MSG)
2677
2678 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2679 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2680 def testSecondCmsgTrunc1(self):
2681 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
2682
2683 @testSecondCmsgTrunc1.client_skip
2684 def _testSecondCmsgTrunc1(self):
2685 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2686 self.sendToServer(MSG)
2687
2688 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2689 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2690 def testSecondCmsgTrunc2Int(self):
2691 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2692 2 * SIZEOF_INT)
2693
2694 @testSecondCmsgTrunc2Int.client_skip
2695 def _testSecondCmsgTrunc2Int(self):
2696 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2697 self.sendToServer(MSG)
2698
2699 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2700 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2701 def testSecondCmsgTruncLen0Minus1(self):
2702 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2703 socket.CMSG_LEN(0) - 1)
2704
2705 @testSecondCmsgTruncLen0Minus1.client_skip
2706 def _testSecondCmsgTruncLen0Minus1(self):
2707 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2708 self.sendToServer(MSG)
2709
2710 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2711 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2712 def testSecomdCmsgTruncInData(self):
2713 # Test truncation of the second of two control messages inside
2714 # its associated data.
2715 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2716 socket.IPV6_RECVHOPLIMIT, 1)
2717 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2718 socket.IPV6_RECVTCLASS, 1)
2719 self.misc_event.set()
2720 msg, ancdata, flags, addr = self.doRecvmsg(
2721 self.serv_sock, len(MSG),
2722 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
2723
2724 self.assertEqual(msg, MSG)
2725 self.checkRecvmsgAddress(addr, self.cli_addr)
2726 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2727
2728 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
2729
2730 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2731 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2732 cmsg_types.remove(cmsg_type)
2733 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2734 a = array.array("i")
2735 a.fromstring(cmsg_data)
2736 self.assertGreaterEqual(a[0], 0)
2737 self.assertLessEqual(a[0], 255)
2738
2739 if ancdata:
2740 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2741 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2742 cmsg_types.remove(cmsg_type)
2743 self.assertLess(len(cmsg_data), SIZEOF_INT)
2744
2745 self.assertEqual(ancdata, [])
2746
2747 @testSecomdCmsgTruncInData.client_skip
2748 def _testSecomdCmsgTruncInData(self):
2749 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2750 self.sendToServer(MSG)
2751
2752
2753# Derive concrete test classes for different socket types.
2754
2755class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
2756 SendrecvmsgConnectionlessBase,
2757 ThreadedSocketTestMixin, UDPTestBase):
2758 pass
2759
2760@requireAttrs(socket.socket, "sendmsg")
2761@unittest.skipUnless(thread, 'Threading required for this test.')
2762class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
2763 pass
2764
2765@requireAttrs(socket.socket, "recvmsg")
2766@unittest.skipUnless(thread, 'Threading required for this test.')
2767class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
2768 pass
2769
2770@requireAttrs(socket.socket, "recvmsg_into")
2771@unittest.skipUnless(thread, 'Threading required for this test.')
2772class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
2773 pass
2774
2775
2776class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
2777 SendrecvmsgConnectionlessBase,
2778 ThreadedSocketTestMixin, UDP6TestBase):
2779 pass
2780
2781@requireAttrs(socket.socket, "sendmsg")
2782@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2783@requireSocket("AF_INET6", "SOCK_DGRAM")
2784@unittest.skipUnless(thread, 'Threading required for this test.')
2785class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
2786 pass
2787
2788@requireAttrs(socket.socket, "recvmsg")
2789@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2790@requireSocket("AF_INET6", "SOCK_DGRAM")
2791@unittest.skipUnless(thread, 'Threading required for this test.')
2792class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
2793 pass
2794
2795@requireAttrs(socket.socket, "recvmsg_into")
2796@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2797@requireSocket("AF_INET6", "SOCK_DGRAM")
2798@unittest.skipUnless(thread, 'Threading required for this test.')
2799class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
2800 pass
2801
2802@requireAttrs(socket.socket, "recvmsg")
2803@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2804@requireAttrs(socket, "IPPROTO_IPV6")
2805@requireSocket("AF_INET6", "SOCK_DGRAM")
2806@unittest.skipUnless(thread, 'Threading required for this test.')
2807class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
2808 SendrecvmsgUDP6TestBase):
2809 pass
2810
2811@requireAttrs(socket.socket, "recvmsg_into")
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 RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
2817 RFC3542AncillaryTest,
2818 SendrecvmsgUDP6TestBase):
2819 pass
2820
2821
2822class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
2823 ConnectedStreamTestMixin, TCPTestBase):
2824 pass
2825
2826@requireAttrs(socket.socket, "sendmsg")
2827@unittest.skipUnless(thread, 'Threading required for this test.')
2828class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
2829 pass
2830
2831@requireAttrs(socket.socket, "recvmsg")
2832@unittest.skipUnless(thread, 'Threading required for this test.')
2833class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
2834 SendrecvmsgTCPTestBase):
2835 pass
2836
2837@requireAttrs(socket.socket, "recvmsg_into")
2838@unittest.skipUnless(thread, 'Threading required for this test.')
2839class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
2840 SendrecvmsgTCPTestBase):
2841 pass
2842
2843
2844class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
2845 SendrecvmsgConnectedBase,
2846 ConnectedStreamTestMixin, SCTPStreamBase):
2847 pass
2848
2849@requireAttrs(socket.socket, "sendmsg")
2850@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
2851@unittest.skipUnless(thread, 'Threading required for this test.')
2852class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
2853 pass
2854
2855@requireAttrs(socket.socket, "recvmsg")
2856@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
2857@unittest.skipUnless(thread, 'Threading required for this test.')
2858class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
2859 SendrecvmsgSCTPStreamTestBase):
2860 pass
2861
2862@requireAttrs(socket.socket, "recvmsg_into")
2863@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
2864@unittest.skipUnless(thread, 'Threading required for this test.')
2865class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
2866 SendrecvmsgSCTPStreamTestBase):
2867 pass
2868
2869
2870class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
2871 ConnectedStreamTestMixin, UnixStreamBase):
2872 pass
2873
2874@requireAttrs(socket.socket, "sendmsg")
2875@requireAttrs(socket, "AF_UNIX")
2876@unittest.skipUnless(thread, 'Threading required for this test.')
2877class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
2878 pass
2879
2880@requireAttrs(socket.socket, "recvmsg")
2881@requireAttrs(socket, "AF_UNIX")
2882@unittest.skipUnless(thread, 'Threading required for this test.')
2883class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
2884 SendrecvmsgUnixStreamTestBase):
2885 pass
2886
2887@requireAttrs(socket.socket, "recvmsg_into")
2888@requireAttrs(socket, "AF_UNIX")
2889@unittest.skipUnless(thread, 'Threading required for this test.')
2890class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
2891 SendrecvmsgUnixStreamTestBase):
2892 pass
2893
2894@requireAttrs(socket.socket, "sendmsg", "recvmsg")
2895@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
2896@unittest.skipUnless(thread, 'Threading required for this test.')
2897class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
2898 pass
2899
2900@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
2901@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
2902@unittest.skipUnless(thread, 'Threading required for this test.')
2903class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
2904 SendrecvmsgUnixStreamTestBase):
2905 pass
2906
2907
2908# Test interrupting the interruptible send/receive methods with a
2909# signal when a timeout is set. These tests avoid having multiple
2910# threads alive during the test so that the OS cannot deliver the
2911# signal to the wrong one.
2912
2913class InterruptedTimeoutBase(unittest.TestCase):
2914 # Base class for interrupted send/receive tests. Installs an
2915 # empty handler for SIGALRM and removes it on teardown, along with
2916 # any scheduled alarms.
2917
2918 def setUp(self):
2919 super().setUp()
2920 orig_alrm_handler = signal.signal(signal.SIGALRM,
2921 lambda signum, frame: None)
2922 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
2923 self.addCleanup(self.setAlarm, 0)
2924
2925 # Timeout for socket operations
2926 timeout = 4.0
2927
2928 # Provide setAlarm() method to schedule delivery of SIGALRM after
2929 # given number of seconds, or cancel it if zero, and an
2930 # appropriate time value to use. Use setitimer() if available.
2931 if hasattr(signal, "setitimer"):
2932 alarm_time = 0.05
2933
2934 def setAlarm(self, seconds):
2935 signal.setitimer(signal.ITIMER_REAL, seconds)
2936 else:
2937 # Old systems may deliver the alarm up to one second early
2938 alarm_time = 2
2939
2940 def setAlarm(self, seconds):
2941 signal.alarm(seconds)
2942
2943
2944# Require siginterrupt() in order to ensure that system calls are
2945# interrupted by default.
2946@requireAttrs(signal, "siginterrupt")
2947@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
2948 "Don't have signal.alarm or signal.setitimer")
2949class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
2950 # Test interrupting the recv*() methods with signals when a
2951 # timeout is set.
2952
2953 def setUp(self):
2954 super().setUp()
2955 self.serv.settimeout(self.timeout)
2956
2957 def checkInterruptedRecv(self, func, *args, **kwargs):
2958 # Check that func(*args, **kwargs) raises socket.error with an
2959 # errno of EINTR when interrupted by a signal.
2960 self.setAlarm(self.alarm_time)
2961 with self.assertRaises(socket.error) as cm:
2962 func(*args, **kwargs)
2963 self.assertNotIsInstance(cm.exception, socket.timeout)
2964 self.assertEqual(cm.exception.errno, errno.EINTR)
2965
2966 def testInterruptedRecvTimeout(self):
2967 self.checkInterruptedRecv(self.serv.recv, 1024)
2968
2969 def testInterruptedRecvIntoTimeout(self):
2970 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
2971
2972 def testInterruptedRecvfromTimeout(self):
2973 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
2974
2975 def testInterruptedRecvfromIntoTimeout(self):
2976 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
2977
2978 @requireAttrs(socket.socket, "recvmsg")
2979 def testInterruptedRecvmsgTimeout(self):
2980 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
2981
2982 @requireAttrs(socket.socket, "recvmsg_into")
2983 def testInterruptedRecvmsgIntoTimeout(self):
2984 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
2985
2986
2987# Require siginterrupt() in order to ensure that system calls are
2988# interrupted by default.
2989@requireAttrs(signal, "siginterrupt")
2990@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
2991 "Don't have signal.alarm or signal.setitimer")
2992@unittest.skipUnless(thread, 'Threading required for this test.')
2993class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
2994 ThreadSafeCleanupTestCase,
2995 SocketListeningTestMixin, TCPTestBase):
2996 # Test interrupting the interruptible send*() methods with signals
2997 # when a timeout is set.
2998
2999 def setUp(self):
3000 super().setUp()
3001 self.serv_conn = self.newSocket()
3002 self.addCleanup(self.serv_conn.close)
3003 # Use a thread to complete the connection, but wait for it to
3004 # terminate before running the test, so that there is only one
3005 # thread to accept the signal.
3006 cli_thread = threading.Thread(target=self.doConnect)
3007 cli_thread.start()
3008 self.cli_conn, addr = self.serv.accept()
3009 self.addCleanup(self.cli_conn.close)
3010 cli_thread.join()
3011 self.serv_conn.settimeout(self.timeout)
3012
3013 def doConnect(self):
3014 self.serv_conn.connect(self.serv_addr)
3015
3016 def checkInterruptedSend(self, func, *args, **kwargs):
3017 # Check that func(*args, **kwargs), run in a loop, raises
3018 # socket.error with an errno of EINTR when interrupted by a
3019 # signal.
3020 with self.assertRaises(socket.error) as cm:
3021 while True:
3022 self.setAlarm(self.alarm_time)
3023 func(*args, **kwargs)
3024 self.assertNotIsInstance(cm.exception, socket.timeout)
3025 self.assertEqual(cm.exception.errno, errno.EINTR)
3026
3027 def testInterruptedSendTimeout(self):
3028 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3029
3030 def testInterruptedSendtoTimeout(self):
3031 # Passing an actual address here as Python's wrapper for
3032 # sendto() doesn't allow passing a zero-length one; POSIX
3033 # requires that the address is ignored since the socket is
3034 # connection-mode, however.
3035 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3036 self.serv_addr)
3037
3038 @requireAttrs(socket.socket, "sendmsg")
3039 def testInterruptedSendmsgTimeout(self):
3040 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3041
3042
Victor Stinner45df8202010-04-28 22:31:17 +00003043@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003044class TCPCloserTest(ThreadedTCPSocketTest):
3045
3046 def testClose(self):
3047 conn, addr = self.serv.accept()
3048 conn.close()
3049
3050 sd = self.cli
3051 read, write, err = select.select([sd], [], [], 1.0)
3052 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003053 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003054
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003055 # Calling close() many times should be safe.
3056 conn.close()
3057 conn.close()
3058
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003059 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003060 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003061 time.sleep(1.0)
3062
Victor Stinner45df8202010-04-28 22:31:17 +00003063@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003064class BasicSocketPairTest(SocketPairTest):
3065
3066 def __init__(self, methodName='runTest'):
3067 SocketPairTest.__init__(self, methodName=methodName)
3068
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003069 def _check_defaults(self, sock):
3070 self.assertIsInstance(sock, socket.socket)
3071 if hasattr(socket, 'AF_UNIX'):
3072 self.assertEqual(sock.family, socket.AF_UNIX)
3073 else:
3074 self.assertEqual(sock.family, socket.AF_INET)
3075 self.assertEqual(sock.type, socket.SOCK_STREAM)
3076 self.assertEqual(sock.proto, 0)
3077
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003078 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003079 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003080
3081 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003082 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003083
Dave Cole331708b2004-08-09 04:51:41 +00003084 def testRecv(self):
3085 msg = self.serv.recv(1024)
3086 self.assertEqual(msg, MSG)
3087
3088 def _testRecv(self):
3089 self.cli.send(MSG)
3090
3091 def testSend(self):
3092 self.serv.send(MSG)
3093
3094 def _testSend(self):
3095 msg = self.cli.recv(1024)
3096 self.assertEqual(msg, MSG)
3097
Victor Stinner45df8202010-04-28 22:31:17 +00003098@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003099class NonBlockingTCPTests(ThreadedTCPSocketTest):
3100
3101 def __init__(self, methodName='runTest'):
3102 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3103
3104 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003105 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003106 self.serv.setblocking(0)
3107 start = time.time()
3108 try:
3109 self.serv.accept()
3110 except socket.error:
3111 pass
3112 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003113 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003114
3115 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003116 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003117
Antoine Pitroub1c54962010-10-14 15:05:38 +00003118 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003119 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003120 def testInitNonBlocking(self):
3121 # reinit server socket
3122 self.serv.close()
3123 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003124 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003125 self.port = support.bind_port(self.serv)
3126 self.serv.listen(1)
3127 # actual testing
3128 start = time.time()
3129 try:
3130 self.serv.accept()
3131 except socket.error:
3132 pass
3133 end = time.time()
3134 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3135
3136 def _testInitNonBlocking(self):
3137 pass
3138
Antoine Pitrou600232b2011-01-05 21:03:42 +00003139 def testInheritFlags(self):
3140 # Issue #7995: when calling accept() on a listening socket with a
3141 # timeout, the resulting socket should not be non-blocking.
3142 self.serv.settimeout(10)
3143 try:
3144 conn, addr = self.serv.accept()
3145 message = conn.recv(len(MSG))
3146 finally:
3147 conn.close()
3148 self.serv.settimeout(None)
3149
3150 def _testInheritFlags(self):
3151 time.sleep(0.1)
3152 self.cli.connect((HOST, self.port))
3153 time.sleep(0.5)
3154 self.cli.send(MSG)
3155
Guido van Rossum24e4af82002-06-12 19:18:08 +00003156 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003157 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003158 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003159 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003160 conn, addr = self.serv.accept()
3161 except socket.error:
3162 pass
3163 else:
3164 self.fail("Error trying to do non-blocking accept.")
3165 read, write, err = select.select([self.serv], [], [])
3166 if self.serv in read:
3167 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003168 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003169 else:
3170 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003171
Guido van Rossum24e4af82002-06-12 19:18:08 +00003172 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003173 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003174 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003175
3176 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003177 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003178 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003179 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003180
3181 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003182 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003183 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003184
3185 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003186 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003187 conn, addr = self.serv.accept()
3188 conn.setblocking(0)
3189 try:
3190 msg = conn.recv(len(MSG))
3191 except socket.error:
3192 pass
3193 else:
3194 self.fail("Error trying to do non-blocking recv.")
3195 read, write, err = select.select([conn], [], [])
3196 if conn in read:
3197 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003198 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003199 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003200 else:
3201 self.fail("Error during select call to non-blocking socket.")
3202
3203 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003204 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003205 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003206 self.cli.send(MSG)
3207
Victor Stinner45df8202010-04-28 22:31:17 +00003208@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003209class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003210 """Unit tests for the object returned by socket.makefile()
3211
Antoine Pitrou834bd812010-10-13 16:17:14 +00003212 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003213 the client connection. You can read from this file to
3214 get output from the server.
3215
Antoine Pitrou834bd812010-10-13 16:17:14 +00003216 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003217 server connection. You can write to this file to send output
3218 to the client.
3219 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003220
Guido van Rossume9f66142002-08-07 15:46:19 +00003221 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003222 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003223 errors = 'strict'
3224 newline = None
3225
3226 read_mode = 'rb'
3227 read_msg = MSG
3228 write_mode = 'wb'
3229 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003230
Guido van Rossum24e4af82002-06-12 19:18:08 +00003231 def __init__(self, methodName='runTest'):
3232 SocketConnectedTest.__init__(self, methodName=methodName)
3233
3234 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003235 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3236 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003237 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003238 self.read_file = self.cli_conn.makefile(
3239 self.read_mode, self.bufsize,
3240 encoding = self.encoding,
3241 errors = self.errors,
3242 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003243
3244 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003245 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003246 self.read_file.close()
3247 self.assertTrue(self.read_file.closed)
3248 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003249 SocketConnectedTest.tearDown(self)
3250
3251 def clientSetUp(self):
3252 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003253 self.write_file = self.serv_conn.makefile(
3254 self.write_mode, self.bufsize,
3255 encoding = self.encoding,
3256 errors = self.errors,
3257 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003258
3259 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003260 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003261 self.write_file.close()
3262 self.assertTrue(self.write_file.closed)
3263 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003264 SocketConnectedTest.clientTearDown(self)
3265
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003266 def testReadAfterTimeout(self):
3267 # Issue #7322: A file object must disallow further reads
3268 # after a timeout has occurred.
3269 self.cli_conn.settimeout(1)
3270 self.read_file.read(3)
3271 # First read raises a timeout
3272 self.assertRaises(socket.timeout, self.read_file.read, 1)
3273 # Second read is disallowed
3274 with self.assertRaises(IOError) as ctx:
3275 self.read_file.read(1)
3276 self.assertIn("cannot read from timed out object", str(ctx.exception))
3277
3278 def _testReadAfterTimeout(self):
3279 self.write_file.write(self.write_msg[0:3])
3280 self.write_file.flush()
3281 self.serv_finished.wait()
3282
Guido van Rossum24e4af82002-06-12 19:18:08 +00003283 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003284 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003285 first_seg = self.read_file.read(len(self.read_msg)-3)
3286 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003287 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003288 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003289
3290 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003291 self.write_file.write(self.write_msg)
3292 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003293
Guido van Rossum8c943832002-08-08 01:00:28 +00003294 def testFullRead(self):
3295 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003296 msg = self.read_file.read()
3297 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003298
3299 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003300 self.write_file.write(self.write_msg)
3301 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003302
Guido van Rossum24e4af82002-06-12 19:18:08 +00003303 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003304 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003305 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003306 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003307 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003308 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003309 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003310 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003311 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003312
3313 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003314 self.write_file.write(self.write_msg)
3315 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003316
3317 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003318 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003319 line = self.read_file.readline()
3320 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003321
3322 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003323 self.write_file.write(self.write_msg)
3324 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003325
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003326 def testCloseAfterMakefile(self):
3327 # The file returned by makefile should keep the socket open.
3328 self.cli_conn.close()
3329 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003330 msg = self.read_file.read()
3331 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003332
3333 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003334 self.write_file.write(self.write_msg)
3335 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003336
3337 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003338 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003339 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003340 if isinstance(self.read_msg, str):
3341 msg = msg.decode()
3342 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003343
3344 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003345 self.write_file.write(self.write_msg)
3346 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003347
Tim Peters116d83c2004-03-28 02:20:45 +00003348 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003349 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003350
3351 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003352 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003353
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003354 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003355 self.assertEqual(self.read_file.mode, self.read_mode)
3356 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003357
3358 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003359 self.assertEqual(self.write_file.mode, self.write_mode)
3360 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003361
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003362 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003363 self.read_file.close()
3364 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003365 self.cli_conn.close()
3366 self.assertRaises(socket.error, self.cli_conn.getsockname)
3367
3368 def _testRealClose(self):
3369 pass
3370
3371
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003372class FileObjectInterruptedTestCase(unittest.TestCase):
3373 """Test that the file object correctly handles EINTR internally."""
3374
3375 class MockSocket(object):
3376 def __init__(self, recv_funcs=()):
3377 # A generator that returns callables that we'll call for each
3378 # call to recv().
3379 self._recv_step = iter(recv_funcs)
3380
3381 def recv_into(self, buffer):
3382 data = next(self._recv_step)()
3383 assert len(buffer) >= len(data)
3384 buffer[:len(data)] = data
3385 return len(data)
3386
3387 def _decref_socketios(self):
3388 pass
3389
3390 def _textiowrap_for_test(self, buffering=-1):
3391 raw = socket.SocketIO(self, "r")
3392 if buffering < 0:
3393 buffering = io.DEFAULT_BUFFER_SIZE
3394 if buffering == 0:
3395 return raw
3396 buffer = io.BufferedReader(raw, buffering)
3397 text = io.TextIOWrapper(buffer, None, None)
3398 text.mode = "rb"
3399 return text
3400
3401 @staticmethod
3402 def _raise_eintr():
3403 raise socket.error(errno.EINTR)
3404
3405 def _textiowrap_mock_socket(self, mock, buffering=-1):
3406 raw = socket.SocketIO(mock, "r")
3407 if buffering < 0:
3408 buffering = io.DEFAULT_BUFFER_SIZE
3409 if buffering == 0:
3410 return raw
3411 buffer = io.BufferedReader(raw, buffering)
3412 text = io.TextIOWrapper(buffer, None, None)
3413 text.mode = "rb"
3414 return text
3415
3416 def _test_readline(self, size=-1, buffering=-1):
3417 mock_sock = self.MockSocket(recv_funcs=[
3418 lambda : b"This is the first line\nAnd the sec",
3419 self._raise_eintr,
3420 lambda : b"ond line is here\n",
3421 lambda : b"",
3422 lambda : b"", # XXX(gps): io library does an extra EOF read
3423 ])
3424 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003425 self.assertEqual(fo.readline(size), "This is the first line\n")
3426 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003427
3428 def _test_read(self, size=-1, buffering=-1):
3429 mock_sock = self.MockSocket(recv_funcs=[
3430 lambda : b"This is the first line\nAnd the sec",
3431 self._raise_eintr,
3432 lambda : b"ond line is here\n",
3433 lambda : b"",
3434 lambda : b"", # XXX(gps): io library does an extra EOF read
3435 ])
3436 expecting = (b"This is the first line\n"
3437 b"And the second line is here\n")
3438 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3439 if buffering == 0:
3440 data = b''
3441 else:
3442 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003443 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003444 while len(data) != len(expecting):
3445 part = fo.read(size)
3446 if not part:
3447 break
3448 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003449 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003450
3451 def test_default(self):
3452 self._test_readline()
3453 self._test_readline(size=100)
3454 self._test_read()
3455 self._test_read(size=100)
3456
3457 def test_with_1k_buffer(self):
3458 self._test_readline(buffering=1024)
3459 self._test_readline(size=100, buffering=1024)
3460 self._test_read(buffering=1024)
3461 self._test_read(size=100, buffering=1024)
3462
3463 def _test_readline_no_buffer(self, size=-1):
3464 mock_sock = self.MockSocket(recv_funcs=[
3465 lambda : b"a",
3466 lambda : b"\n",
3467 lambda : b"B",
3468 self._raise_eintr,
3469 lambda : b"b",
3470 lambda : b"",
3471 ])
3472 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003473 self.assertEqual(fo.readline(size), b"a\n")
3474 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003475
3476 def test_no_buffer(self):
3477 self._test_readline_no_buffer()
3478 self._test_readline_no_buffer(size=4)
3479 self._test_read(buffering=0)
3480 self._test_read(size=100, buffering=0)
3481
3482
Guido van Rossume9f66142002-08-07 15:46:19 +00003483class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3484
3485 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003486
Guido van Rossume9f66142002-08-07 15:46:19 +00003487 In this case (and in this case only), it should be possible to
3488 create a file object, read a line from it, create another file
3489 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003490 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003491 when reading multiple requests from the same socket."""
3492
3493 bufsize = 0 # Use unbuffered mode
3494
3495 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003496 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003497 line = self.read_file.readline() # first line
3498 self.assertEqual(line, b"A. " + self.write_msg) # first line
3499 self.read_file = self.cli_conn.makefile('rb', 0)
3500 line = self.read_file.readline() # second line
3501 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003502
3503 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003504 self.write_file.write(b"A. " + self.write_msg)
3505 self.write_file.write(b"B. " + self.write_msg)
3506 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003507
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003508 def testMakefileClose(self):
3509 # The file returned by makefile should keep the socket open...
3510 self.cli_conn.close()
3511 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003512 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003513 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003514 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003515 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3516
3517 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003518 self.write_file.write(self.write_msg)
3519 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003520
3521 def testMakefileCloseSocketDestroy(self):
3522 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003523 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003524 refcount_after = sys.getrefcount(self.cli_conn)
3525 self.assertEqual(refcount_before - 1, refcount_after)
3526
3527 def _testMakefileCloseSocketDestroy(self):
3528 pass
3529
Antoine Pitrou98b46702010-09-18 22:59:00 +00003530 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003531 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003532 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3533
3534 def testSmallReadNonBlocking(self):
3535 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003536 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3537 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003538 self.evt1.set()
3539 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003540 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003541 if first_seg is None:
3542 # Data not arrived (can happen under Windows), wait a bit
3543 time.sleep(0.5)
3544 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003545 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003546 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003547 self.assertEqual(n, 3)
3548 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003549 self.assertEqual(msg, self.read_msg)
3550 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3551 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003552
3553 def _testSmallReadNonBlocking(self):
3554 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003555 self.write_file.write(self.write_msg)
3556 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003557 self.evt2.set()
3558 # Avoid cloding the socket before the server test has finished,
3559 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3560 self.serv_finished.wait(5.0)
3561
3562 def testWriteNonBlocking(self):
3563 self.cli_finished.wait(5.0)
3564 # The client thread can't skip directly - the SkipTest exception
3565 # would appear as a failure.
3566 if self.serv_skipped:
3567 self.skipTest(self.serv_skipped)
3568
3569 def _testWriteNonBlocking(self):
3570 self.serv_skipped = None
3571 self.serv_conn.setblocking(False)
3572 # Try to saturate the socket buffer pipe with repeated large writes.
3573 BIG = b"x" * (1024 ** 2)
3574 LIMIT = 10
3575 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003576 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003577 self.assertGreater(n, 0)
3578 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003579 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003580 if n is None:
3581 # Succeeded
3582 break
3583 self.assertGreater(n, 0)
3584 else:
3585 # Let us know that this test didn't manage to establish
3586 # the expected conditions. This is not a failure in itself but,
3587 # if it happens repeatedly, the test should be fixed.
3588 self.serv_skipped = "failed to saturate the socket buffer"
3589
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003590
Guido van Rossum8c943832002-08-08 01:00:28 +00003591class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3592
3593 bufsize = 1 # Default-buffered for reading; line-buffered for writing
3594
3595
3596class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3597
3598 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00003599
Thomas Woutersb2137042007-02-01 18:02:27 +00003600
Antoine Pitrou834bd812010-10-13 16:17:14 +00003601class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
3602 """Tests for socket.makefile() in text mode (rather than binary)"""
3603
3604 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003605 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003606 write_mode = 'wb'
3607 write_msg = MSG
3608 newline = ''
3609
3610
3611class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
3612 """Tests for socket.makefile() in text mode (rather than binary)"""
3613
3614 read_mode = 'rb'
3615 read_msg = MSG
3616 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003617 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003618 newline = ''
3619
3620
3621class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
3622 """Tests for socket.makefile() in text mode (rather than binary)"""
3623
3624 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003625 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003626 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003627 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003628 newline = ''
3629
3630
Guido van Rossumd8faa362007-04-27 19:54:29 +00003631class NetworkConnectionTest(object):
3632 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003633
Guido van Rossumd8faa362007-04-27 19:54:29 +00003634 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003635 # We're inherited below by BasicTCPTest2, which also inherits
3636 # BasicTCPTest, which defines self.port referenced below.
3637 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003638 self.serv_conn = self.cli
3639
3640class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
3641 """Tests that NetworkConnection does not break existing TCP functionality.
3642 """
3643
3644class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003645
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003646 class MockSocket(socket.socket):
3647 def connect(self, *args):
3648 raise socket.timeout('timed out')
3649
3650 @contextlib.contextmanager
3651 def mocked_socket_module(self):
3652 """Return a socket which times out on connect"""
3653 old_socket = socket.socket
3654 socket.socket = self.MockSocket
3655 try:
3656 yield
3657 finally:
3658 socket.socket = old_socket
3659
3660 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003661 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003662 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003663 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003664 with self.assertRaises(socket.error) as cm:
3665 cli.connect((HOST, port))
3666 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3667
3668 def test_create_connection(self):
3669 # Issue #9792: errors raised by create_connection() should have
3670 # a proper errno attribute.
3671 port = support.find_unused_port()
3672 with self.assertRaises(socket.error) as cm:
3673 socket.create_connection((HOST, port))
3674 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3675
3676 def test_create_connection_timeout(self):
3677 # Issue #9792: create_connection() should not recast timeout errors
3678 # as generic socket errors.
3679 with self.mocked_socket_module():
3680 with self.assertRaises(socket.timeout):
3681 socket.create_connection((HOST, 1234))
3682
Guido van Rossumd8faa362007-04-27 19:54:29 +00003683
Victor Stinner45df8202010-04-28 22:31:17 +00003684@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003685class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
3686
3687 def __init__(self, methodName='runTest'):
3688 SocketTCPTest.__init__(self, methodName=methodName)
3689 ThreadableTest.__init__(self)
3690
3691 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003692 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003693
3694 def clientTearDown(self):
3695 self.cli.close()
3696 self.cli = None
3697 ThreadableTest.clientTearDown(self)
3698
3699 def _justAccept(self):
3700 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003701 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003702
3703 testFamily = _justAccept
3704 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003705 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003706 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003707 self.assertEqual(self.cli.family, 2)
3708
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003709 testSourceAddress = _justAccept
3710 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003711 self.cli = socket.create_connection((HOST, self.port), timeout=30,
3712 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003713 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00003714 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003715 # The port number being used is sufficient to show that the bind()
3716 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00003717
Guido van Rossumd8faa362007-04-27 19:54:29 +00003718 testTimeoutDefault = _justAccept
3719 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00003720 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003721 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003722 socket.setdefaulttimeout(42)
3723 try:
3724 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003725 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003726 finally:
3727 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003728 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003729
3730 testTimeoutNone = _justAccept
3731 def _testTimeoutNone(self):
3732 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003733 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003734 socket.setdefaulttimeout(30)
3735 try:
3736 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003737 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003738 finally:
3739 socket.setdefaulttimeout(None)
3740 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003741
3742 testTimeoutValueNamed = _justAccept
3743 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003744 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003745 self.assertEqual(self.cli.gettimeout(), 30)
3746
3747 testTimeoutValueNonamed = _justAccept
3748 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003749 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003750 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003751 self.assertEqual(self.cli.gettimeout(), 30)
3752
Victor Stinner45df8202010-04-28 22:31:17 +00003753@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003754class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
3755
3756 def __init__(self, methodName='runTest'):
3757 SocketTCPTest.__init__(self, methodName=methodName)
3758 ThreadableTest.__init__(self)
3759
3760 def clientSetUp(self):
3761 pass
3762
3763 def clientTearDown(self):
3764 self.cli.close()
3765 self.cli = None
3766 ThreadableTest.clientTearDown(self)
3767
3768 def testInsideTimeout(self):
3769 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003770 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003771 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003772 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003773 testOutsideTimeout = testInsideTimeout
3774
3775 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003776 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003777 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003778 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003779
3780 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003781 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003782 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003783
3784
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003785class TCPTimeoutTest(SocketTCPTest):
3786
3787 def testTCPTimeout(self):
3788 def raise_timeout(*args, **kwargs):
3789 self.serv.settimeout(1.0)
3790 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003791 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003792 "Error generating a timeout exception (TCP)")
3793
3794 def testTimeoutZero(self):
3795 ok = False
3796 try:
3797 self.serv.settimeout(0.0)
3798 foo = self.serv.accept()
3799 except socket.timeout:
3800 self.fail("caught timeout instead of error (TCP)")
3801 except socket.error:
3802 ok = True
3803 except:
3804 self.fail("caught unexpected exception (TCP)")
3805 if not ok:
3806 self.fail("accept() returned success when we did not expect it")
3807
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003808 def testInterruptedTimeout(self):
3809 # XXX I don't know how to do this test on MSWindows or any other
3810 # plaform that doesn't support signal.alarm() or os.kill(), though
3811 # the bug should have existed on all platforms.
3812 if not hasattr(signal, "alarm"):
3813 return # can only test on *nix
3814 self.serv.settimeout(5.0) # must be longer than alarm
3815 class Alarm(Exception):
3816 pass
3817 def alarm_handler(signal, frame):
3818 raise Alarm
3819 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
3820 try:
3821 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
3822 try:
3823 foo = self.serv.accept()
3824 except socket.timeout:
3825 self.fail("caught timeout instead of Alarm")
3826 except Alarm:
3827 pass
3828 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00003829 self.fail("caught other exception instead of Alarm:"
3830 " %s(%s):\n%s" %
3831 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003832 else:
3833 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00003834 finally:
3835 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003836 except Alarm:
3837 self.fail("got Alarm in wrong place")
3838 finally:
3839 # no alarm can be pending. Safe to restore old handler.
3840 signal.signal(signal.SIGALRM, old_alarm)
3841
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003842class UDPTimeoutTest(SocketTCPTest):
3843
3844 def testUDPTimeout(self):
3845 def raise_timeout(*args, **kwargs):
3846 self.serv.settimeout(1.0)
3847 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003848 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003849 "Error generating a timeout exception (UDP)")
3850
3851 def testTimeoutZero(self):
3852 ok = False
3853 try:
3854 self.serv.settimeout(0.0)
3855 foo = self.serv.recv(1024)
3856 except socket.timeout:
3857 self.fail("caught timeout instead of error (UDP)")
3858 except socket.error:
3859 ok = True
3860 except:
3861 self.fail("caught unexpected exception (UDP)")
3862 if not ok:
3863 self.fail("recv() returned success when we did not expect it")
3864
3865class TestExceptions(unittest.TestCase):
3866
3867 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003868 self.assertTrue(issubclass(socket.error, Exception))
3869 self.assertTrue(issubclass(socket.herror, socket.error))
3870 self.assertTrue(issubclass(socket.gaierror, socket.error))
3871 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003872
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003873class TestLinuxAbstractNamespace(unittest.TestCase):
3874
3875 UNIX_PATH_MAX = 108
3876
3877 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003878 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00003879 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
3880 s1.bind(address)
3881 s1.listen(1)
3882 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
3883 s2.connect(s1.getsockname())
3884 with s1.accept()[0] as s3:
3885 self.assertEqual(s1.getsockname(), address)
3886 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003887
3888 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003889 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00003890 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
3891 s.bind(address)
3892 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003893
3894 def testNameOverflow(self):
3895 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00003896 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
3897 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003898
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003899
Victor Stinner45df8202010-04-28 22:31:17 +00003900@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00003901class BufferIOTest(SocketConnectedTest):
3902 """
3903 Test the buffer versions of socket.recv() and socket.send().
3904 """
3905 def __init__(self, methodName='runTest'):
3906 SocketConnectedTest.__init__(self, methodName=methodName)
3907
Antoine Pitrou25480782010-03-17 22:50:28 +00003908 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00003909 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003910 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003911 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003912 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00003913 self.assertEqual(msg, MSG)
3914
Antoine Pitrou25480782010-03-17 22:50:28 +00003915 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00003916 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003917 self.serv_conn.send(buf)
3918
Antoine Pitrou25480782010-03-17 22:50:28 +00003919 def testRecvIntoBytearray(self):
3920 buf = bytearray(1024)
3921 nbytes = self.cli_conn.recv_into(buf)
3922 self.assertEqual(nbytes, len(MSG))
3923 msg = buf[:len(MSG)]
3924 self.assertEqual(msg, MSG)
3925
3926 _testRecvIntoBytearray = _testRecvIntoArray
3927
3928 def testRecvIntoMemoryview(self):
3929 buf = bytearray(1024)
3930 nbytes = self.cli_conn.recv_into(memoryview(buf))
3931 self.assertEqual(nbytes, len(MSG))
3932 msg = buf[:len(MSG)]
3933 self.assertEqual(msg, MSG)
3934
3935 _testRecvIntoMemoryview = _testRecvIntoArray
3936
3937 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00003938 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003939 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003940 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003941 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00003942 self.assertEqual(msg, MSG)
3943
Antoine Pitrou25480782010-03-17 22:50:28 +00003944 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00003945 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003946 self.serv_conn.send(buf)
3947
Antoine Pitrou25480782010-03-17 22:50:28 +00003948 def testRecvFromIntoBytearray(self):
3949 buf = bytearray(1024)
3950 nbytes, addr = self.cli_conn.recvfrom_into(buf)
3951 self.assertEqual(nbytes, len(MSG))
3952 msg = buf[:len(MSG)]
3953 self.assertEqual(msg, MSG)
3954
3955 _testRecvFromIntoBytearray = _testRecvFromIntoArray
3956
3957 def testRecvFromIntoMemoryview(self):
3958 buf = bytearray(1024)
3959 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
3960 self.assertEqual(nbytes, len(MSG))
3961 msg = buf[:len(MSG)]
3962 self.assertEqual(msg, MSG)
3963
3964 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
3965
Christian Heimes043d6f62008-01-07 17:19:16 +00003966
3967TIPC_STYPE = 2000
3968TIPC_LOWER = 200
3969TIPC_UPPER = 210
3970
3971def isTipcAvailable():
3972 """Check if the TIPC module is loaded
3973
3974 The TIPC module is not loaded automatically on Ubuntu and probably
3975 other Linux distros.
3976 """
3977 if not hasattr(socket, "AF_TIPC"):
3978 return False
3979 if not os.path.isfile("/proc/modules"):
3980 return False
3981 with open("/proc/modules") as f:
3982 for line in f:
3983 if line.startswith("tipc "):
3984 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003985 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00003986 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
3987 return False
3988
3989class TIPCTest (unittest.TestCase):
3990 def testRDM(self):
3991 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
3992 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
3993
3994 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
3995 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
3996 TIPC_LOWER, TIPC_UPPER)
3997 srv.bind(srvaddr)
3998
3999 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4000 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4001 cli.sendto(MSG, sendaddr)
4002
4003 msg, recvaddr = srv.recvfrom(1024)
4004
4005 self.assertEqual(cli.getsockname(), recvaddr)
4006 self.assertEqual(msg, MSG)
4007
4008
4009class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
4010 def __init__(self, methodName = 'runTest'):
4011 unittest.TestCase.__init__(self, methodName = methodName)
4012 ThreadableTest.__init__(self)
4013
4014 def setUp(self):
4015 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
4016 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4017 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4018 TIPC_LOWER, TIPC_UPPER)
4019 self.srv.bind(srvaddr)
4020 self.srv.listen(5)
4021 self.serverExplicitReady()
4022 self.conn, self.connaddr = self.srv.accept()
4023
4024 def clientSetUp(self):
4025 # The is a hittable race between serverExplicitReady() and the
4026 # accept() call; sleep a little while to avoid it, otherwise
4027 # we could get an exception
4028 time.sleep(0.1)
4029 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
4030 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4031 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4032 self.cli.connect(addr)
4033 self.cliaddr = self.cli.getsockname()
4034
4035 def testStream(self):
4036 msg = self.conn.recv(1024)
4037 self.assertEqual(msg, MSG)
4038 self.assertEqual(self.cliaddr, self.connaddr)
4039
4040 def _testStream(self):
4041 self.cli.send(MSG)
4042 self.cli.close()
4043
4044
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004045@unittest.skipUnless(thread, 'Threading required for this test.')
4046class ContextManagersTest(ThreadedTCPSocketTest):
4047
4048 def _testSocketClass(self):
4049 # base test
4050 with socket.socket() as sock:
4051 self.assertFalse(sock._closed)
4052 self.assertTrue(sock._closed)
4053 # close inside with block
4054 with socket.socket() as sock:
4055 sock.close()
4056 self.assertTrue(sock._closed)
4057 # exception inside with block
4058 with socket.socket() as sock:
4059 self.assertRaises(socket.error, sock.sendall, b'foo')
4060 self.assertTrue(sock._closed)
4061
4062 def testCreateConnectionBase(self):
4063 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004064 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004065 data = conn.recv(1024)
4066 conn.sendall(data)
4067
4068 def _testCreateConnectionBase(self):
4069 address = self.serv.getsockname()
4070 with socket.create_connection(address) as sock:
4071 self.assertFalse(sock._closed)
4072 sock.sendall(b'foo')
4073 self.assertEqual(sock.recv(1024), b'foo')
4074 self.assertTrue(sock._closed)
4075
4076 def testCreateConnectionClose(self):
4077 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004078 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004079 data = conn.recv(1024)
4080 conn.sendall(data)
4081
4082 def _testCreateConnectionClose(self):
4083 address = self.serv.getsockname()
4084 with socket.create_connection(address) as sock:
4085 sock.close()
4086 self.assertTrue(sock._closed)
4087 self.assertRaises(socket.error, sock.sendall, b'foo')
4088
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004089
Antoine Pitroub1c54962010-10-14 15:05:38 +00004090@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4091 "SOCK_CLOEXEC not defined")
4092@unittest.skipUnless(fcntl, "module fcntl not available")
4093class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004094 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004095 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004096 with socket.socket(socket.AF_INET,
4097 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4098 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4099 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004100
4101
4102@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4103 "SOCK_NONBLOCK not defined")
4104class NonblockConstantTest(unittest.TestCase):
4105 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4106 if nonblock:
4107 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4108 self.assertEqual(s.gettimeout(), timeout)
4109 else:
4110 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4111 self.assertEqual(s.gettimeout(), None)
4112
Charles-François Natali239bb962011-06-03 12:55:15 +02004113 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004114 def test_SOCK_NONBLOCK(self):
4115 # a lot of it seems silly and redundant, but I wanted to test that
4116 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004117 with socket.socket(socket.AF_INET,
4118 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4119 self.checkNonblock(s)
4120 s.setblocking(1)
4121 self.checkNonblock(s, False)
4122 s.setblocking(0)
4123 self.checkNonblock(s)
4124 s.settimeout(None)
4125 self.checkNonblock(s, False)
4126 s.settimeout(2.0)
4127 self.checkNonblock(s, timeout=2.0)
4128 s.setblocking(1)
4129 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004130 # defaulttimeout
4131 t = socket.getdefaulttimeout()
4132 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004133 with socket.socket() as s:
4134 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004135 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004136 with socket.socket() as s:
4137 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004138 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004139 with socket.socket() as s:
4140 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004141 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004142 with socket.socket() as s:
4143 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004144 socket.setdefaulttimeout(t)
4145
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004146
Guido van Rossumb995eb72002-07-31 16:08:40 +00004147def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004148 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004149 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004150
4151 tests.extend([
4152 NonBlockingTCPTests,
4153 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004154 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004155 UnbufferedFileObjectClassTestCase,
4156 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004157 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004158 UnicodeReadFileObjectClassTestCase,
4159 UnicodeWriteFileObjectClassTestCase,
4160 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004161 NetworkConnectionNoServer,
4162 NetworkConnectionAttributesTest,
4163 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004164 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004165 CloexecConstantTest,
4166 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004167 ])
Dave Cole331708b2004-08-09 04:51:41 +00004168 if hasattr(socket, "socketpair"):
4169 tests.append(BasicSocketPairTest)
Victor Stinnere6747472011-08-21 00:39:18 +02004170 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004171 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004172 if isTipcAvailable():
4173 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004174 tests.append(TIPCThreadableTest)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004175 tests.extend([
4176 CmsgMacroTests,
4177 SendmsgUDPTest,
4178 RecvmsgUDPTest,
4179 RecvmsgIntoUDPTest,
4180 SendmsgUDP6Test,
4181 RecvmsgUDP6Test,
4182 RecvmsgRFC3542AncillaryUDP6Test,
4183 RecvmsgIntoRFC3542AncillaryUDP6Test,
4184 RecvmsgIntoUDP6Test,
4185 SendmsgTCPTest,
4186 RecvmsgTCPTest,
4187 RecvmsgIntoTCPTest,
4188 SendmsgSCTPStreamTest,
4189 RecvmsgSCTPStreamTest,
4190 RecvmsgIntoSCTPStreamTest,
4191 SendmsgUnixStreamTest,
4192 RecvmsgUnixStreamTest,
4193 RecvmsgIntoUnixStreamTest,
4194 RecvmsgSCMRightsStreamTest,
4195 RecvmsgIntoSCMRightsStreamTest,
4196 # These are slow when setitimer() is not available
4197 InterruptedRecvTimeoutTest,
4198 InterruptedSendTimeoutTest,
4199 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004200
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004201 thread_info = support.threading_setup()
4202 support.run_unittest(*tests)
4203 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004204
4205if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004206 test_main()