blob: 092e94f38034b83bc764fd7fd2b9977b749bf7a1 [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
Charles-François Natali47413c12011-10-06 19:47:44 +020024import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
26 import fcntl
27except ImportError:
28 fcntl = False
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000029try:
30 import multiprocessing
31except ImportError:
32 multiprocessing = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000033
Benjamin Petersonee8712c2008-05-20 21:35:26 +000034HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000035MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Victor Stinner45df8202010-04-28 22:31:17 +000037try:
38 import _thread as thread
39 import threading
40except ImportError:
41 thread = None
42 threading = None
43
Charles-François Natali47413c12011-10-06 19:47:44 +020044def _have_socket_can():
45 """Check whether CAN sockets are supported on this host."""
46 try:
47 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
48 except (AttributeError, socket.error, OSError):
49 return False
50 else:
51 s.close()
52 return True
53
Charles-François Natali10b8cf42011-11-10 19:21:37 +010054def _have_socket_rds():
55 """Check whether RDS sockets are supported on this host."""
56 try:
57 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
58 except (AttributeError, OSError):
59 return False
60 else:
61 s.close()
62 return True
63
Charles-François Natali47413c12011-10-06 19:47:44 +020064HAVE_SOCKET_CAN = _have_socket_can()
65
Charles-François Natali10b8cf42011-11-10 19:21:37 +010066HAVE_SOCKET_RDS = _have_socket_rds()
67
Nick Coghlan96fe56a2011-08-22 11:55:57 +100068# Size in bytes of the int type
69SIZEOF_INT = array.array("i").itemsize
70
Guido van Rossum24e4af82002-06-12 19:18:08 +000071class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000072
Guido van Rossum24e4af82002-06-12 19:18:08 +000073 def setUp(self):
74 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000075 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000076 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078 def tearDown(self):
79 self.serv.close()
80 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000081
Guido van Rossum24e4af82002-06-12 19:18:08 +000082class SocketUDPTest(unittest.TestCase):
83
84 def setUp(self):
85 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000086 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000087
88 def tearDown(self):
89 self.serv.close()
90 self.serv = None
91
Nick Coghlan96fe56a2011-08-22 11:55:57 +100092class ThreadSafeCleanupTestCase(unittest.TestCase):
93 """Subclass of unittest.TestCase with thread-safe cleanup methods.
94
95 This subclass protects the addCleanup() and doCleanups() methods
96 with a recursive lock.
97 """
98
99 if threading:
100 def __init__(self, *args, **kwargs):
101 super().__init__(*args, **kwargs)
102 self._cleanup_lock = threading.RLock()
103
104 def addCleanup(self, *args, **kwargs):
105 with self._cleanup_lock:
106 return super().addCleanup(*args, **kwargs)
107
108 def doCleanups(self, *args, **kwargs):
109 with self._cleanup_lock:
110 return super().doCleanups(*args, **kwargs)
111
Charles-François Natali47413c12011-10-06 19:47:44 +0200112class SocketCANTest(unittest.TestCase):
113
114 """To be able to run this test, a `vcan0` CAN interface can be created with
115 the following commands:
116 # modprobe vcan
117 # ip link add dev vcan0 type vcan
118 # ifconfig vcan0 up
119 """
120 interface = 'vcan0'
121 bufsize = 128
122
123 def setUp(self):
124 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200125 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200126 try:
127 self.s.bind((self.interface,))
128 except socket.error:
129 self.skipTest('network interface `%s` does not exist' %
130 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200131
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100132
133class SocketRDSTest(unittest.TestCase):
134
135 """To be able to run this test, the `rds` kernel module must be loaded:
136 # modprobe rds
137 """
138 bufsize = 8192
139
140 def setUp(self):
141 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
142 self.addCleanup(self.serv.close)
143 try:
144 self.port = support.bind_port(self.serv)
145 except OSError:
146 self.skipTest('unable to bind RDS socket')
147
148
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000150 """Threadable Test class
151
152 The ThreadableTest class makes it easy to create a threaded
153 client/server pair from an existing unit test. To create a
154 new threaded class from an existing unit test, use multiple
155 inheritance:
156
157 class NewClass (OldClass, ThreadableTest):
158 pass
159
160 This class defines two new fixture functions with obvious
161 purposes for overriding:
162
163 clientSetUp ()
164 clientTearDown ()
165
166 Any new test functions within the class must then define
167 tests in pairs, where the test name is preceeded with a
168 '_' to indicate the client portion of the test. Ex:
169
170 def testFoo(self):
171 # Server portion
172
173 def _testFoo(self):
174 # Client portion
175
176 Any exceptions raised by the clients during their tests
177 are caught and transferred to the main thread to alert
178 the testing framework.
179
180 Note, the server setup function cannot call any blocking
181 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000182 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000183 the blocking call (such as in setting up a client/server
184 connection and performing the accept() in setUp().
185 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000186
187 def __init__(self):
188 # Swap the true setup function
189 self.__setUp = self.setUp
190 self.__tearDown = self.tearDown
191 self.setUp = self._setUp
192 self.tearDown = self._tearDown
193
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000194 def serverExplicitReady(self):
195 """This method allows the server to explicitly indicate that
196 it wants the client thread to proceed. This is useful if the
197 server is about to execute a blocking routine that is
198 dependent upon the client thread during its setup routine."""
199 self.server_ready.set()
200
Guido van Rossum24e4af82002-06-12 19:18:08 +0000201 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000202 self.server_ready = threading.Event()
203 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000204 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000205 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200206 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000207
208 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000209 methodname = self.id()
210 i = methodname.rfind('.')
211 methodname = methodname[i+1:]
212 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000213 self.client_thread = thread.start_new_thread(
214 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200216 try:
217 self.__setUp()
218 except:
219 self.server_crashed = True
220 raise
221 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000222 self.server_ready.set()
223 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000224
225 def _tearDown(self):
226 self.__tearDown()
227 self.done.wait()
228
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000229 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000230 exc = self.queue.get()
231 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232
233 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000234 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000235 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200236 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200237 if self.server_crashed:
238 self.clientTearDown()
239 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000240 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000241 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242 try:
243 test_func()
Nick Coghlan2496f332011-09-19 20:26:31 +1000244 except unittest._ExpectedFailure:
245 # We deliberately ignore expected failures
246 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000247 except BaseException as e:
248 self.queue.put(e)
249 finally:
250 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000251
252 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000253 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000254
255 def clientTearDown(self):
256 self.done.set()
257 thread.exit()
258
259class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
260
261 def __init__(self, methodName='runTest'):
262 SocketTCPTest.__init__(self, methodName=methodName)
263 ThreadableTest.__init__(self)
264
265 def clientSetUp(self):
266 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
267
268 def clientTearDown(self):
269 self.cli.close()
270 self.cli = None
271 ThreadableTest.clientTearDown(self)
272
273class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
274
275 def __init__(self, methodName='runTest'):
276 SocketUDPTest.__init__(self, methodName=methodName)
277 ThreadableTest.__init__(self)
278
279 def clientSetUp(self):
280 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
281
Brian Curtin3beb38f2010-11-04 03:41:43 +0000282 def clientTearDown(self):
283 self.cli.close()
284 self.cli = None
285 ThreadableTest.clientTearDown(self)
286
Charles-François Natali47413c12011-10-06 19:47:44 +0200287class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
288
289 def __init__(self, methodName='runTest'):
290 SocketCANTest.__init__(self, methodName=methodName)
291 ThreadableTest.__init__(self)
292
293 def clientSetUp(self):
294 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
295 try:
296 self.cli.bind((self.interface,))
297 except socket.error:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200298 # skipTest should not be called here, and will be called in the
299 # server instead
300 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200301
302 def clientTearDown(self):
303 self.cli.close()
304 self.cli = None
305 ThreadableTest.clientTearDown(self)
306
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100307class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
308
309 def __init__(self, methodName='runTest'):
310 SocketRDSTest.__init__(self, methodName=methodName)
311 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100312
313 def clientSetUp(self):
314 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
315 try:
316 # RDS sockets must be bound explicitly to send or receive data
317 self.cli.bind((HOST, 0))
318 self.cli_addr = self.cli.getsockname()
319 except OSError:
320 # skipTest should not be called here, and will be called in the
321 # server instead
322 pass
323
324 def clientTearDown(self):
325 self.cli.close()
326 self.cli = None
327 ThreadableTest.clientTearDown(self)
328
Guido van Rossum24e4af82002-06-12 19:18:08 +0000329class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000330 """Socket tests for client-server connection.
331
332 self.cli_conn is a client socket connected to the server. The
333 setUp() method guarantees that it is connected to the server.
334 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000335
336 def __init__(self, methodName='runTest'):
337 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
338
339 def setUp(self):
340 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000341 # Indicate explicitly we're ready for the client thread to
342 # proceed and then perform the blocking call to accept
343 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000344 conn, addr = self.serv.accept()
345 self.cli_conn = conn
346
347 def tearDown(self):
348 self.cli_conn.close()
349 self.cli_conn = None
350 ThreadedTCPSocketTest.tearDown(self)
351
352 def clientSetUp(self):
353 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000354 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000355 self.serv_conn = self.cli
356
357 def clientTearDown(self):
358 self.serv_conn.close()
359 self.serv_conn = None
360 ThreadedTCPSocketTest.clientTearDown(self)
361
Dave Cole331708b2004-08-09 04:51:41 +0000362class SocketPairTest(unittest.TestCase, ThreadableTest):
363
364 def __init__(self, methodName='runTest'):
365 unittest.TestCase.__init__(self, methodName=methodName)
366 ThreadableTest.__init__(self)
367
368 def setUp(self):
369 self.serv, self.cli = socket.socketpair()
370
371 def tearDown(self):
372 self.serv.close()
373 self.serv = None
374
375 def clientSetUp(self):
376 pass
377
378 def clientTearDown(self):
379 self.cli.close()
380 self.cli = None
381 ThreadableTest.clientTearDown(self)
382
Tim Peters494aaee2004-08-09 18:54:11 +0000383
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000384# The following classes are used by the sendmsg()/recvmsg() tests.
385# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
386# gives a drop-in replacement for SocketConnectedTest, but different
387# address families can be used, and the attributes serv_addr and
388# cli_addr will be set to the addresses of the endpoints.
389
390class SocketTestBase(unittest.TestCase):
391 """A base class for socket tests.
392
393 Subclasses must provide methods newSocket() to return a new socket
394 and bindSock(sock) to bind it to an unused address.
395
396 Creates a socket self.serv and sets self.serv_addr to its address.
397 """
398
399 def setUp(self):
400 self.serv = self.newSocket()
401 self.bindServer()
402
403 def bindServer(self):
404 """Bind server socket and set self.serv_addr to its address."""
405 self.bindSock(self.serv)
406 self.serv_addr = self.serv.getsockname()
407
408 def tearDown(self):
409 self.serv.close()
410 self.serv = None
411
412
413class SocketListeningTestMixin(SocketTestBase):
414 """Mixin to listen on the server socket."""
415
416 def setUp(self):
417 super().setUp()
418 self.serv.listen(1)
419
420
421class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
422 ThreadableTest):
423 """Mixin to add client socket and allow client/server tests.
424
425 Client socket is self.cli and its address is self.cli_addr. See
426 ThreadableTest for usage information.
427 """
428
429 def __init__(self, *args, **kwargs):
430 super().__init__(*args, **kwargs)
431 ThreadableTest.__init__(self)
432
433 def clientSetUp(self):
434 self.cli = self.newClientSocket()
435 self.bindClient()
436
437 def newClientSocket(self):
438 """Return a new socket for use as client."""
439 return self.newSocket()
440
441 def bindClient(self):
442 """Bind client socket and set self.cli_addr to its address."""
443 self.bindSock(self.cli)
444 self.cli_addr = self.cli.getsockname()
445
446 def clientTearDown(self):
447 self.cli.close()
448 self.cli = None
449 ThreadableTest.clientTearDown(self)
450
451
452class ConnectedStreamTestMixin(SocketListeningTestMixin,
453 ThreadedSocketTestMixin):
454 """Mixin to allow client/server stream tests with connected client.
455
456 Server's socket representing connection to client is self.cli_conn
457 and client's connection to server is self.serv_conn. (Based on
458 SocketConnectedTest.)
459 """
460
461 def setUp(self):
462 super().setUp()
463 # Indicate explicitly we're ready for the client thread to
464 # proceed and then perform the blocking call to accept
465 self.serverExplicitReady()
466 conn, addr = self.serv.accept()
467 self.cli_conn = conn
468
469 def tearDown(self):
470 self.cli_conn.close()
471 self.cli_conn = None
472 super().tearDown()
473
474 def clientSetUp(self):
475 super().clientSetUp()
476 self.cli.connect(self.serv_addr)
477 self.serv_conn = self.cli
478
479 def clientTearDown(self):
480 self.serv_conn.close()
481 self.serv_conn = None
482 super().clientTearDown()
483
484
485class UnixSocketTestBase(SocketTestBase):
486 """Base class for Unix-domain socket tests."""
487
488 # This class is used for file descriptor passing tests, so we
489 # create the sockets in a private directory so that other users
490 # can't send anything that might be problematic for a privileged
491 # user running the tests.
492
493 def setUp(self):
494 self.dir_path = tempfile.mkdtemp()
495 self.addCleanup(os.rmdir, self.dir_path)
496 super().setUp()
497
498 def bindSock(self, sock):
499 path = tempfile.mktemp(dir=self.dir_path)
500 sock.bind(path)
501 self.addCleanup(support.unlink, path)
502
503class UnixStreamBase(UnixSocketTestBase):
504 """Base class for Unix-domain SOCK_STREAM tests."""
505
506 def newSocket(self):
507 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
508
509
510class InetTestBase(SocketTestBase):
511 """Base class for IPv4 socket tests."""
512
513 host = HOST
514
515 def setUp(self):
516 super().setUp()
517 self.port = self.serv_addr[1]
518
519 def bindSock(self, sock):
520 support.bind_port(sock, host=self.host)
521
522class TCPTestBase(InetTestBase):
523 """Base class for TCP-over-IPv4 tests."""
524
525 def newSocket(self):
526 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
527
528class UDPTestBase(InetTestBase):
529 """Base class for UDP-over-IPv4 tests."""
530
531 def newSocket(self):
532 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
533
534class SCTPStreamBase(InetTestBase):
535 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
536
537 def newSocket(self):
538 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
539 socket.IPPROTO_SCTP)
540
541
542class Inet6TestBase(InetTestBase):
543 """Base class for IPv6 socket tests."""
544
545 # Don't use "localhost" here - it may not have an IPv6 address
546 # assigned to it by default (e.g. in /etc/hosts), and if someone
547 # has assigned it an IPv4-mapped address, then it's unlikely to
548 # work with the full IPv6 API.
549 host = "::1"
550
551class UDP6TestBase(Inet6TestBase):
552 """Base class for UDP-over-IPv6 tests."""
553
554 def newSocket(self):
555 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
556
557
558# Test-skipping decorators for use with ThreadableTest.
559
560def skipWithClientIf(condition, reason):
561 """Skip decorated test if condition is true, add client_skip decorator.
562
563 If the decorated object is not a class, sets its attribute
564 "client_skip" to a decorator which will return an empty function
565 if the test is to be skipped, or the original function if it is
566 not. This can be used to avoid running the client part of a
567 skipped test when using ThreadableTest.
568 """
569 def client_pass(*args, **kwargs):
570 pass
571 def skipdec(obj):
572 retval = unittest.skip(reason)(obj)
573 if not isinstance(obj, type):
574 retval.client_skip = lambda f: client_pass
575 return retval
576 def noskipdec(obj):
577 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
578 obj.client_skip = lambda f: f
579 return obj
580 return skipdec if condition else noskipdec
581
582
583def requireAttrs(obj, *attributes):
584 """Skip decorated test if obj is missing any of the given attributes.
585
586 Sets client_skip attribute as skipWithClientIf() does.
587 """
588 missing = [name for name in attributes if not hasattr(obj, name)]
589 return skipWithClientIf(
590 missing, "don't have " + ", ".join(name for name in missing))
591
592
593def requireSocket(*args):
594 """Skip decorated test if a socket cannot be created with given arguments.
595
596 When an argument is given as a string, will use the value of that
597 attribute of the socket module, or skip the test if it doesn't
598 exist. Sets client_skip attribute as skipWithClientIf() does.
599 """
600 err = None
601 missing = [obj for obj in args if
602 isinstance(obj, str) and not hasattr(socket, obj)]
603 if missing:
604 err = "don't have " + ", ".join(name for name in missing)
605 else:
606 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
607 for obj in args]
608 try:
609 s = socket.socket(*callargs)
610 except socket.error as e:
611 # XXX: check errno?
612 err = str(e)
613 else:
614 s.close()
615 return skipWithClientIf(
616 err is not None,
617 "can't create socket({0}): {1}".format(
618 ", ".join(str(o) for o in args), err))
619
620
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621#######################################################################
622## Begin Tests
623
624class GeneralModuleTests(unittest.TestCase):
625
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000626 def test_repr(self):
627 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000628 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000629 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000630
Raymond Hettinger027bb632004-05-31 03:09:25 +0000631 def test_weakref(self):
632 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
633 p = proxy(s)
634 self.assertEqual(p.fileno(), s.fileno())
635 s.close()
636 s = None
637 try:
638 p.fileno()
639 except ReferenceError:
640 pass
641 else:
642 self.fail('Socket proxy still exists')
643
Guido van Rossum24e4af82002-06-12 19:18:08 +0000644 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000645 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300646 msg = "Error raising socket exception (%s)."
647 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300649 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300651 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000652 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653
Ezio Melotti63e42302011-05-07 19:47:48 +0300654 def testSendtoErrors(self):
655 # Testing that sendto doens't masks failures. See #10169.
656 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
657 self.addCleanup(s.close)
658 s.bind(('', 0))
659 sockname = s.getsockname()
660 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300661 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300662 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300663 self.assertEqual(str(cm.exception),
664 "'str' does not support the buffer interface")
665 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300666 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300667 self.assertEqual(str(cm.exception),
668 "'complex' does not support the buffer interface")
669 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300670 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300671 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300672 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300673 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300674 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300675 self.assertEqual(str(cm.exception),
676 "'str' does not support the buffer interface")
677 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300678 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300679 self.assertEqual(str(cm.exception),
680 "'complex' does not support the buffer interface")
681 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300682 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300683 self.assertIn('not NoneType', str(cm.exception))
684 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300685 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300686 self.assertIn('an integer is required', str(cm.exception))
687 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300688 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300689 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300690 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300691 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300692 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300693 self.assertIn('(1 given)', str(cm.exception))
694 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300695 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300696 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300697
Guido van Rossum24e4af82002-06-12 19:18:08 +0000698 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000699 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700 socket.AF_INET
701 socket.SOCK_STREAM
702 socket.SOCK_DGRAM
703 socket.SOCK_RAW
704 socket.SOCK_RDM
705 socket.SOCK_SEQPACKET
706 socket.SOL_SOCKET
707 socket.SO_REUSEADDR
708
Guido van Rossum654c11e2002-06-13 20:24:17 +0000709 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000710 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000711 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000712 try:
713 ip = socket.gethostbyname(hostname)
714 except socket.error:
715 # Probably name lookup wasn't set up right; skip this test
716 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000717 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000718 try:
719 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
720 except socket.error:
721 # Probably a similar problem as above; skip this test
722 return
Brett Cannon01668a12005-03-11 00:04:17 +0000723 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000724 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000725 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000726 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000727
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000728 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
729 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
730 def test_sethostname(self):
731 oldhn = socket.gethostname()
732 try:
733 socket.sethostname('new')
734 except socket.error as e:
735 if e.errno == errno.EPERM:
736 self.skipTest("test should be run as root")
737 else:
738 raise
739 try:
740 # running test as root!
741 self.assertEqual(socket.gethostname(), 'new')
742 # Should work with bytes objects too
743 socket.sethostname(b'bar')
744 self.assertEqual(socket.gethostname(), 'bar')
745 finally:
746 socket.sethostname(oldhn)
747
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700748 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
749 'socket.if_nameindex() not available.')
750 def testInterfaceNameIndex(self):
751 interfaces = socket.if_nameindex()
752 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200753 self.assertIsInstance(index, int)
754 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700755 # interface indices are non-zero integers
756 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200757 _index = socket.if_nametoindex(name)
758 self.assertIsInstance(_index, int)
759 self.assertEqual(index, _index)
760 _name = socket.if_indextoname(index)
761 self.assertIsInstance(_name, str)
762 self.assertEqual(name, _name)
763
764 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
765 'socket.if_nameindex() not available.')
766 def testInvalidInterfaceNameIndex(self):
767 # test nonexistent interface index/name
768 self.assertRaises(socket.error, socket.if_indextoname, 0)
769 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
770 # test with invalid values
771 self.assertRaises(TypeError, socket.if_nametoindex, 0)
772 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700773
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000774 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000775 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000776 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777 try:
778 # On some versions, this loses a reference
779 orig = sys.getrefcount(__name__)
780 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000781 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000782 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000784
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000786 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787 try:
788 # On some versions, this crashes the interpreter.
789 socket.getnameinfo(('x', 0, 0, 0), 0)
790 except socket.error:
791 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000792
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000793 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000794 # This just checks that htons etc. are their own inverse,
795 # when looking at the lower 16 or 32 bits.
796 sizes = {socket.htonl: 32, socket.ntohl: 32,
797 socket.htons: 16, socket.ntohs: 16}
798 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000799 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000800 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
801 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000802
Guido van Rossuma2627af2002-09-14 00:58:46 +0000803 swapped = func(mask)
804 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000805 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000806
Guido van Rossum018919a2007-01-15 00:07:32 +0000807 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000808 good_values = [ 1, 2, 3, 1, 2, 3 ]
809 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000810 for k in good_values:
811 socket.ntohl(k)
812 socket.ntohs(k)
813 socket.htonl(k)
814 socket.htons(k)
815 for k in bad_values:
816 self.assertRaises(OverflowError, socket.ntohl, k)
817 self.assertRaises(OverflowError, socket.ntohs, k)
818 self.assertRaises(OverflowError, socket.htonl, k)
819 self.assertRaises(OverflowError, socket.htons, k)
820
Barry Warsaw11b91a02004-06-28 00:50:43 +0000821 def testGetServBy(self):
822 eq = self.assertEqual
823 # Find one service that exists, then check all the related interfaces.
824 # I've ordered this by protocols that have both a tcp and udp
825 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200826 if (sys.platform.startswith(('freebsd', 'netbsd'))
827 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000828 # avoid the 'echo' service on this platform, as there is an
829 # assumption breaking non-standard port/protocol entry
830 services = ('daytime', 'qotd', 'domain')
831 else:
832 services = ('echo', 'daytime', 'domain')
833 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000834 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000835 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000836 break
837 except socket.error:
838 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000839 else:
840 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000841 # Try same call with optional protocol omitted
842 port2 = socket.getservbyname(service)
843 eq(port, port2)
844 # Try udp, but don't barf it it doesn't exist
845 try:
846 udpport = socket.getservbyname(service, 'udp')
847 except socket.error:
848 udpport = None
849 else:
850 eq(udpport, port)
851 # Now make sure the lookup by port returns the same service name
852 eq(socket.getservbyport(port2), service)
853 eq(socket.getservbyport(port, 'tcp'), service)
854 if udpport is not None:
855 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000856 # Make sure getservbyport does not accept out of range ports.
857 self.assertRaises(OverflowError, socket.getservbyport, -1)
858 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000860 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000861 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000862 # The default timeout should initially be None
863 self.assertEqual(socket.getdefaulttimeout(), None)
864 s = socket.socket()
865 self.assertEqual(s.gettimeout(), None)
866 s.close()
867
868 # Set the default timeout to 10, and see if it propagates
869 socket.setdefaulttimeout(10)
870 self.assertEqual(socket.getdefaulttimeout(), 10)
871 s = socket.socket()
872 self.assertEqual(s.gettimeout(), 10)
873 s.close()
874
875 # Reset the default timeout to None, and see if it propagates
876 socket.setdefaulttimeout(None)
877 self.assertEqual(socket.getdefaulttimeout(), None)
878 s = socket.socket()
879 self.assertEqual(s.gettimeout(), None)
880 s.close()
881
882 # Check that setting it to an invalid value raises ValueError
883 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
884
885 # Check that setting it to an invalid type raises TypeError
886 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
887
Benjamin Petersonf91df042009-02-13 02:50:59 +0000888 def testIPv4_inet_aton_fourbytes(self):
889 if not hasattr(socket, 'inet_aton'):
890 return # No inet_aton, nothing to check
891 # Test that issue1008086 and issue767150 are fixed.
892 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000893 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
894 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000895
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000896 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000897 if not hasattr(socket, 'inet_pton'):
898 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000899 from socket import inet_aton as f, inet_pton, AF_INET
900 g = lambda a: inet_pton(AF_INET, a)
901
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100902 assertInvalid = lambda func,a: self.assertRaises(
903 (socket.error, ValueError), func, a
904 )
905
Ezio Melottib3aedd42010-11-20 19:04:17 +0000906 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
907 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
908 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
909 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
910 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100911 assertInvalid(f, '0.0.0.')
912 assertInvalid(f, '300.0.0.0')
913 assertInvalid(f, 'a.0.0.0')
914 assertInvalid(f, '1.2.3.4.5')
915 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000916
Ezio Melottib3aedd42010-11-20 19:04:17 +0000917 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
918 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
919 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
920 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100921 assertInvalid(g, '0.0.0.')
922 assertInvalid(g, '300.0.0.0')
923 assertInvalid(g, 'a.0.0.0')
924 assertInvalid(g, '1.2.3.4.5')
925 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000926
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000927 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000928 if not hasattr(socket, 'inet_pton'):
929 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000930 try:
931 from socket import inet_pton, AF_INET6, has_ipv6
932 if not has_ipv6:
933 return
934 except ImportError:
935 return
936 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100937 assertInvalid = lambda a: self.assertRaises(
938 (socket.error, ValueError), f, a
939 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000940
Ezio Melottib3aedd42010-11-20 19:04:17 +0000941 self.assertEqual(b'\x00' * 16, f('::'))
942 self.assertEqual(b'\x00' * 16, f('0::0'))
943 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
944 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000945 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 +0000946 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
947 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100948 self.assertEqual(
949 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
950 f('ad42:abc::127:0:254:2')
951 )
952 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
953 assertInvalid('0x20::')
954 assertInvalid(':::')
955 assertInvalid('::0::')
956 assertInvalid('1::abc::')
957 assertInvalid('1::abc::def')
958 assertInvalid('1:2:3:4:5:6:')
959 assertInvalid('1:2:3:4:5:6')
960 assertInvalid('1:2:3:4:5:6:7:8:')
961 assertInvalid('1:2:3:4:5:6:7:8:0')
962
963 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
964 f('::254.42.23.64')
965 )
966 self.assertEqual(
967 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
968 f('42::a29b:254.42.23.64')
969 )
970 self.assertEqual(
971 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
972 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
973 )
974 assertInvalid('255.254.253.252')
975 assertInvalid('1::260.2.3.0')
976 assertInvalid('1::0.be.e.0')
977 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
978 assertInvalid('::1.2.3.4:0')
979 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +0000980
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000981 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000982 if not hasattr(socket, 'inet_ntop'):
983 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000984 from socket import inet_ntoa as f, inet_ntop, AF_INET
985 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100986 assertInvalid = lambda func,a: self.assertRaises(
987 (socket.error, ValueError), func, a
988 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000989
Ezio Melottib3aedd42010-11-20 19:04:17 +0000990 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
991 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
992 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
993 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100994 assertInvalid(f, b'\x00' * 3)
995 assertInvalid(f, b'\x00' * 5)
996 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +0000997
Ezio Melottib3aedd42010-11-20 19:04:17 +0000998 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
999 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1000 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001001 assertInvalid(g, b'\x00' * 3)
1002 assertInvalid(g, b'\x00' * 5)
1003 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001004
1005 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001006 if not hasattr(socket, 'inet_ntop'):
1007 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001008 try:
1009 from socket import inet_ntop, AF_INET6, has_ipv6
1010 if not has_ipv6:
1011 return
1012 except ImportError:
1013 return
1014 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001015 assertInvalid = lambda a: self.assertRaises(
1016 (socket.error, ValueError), f, a
1017 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001018
Ezio Melottib3aedd42010-11-20 19:04:17 +00001019 self.assertEqual('::', f(b'\x00' * 16))
1020 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1021 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001022 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001023 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 +00001024 )
1025
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001026 assertInvalid(b'\x12' * 15)
1027 assertInvalid(b'\x12' * 17)
1028 assertInvalid(b'\x12' * 4)
1029
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001030 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001031
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001032 def testSockName(self):
1033 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001034 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001035 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001036 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001037 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001038 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001039 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1040 # it reasonable to get the host's addr in addition to 0.0.0.0.
1041 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001042 try:
1043 my_ip_addr = socket.gethostbyname(socket.gethostname())
1044 except socket.error:
1045 # Probably name lookup wasn't set up right; skip this test
1046 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001047 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001048 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001049
1050 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001051 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001052 # We know a socket should start without reuse==0
1053 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001054 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001056 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001057
1058 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001059 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001060 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001061 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001062 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1063 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001064 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001065
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001066 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001067 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001068 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1069 sock.settimeout(1)
1070 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001071 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001072
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073 def testNewAttributes(self):
1074 # testing .family, .type and .protocol
1075 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1076 self.assertEqual(sock.family, socket.AF_INET)
1077 self.assertEqual(sock.type, socket.SOCK_STREAM)
1078 self.assertEqual(sock.proto, 0)
1079 sock.close()
1080
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001081 def test_getsockaddrarg(self):
1082 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001083 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001084 big_port = port + 65536
1085 neg_port = port - 65536
1086 sock = socket.socket()
1087 try:
1088 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1089 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1090 sock.bind((host, port))
1091 finally:
1092 sock.close()
1093
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001094 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001095 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001096 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1097 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1098 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1099 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001100 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1101 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001102 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001103 self.assertRaises(ValueError, s.ioctl, -1, None)
1104 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001105
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001106 def testGetaddrinfo(self):
1107 try:
1108 socket.getaddrinfo('localhost', 80)
1109 except socket.gaierror as err:
1110 if err.errno == socket.EAI_SERVICE:
1111 # see http://bugs.python.org/issue1282647
1112 self.skipTest("buggy libc version")
1113 raise
1114 # len of every sequence is supposed to be == 5
1115 for info in socket.getaddrinfo(HOST, None):
1116 self.assertEqual(len(info), 5)
1117 # host can be a domain name, a string representation of an
1118 # IPv4/v6 address or None
1119 socket.getaddrinfo('localhost', 80)
1120 socket.getaddrinfo('127.0.0.1', 80)
1121 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001122 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001123 socket.getaddrinfo('::1', 80)
1124 # port can be a string service name such as "http", a numeric
1125 # port number or None
1126 socket.getaddrinfo(HOST, "http")
1127 socket.getaddrinfo(HOST, 80)
1128 socket.getaddrinfo(HOST, None)
1129 # test family and socktype filters
1130 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1131 for family, _, _, _, _ in infos:
1132 self.assertEqual(family, socket.AF_INET)
1133 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1134 for _, socktype, _, _, _ in infos:
1135 self.assertEqual(socktype, socket.SOCK_STREAM)
1136 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001137 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001138 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1139 # a server willing to support both IPv4 and IPv6 will
1140 # usually do this
1141 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1142 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001143 # test keyword arguments
1144 a = socket.getaddrinfo(HOST, None)
1145 b = socket.getaddrinfo(host=HOST, port=None)
1146 self.assertEqual(a, b)
1147 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1148 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1149 self.assertEqual(a, b)
1150 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1151 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1152 self.assertEqual(a, b)
1153 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1154 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1155 self.assertEqual(a, b)
1156 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1157 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1158 self.assertEqual(a, b)
1159 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1160 socket.AI_PASSIVE)
1161 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1162 type=socket.SOCK_STREAM, proto=0,
1163 flags=socket.AI_PASSIVE)
1164 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001165 # Issue #6697.
1166 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001167
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001168 def test_getnameinfo(self):
1169 # only IP addresses are allowed
1170 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1171
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001172 @unittest.skipUnless(support.is_resource_enabled('network'),
1173 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001174 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001175 # Check for internet access before running test (issue #12804).
1176 try:
1177 socket.gethostbyname('python.org')
1178 except socket.gaierror as e:
1179 if e.errno == socket.EAI_NODATA:
1180 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001181 # these should all be successful
1182 socket.gethostbyname('испытание.python.org')
1183 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001184 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1185 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1186 # have a reverse entry yet
1187 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001188
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001189 def check_sendall_interrupted(self, with_timeout):
1190 # socketpair() is not stricly required, but it makes things easier.
1191 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1192 self.skipTest("signal.alarm and socket.socketpair required for this test")
1193 # Our signal handlers clobber the C errno by calling a math function
1194 # with an invalid domain value.
1195 def ok_handler(*args):
1196 self.assertRaises(ValueError, math.acosh, 0)
1197 def raising_handler(*args):
1198 self.assertRaises(ValueError, math.acosh, 0)
1199 1 // 0
1200 c, s = socket.socketpair()
1201 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1202 try:
1203 if with_timeout:
1204 # Just above the one second minimum for signal.alarm
1205 c.settimeout(1.5)
1206 with self.assertRaises(ZeroDivisionError):
1207 signal.alarm(1)
1208 c.sendall(b"x" * (1024**2))
1209 if with_timeout:
1210 signal.signal(signal.SIGALRM, ok_handler)
1211 signal.alarm(1)
1212 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1213 finally:
1214 signal.signal(signal.SIGALRM, old_alarm)
1215 c.close()
1216 s.close()
1217
1218 def test_sendall_interrupted(self):
1219 self.check_sendall_interrupted(False)
1220
1221 def test_sendall_interrupted_with_timeout(self):
1222 self.check_sendall_interrupted(True)
1223
Antoine Pitroue033e062010-10-29 10:38:18 +00001224 def test_dealloc_warn(self):
1225 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1226 r = repr(sock)
1227 with self.assertWarns(ResourceWarning) as cm:
1228 sock = None
1229 support.gc_collect()
1230 self.assertIn(r, str(cm.warning.args[0]))
1231 # An open socket file object gets dereferenced after the socket
1232 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1233 f = sock.makefile('rb')
1234 r = repr(sock)
1235 sock = None
1236 support.gc_collect()
1237 with self.assertWarns(ResourceWarning):
1238 f = None
1239 support.gc_collect()
1240
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001241 def test_name_closed_socketio(self):
1242 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1243 fp = sock.makefile("rb")
1244 fp.close()
1245 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1246
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001247 def test_pickle(self):
1248 sock = socket.socket()
1249 with sock:
1250 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1251 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1252
Antoine Pitrou3cade992011-05-10 19:19:13 +02001253 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001254 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1255 srv.bind((HOST, 0))
1256 # backlog = 0
1257 srv.listen(0)
1258 srv.close()
1259
Charles-François Natali42663332012-01-02 15:57:30 +01001260 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001261 def test_flowinfo(self):
1262 self.assertRaises(OverflowError, socket.getnameinfo,
1263 ('::1',0, 0xffffffff), 0)
1264 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1265 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1266
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001267
Charles-François Natali47413c12011-10-06 19:47:44 +02001268@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1269class BasicCANTest(unittest.TestCase):
1270
1271 def testCrucialConstants(self):
1272 socket.AF_CAN
1273 socket.PF_CAN
1274 socket.CAN_RAW
1275
1276 def testCreateSocket(self):
1277 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1278 pass
1279
1280 def testBindAny(self):
1281 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1282 s.bind(('', ))
1283
1284 def testTooLongInterfaceName(self):
1285 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1286 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001287 self.assertRaisesRegex(socket.error, 'interface name too long',
1288 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001289
1290 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1291 'socket.CAN_RAW_LOOPBACK required for this test.')
1292 def testLoopback(self):
1293 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1294 for loopback in (0, 1):
1295 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1296 loopback)
1297 self.assertEqual(loopback,
1298 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1299
1300 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1301 'socket.CAN_RAW_FILTER required for this test.')
1302 def testFilter(self):
1303 can_id, can_mask = 0x200, 0x700
1304 can_filter = struct.pack("=II", can_id, can_mask)
1305 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1306 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1307 self.assertEqual(can_filter,
1308 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1309
1310
1311@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1312@unittest.skipUnless(thread, 'Threading required for this test.')
1313class CANTest(ThreadedCANSocketTest):
1314
1315 """The CAN frame structure is defined in <linux/can.h>:
1316
1317 struct can_frame {
1318 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1319 __u8 can_dlc; /* data length code: 0 .. 8 */
1320 __u8 data[8] __attribute__((aligned(8)));
1321 };
1322 """
1323 can_frame_fmt = "=IB3x8s"
1324
1325 def __init__(self, methodName='runTest'):
1326 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1327
1328 @classmethod
1329 def build_can_frame(cls, can_id, data):
1330 """Build a CAN frame."""
1331 can_dlc = len(data)
1332 data = data.ljust(8, b'\x00')
1333 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1334
1335 @classmethod
1336 def dissect_can_frame(cls, frame):
1337 """Dissect a CAN frame."""
1338 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1339 return (can_id, can_dlc, data[:can_dlc])
1340
1341 def testSendFrame(self):
1342 cf, addr = self.s.recvfrom(self.bufsize)
1343 self.assertEqual(self.cf, cf)
1344 self.assertEqual(addr[0], self.interface)
1345 self.assertEqual(addr[1], socket.AF_CAN)
1346
1347 def _testSendFrame(self):
1348 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1349 self.cli.send(self.cf)
1350
1351 def testSendMaxFrame(self):
1352 cf, addr = self.s.recvfrom(self.bufsize)
1353 self.assertEqual(self.cf, cf)
1354
1355 def _testSendMaxFrame(self):
1356 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1357 self.cli.send(self.cf)
1358
1359 def testSendMultiFrames(self):
1360 cf, addr = self.s.recvfrom(self.bufsize)
1361 self.assertEqual(self.cf1, cf)
1362
1363 cf, addr = self.s.recvfrom(self.bufsize)
1364 self.assertEqual(self.cf2, cf)
1365
1366 def _testSendMultiFrames(self):
1367 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1368 self.cli.send(self.cf1)
1369
1370 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1371 self.cli.send(self.cf2)
1372
1373
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001374@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1375class BasicRDSTest(unittest.TestCase):
1376
1377 def testCrucialConstants(self):
1378 socket.AF_RDS
1379 socket.PF_RDS
1380
1381 def testCreateSocket(self):
1382 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1383 pass
1384
1385 def testSocketBufferSize(self):
1386 bufsize = 16384
1387 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1388 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1389 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1390
1391
1392@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1393@unittest.skipUnless(thread, 'Threading required for this test.')
1394class RDSTest(ThreadedRDSSocketTest):
1395
1396 def __init__(self, methodName='runTest'):
1397 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1398
Charles-François Natali240c55f2011-11-10 20:33:36 +01001399 def setUp(self):
1400 super().setUp()
1401 self.evt = threading.Event()
1402
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001403 def testSendAndRecv(self):
1404 data, addr = self.serv.recvfrom(self.bufsize)
1405 self.assertEqual(self.data, data)
1406 self.assertEqual(self.cli_addr, addr)
1407
1408 def _testSendAndRecv(self):
1409 self.data = b'spam'
1410 self.cli.sendto(self.data, 0, (HOST, self.port))
1411
1412 def testPeek(self):
1413 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1414 self.assertEqual(self.data, data)
1415 data, addr = self.serv.recvfrom(self.bufsize)
1416 self.assertEqual(self.data, data)
1417
1418 def _testPeek(self):
1419 self.data = b'spam'
1420 self.cli.sendto(self.data, 0, (HOST, self.port))
1421
1422 @requireAttrs(socket.socket, 'recvmsg')
1423 def testSendAndRecvMsg(self):
1424 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1425 self.assertEqual(self.data, data)
1426
1427 @requireAttrs(socket.socket, 'sendmsg')
1428 def _testSendAndRecvMsg(self):
1429 self.data = b'hello ' * 10
1430 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1431
1432 def testSendAndRecvMulti(self):
1433 data, addr = self.serv.recvfrom(self.bufsize)
1434 self.assertEqual(self.data1, data)
1435
1436 data, addr = self.serv.recvfrom(self.bufsize)
1437 self.assertEqual(self.data2, data)
1438
1439 def _testSendAndRecvMulti(self):
1440 self.data1 = b'bacon'
1441 self.cli.sendto(self.data1, 0, (HOST, self.port))
1442
1443 self.data2 = b'egg'
1444 self.cli.sendto(self.data2, 0, (HOST, self.port))
1445
1446 def testSelect(self):
1447 r, w, x = select.select([self.serv], [], [], 3.0)
1448 self.assertIn(self.serv, r)
1449 data, addr = self.serv.recvfrom(self.bufsize)
1450 self.assertEqual(self.data, data)
1451
1452 def _testSelect(self):
1453 self.data = b'select'
1454 self.cli.sendto(self.data, 0, (HOST, self.port))
1455
1456 def testCongestion(self):
1457 # wait until the sender is done
1458 self.evt.wait()
1459
1460 def _testCongestion(self):
1461 # test the behavior in case of congestion
1462 self.data = b'fill'
1463 self.cli.setblocking(False)
1464 try:
1465 # try to lower the receiver's socket buffer size
1466 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1467 except OSError:
1468 pass
1469 with self.assertRaises(OSError) as cm:
1470 try:
1471 # fill the receiver's socket buffer
1472 while True:
1473 self.cli.sendto(self.data, 0, (HOST, self.port))
1474 finally:
1475 # signal the receiver we're done
1476 self.evt.set()
1477 # sendto() should have failed with ENOBUFS
1478 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1479 # and we should have received a congestion notification through poll
1480 r, w, x = select.select([self.serv], [], [], 3.0)
1481 self.assertIn(self.serv, r)
1482
1483
Victor Stinner45df8202010-04-28 22:31:17 +00001484@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001485class BasicTCPTest(SocketConnectedTest):
1486
1487 def __init__(self, methodName='runTest'):
1488 SocketConnectedTest.__init__(self, methodName=methodName)
1489
1490 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001491 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001492 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001493 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001494
1495 def _testRecv(self):
1496 self.serv_conn.send(MSG)
1497
1498 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001499 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001500 seg1 = self.cli_conn.recv(len(MSG) - 3)
1501 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001502 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001503 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001504
1505 def _testOverFlowRecv(self):
1506 self.serv_conn.send(MSG)
1507
1508 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001509 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001510 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001511 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001512
1513 def _testRecvFrom(self):
1514 self.serv_conn.send(MSG)
1515
1516 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001517 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001518 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1519 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001520 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001521 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001522
1523 def _testOverFlowRecvFrom(self):
1524 self.serv_conn.send(MSG)
1525
1526 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001527 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001528 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001529 while 1:
1530 read = self.cli_conn.recv(1024)
1531 if not read:
1532 break
Guido van Rossume531e292002-08-08 20:28:34 +00001533 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001534 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001535
1536 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001537 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001538 self.serv_conn.sendall(big_chunk)
1539
1540 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001541 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001542 fd = self.cli_conn.fileno()
1543 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001544 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001545 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001546 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001547 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001548
1549 def _testFromFd(self):
1550 self.serv_conn.send(MSG)
1551
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001552 def testDup(self):
1553 # Testing dup()
1554 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001555 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001556 msg = sock.recv(1024)
1557 self.assertEqual(msg, MSG)
1558
1559 def _testDup(self):
1560 self.serv_conn.send(MSG)
1561
Guido van Rossum24e4af82002-06-12 19:18:08 +00001562 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001563 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001564 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001565 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001566 # wait for _testShutdown to finish: on OS X, when the server
1567 # closes the connection the client also becomes disconnected,
1568 # and the client's shutdown call will fail. (Issue #4397.)
1569 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001570
1571 def _testShutdown(self):
1572 self.serv_conn.send(MSG)
1573 self.serv_conn.shutdown(2)
1574
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001575 def testDetach(self):
1576 # Testing detach()
1577 fileno = self.cli_conn.fileno()
1578 f = self.cli_conn.detach()
1579 self.assertEqual(f, fileno)
1580 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001581 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001582 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1583 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001584 # ...but we can create another socket using the (still open)
1585 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001586 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001587 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001588 msg = sock.recv(1024)
1589 self.assertEqual(msg, MSG)
1590
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001591 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001592 self.serv_conn.send(MSG)
1593
Victor Stinner45df8202010-04-28 22:31:17 +00001594@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001595class BasicUDPTest(ThreadedUDPSocketTest):
1596
1597 def __init__(self, methodName='runTest'):
1598 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1599
1600 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001601 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001602 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001603 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001604
1605 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001606 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001607
Guido van Rossum1c938012002-06-12 21:17:20 +00001608 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001609 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001610 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001611 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001612
Guido van Rossum1c938012002-06-12 21:17:20 +00001613 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001614 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001615
Guido van Rossumd8faa362007-04-27 19:54:29 +00001616 def testRecvFromNegative(self):
1617 # Negative lengths passed to recvfrom should give ValueError.
1618 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1619
1620 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001621 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001622
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001623# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1624# same test code is used with different families and types of socket
1625# (e.g. stream, datagram), and tests using recvmsg() are repeated
1626# using recvmsg_into().
1627#
1628# The generic test classes such as SendmsgTests and
1629# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1630# supplied with sockets cli_sock and serv_sock representing the
1631# client's and the server's end of the connection respectively, and
1632# attributes cli_addr and serv_addr holding their (numeric where
1633# appropriate) addresses.
1634#
1635# The final concrete test classes combine these with subclasses of
1636# SocketTestBase which set up client and server sockets of a specific
1637# type, and with subclasses of SendrecvmsgBase such as
1638# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1639# sockets to cli_sock and serv_sock and override the methods and
1640# attributes of SendrecvmsgBase to fill in destination addresses if
1641# needed when sending, check for specific flags in msg_flags, etc.
1642#
1643# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1644# recvmsg_into().
1645
1646# XXX: like the other datagram (UDP) tests in this module, the code
1647# here assumes that datagram delivery on the local machine will be
1648# reliable.
1649
1650class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1651 # Base class for sendmsg()/recvmsg() tests.
1652
1653 # Time in seconds to wait before considering a test failed, or
1654 # None for no timeout. Not all tests actually set a timeout.
1655 fail_timeout = 3.0
1656
1657 def setUp(self):
1658 self.misc_event = threading.Event()
1659 super().setUp()
1660
1661 def sendToServer(self, msg):
1662 # Send msg to the server.
1663 return self.cli_sock.send(msg)
1664
1665 # Tuple of alternative default arguments for sendmsg() when called
1666 # via sendmsgToServer() (e.g. to include a destination address).
1667 sendmsg_to_server_defaults = ()
1668
1669 def sendmsgToServer(self, *args):
1670 # Call sendmsg() on self.cli_sock with the given arguments,
1671 # filling in any arguments which are not supplied with the
1672 # corresponding items of self.sendmsg_to_server_defaults, if
1673 # any.
1674 return self.cli_sock.sendmsg(
1675 *(args + self.sendmsg_to_server_defaults[len(args):]))
1676
1677 def doRecvmsg(self, sock, bufsize, *args):
1678 # Call recvmsg() on sock with given arguments and return its
1679 # result. Should be used for tests which can use either
1680 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1681 # this method with one which emulates it using recvmsg_into(),
1682 # thus allowing the same test to be used for both methods.
1683 result = sock.recvmsg(bufsize, *args)
1684 self.registerRecvmsgResult(result)
1685 return result
1686
1687 def registerRecvmsgResult(self, result):
1688 # Called by doRecvmsg() with the return value of recvmsg() or
1689 # recvmsg_into(). Can be overridden to arrange cleanup based
1690 # on the returned ancillary data, for instance.
1691 pass
1692
1693 def checkRecvmsgAddress(self, addr1, addr2):
1694 # Called to compare the received address with the address of
1695 # the peer.
1696 self.assertEqual(addr1, addr2)
1697
1698 # Flags that are normally unset in msg_flags
1699 msg_flags_common_unset = 0
1700 for name in ("MSG_CTRUNC", "MSG_OOB"):
1701 msg_flags_common_unset |= getattr(socket, name, 0)
1702
1703 # Flags that are normally set
1704 msg_flags_common_set = 0
1705
1706 # Flags set when a complete record has been received (e.g. MSG_EOR
1707 # for SCTP)
1708 msg_flags_eor_indicator = 0
1709
1710 # Flags set when a complete record has not been received
1711 # (e.g. MSG_TRUNC for datagram sockets)
1712 msg_flags_non_eor_indicator = 0
1713
1714 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1715 # Method to check the value of msg_flags returned by recvmsg[_into]().
1716 #
1717 # Checks that all bits in msg_flags_common_set attribute are
1718 # set in "flags" and all bits in msg_flags_common_unset are
1719 # unset.
1720 #
1721 # The "eor" argument specifies whether the flags should
1722 # indicate that a full record (or datagram) has been received.
1723 # If "eor" is None, no checks are done; otherwise, checks
1724 # that:
1725 #
1726 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1727 # set and all bits in msg_flags_non_eor_indicator are unset
1728 #
1729 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1730 # are set and all bits in msg_flags_eor_indicator are unset
1731 #
1732 # If "checkset" and/or "checkunset" are supplied, they require
1733 # the given bits to be set or unset respectively, overriding
1734 # what the attributes require for those bits.
1735 #
1736 # If any bits are set in "ignore", they will not be checked,
1737 # regardless of the other inputs.
1738 #
1739 # Will raise Exception if the inputs require a bit to be both
1740 # set and unset, and it is not ignored.
1741
1742 defaultset = self.msg_flags_common_set
1743 defaultunset = self.msg_flags_common_unset
1744
1745 if eor:
1746 defaultset |= self.msg_flags_eor_indicator
1747 defaultunset |= self.msg_flags_non_eor_indicator
1748 elif eor is not None:
1749 defaultset |= self.msg_flags_non_eor_indicator
1750 defaultunset |= self.msg_flags_eor_indicator
1751
1752 # Function arguments override defaults
1753 defaultset &= ~checkunset
1754 defaultunset &= ~checkset
1755
1756 # Merge arguments with remaining defaults, and check for conflicts
1757 checkset |= defaultset
1758 checkunset |= defaultunset
1759 inboth = checkset & checkunset & ~ignore
1760 if inboth:
1761 raise Exception("contradictory set, unset requirements for flags "
1762 "{0:#x}".format(inboth))
1763
1764 # Compare with given msg_flags value
1765 mask = (checkset | checkunset) & ~ignore
1766 self.assertEqual(flags & mask, checkset & mask)
1767
1768
1769class RecvmsgIntoMixin(SendrecvmsgBase):
1770 # Mixin to implement doRecvmsg() using recvmsg_into().
1771
1772 def doRecvmsg(self, sock, bufsize, *args):
1773 buf = bytearray(bufsize)
1774 result = sock.recvmsg_into([buf], *args)
1775 self.registerRecvmsgResult(result)
1776 self.assertGreaterEqual(result[0], 0)
1777 self.assertLessEqual(result[0], bufsize)
1778 return (bytes(buf[:result[0]]),) + result[1:]
1779
1780
1781class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1782 # Defines flags to be checked in msg_flags for datagram sockets.
1783
1784 @property
1785 def msg_flags_non_eor_indicator(self):
1786 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1787
1788
1789class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1790 # Defines flags to be checked in msg_flags for SCTP sockets.
1791
1792 @property
1793 def msg_flags_eor_indicator(self):
1794 return super().msg_flags_eor_indicator | socket.MSG_EOR
1795
1796
1797class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1798 # Base class for tests on connectionless-mode sockets. Users must
1799 # supply sockets on attributes cli and serv to be mapped to
1800 # cli_sock and serv_sock respectively.
1801
1802 @property
1803 def serv_sock(self):
1804 return self.serv
1805
1806 @property
1807 def cli_sock(self):
1808 return self.cli
1809
1810 @property
1811 def sendmsg_to_server_defaults(self):
1812 return ([], [], 0, self.serv_addr)
1813
1814 def sendToServer(self, msg):
1815 return self.cli_sock.sendto(msg, self.serv_addr)
1816
1817
1818class SendrecvmsgConnectedBase(SendrecvmsgBase):
1819 # Base class for tests on connected sockets. Users must supply
1820 # sockets on attributes serv_conn and cli_conn (representing the
1821 # connections *to* the server and the client), to be mapped to
1822 # cli_sock and serv_sock respectively.
1823
1824 @property
1825 def serv_sock(self):
1826 return self.cli_conn
1827
1828 @property
1829 def cli_sock(self):
1830 return self.serv_conn
1831
1832 def checkRecvmsgAddress(self, addr1, addr2):
1833 # Address is currently "unspecified" for a connected socket,
1834 # so we don't examine it
1835 pass
1836
1837
1838class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1839 # Base class to set a timeout on server's socket.
1840
1841 def setUp(self):
1842 super().setUp()
1843 self.serv_sock.settimeout(self.fail_timeout)
1844
1845
1846class SendmsgTests(SendrecvmsgServerTimeoutBase):
1847 # Tests for sendmsg() which can use any socket type and do not
1848 # involve recvmsg() or recvmsg_into().
1849
1850 def testSendmsg(self):
1851 # Send a simple message with sendmsg().
1852 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1853
1854 def _testSendmsg(self):
1855 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1856
1857 def testSendmsgDataGenerator(self):
1858 # Send from buffer obtained from a generator (not a sequence).
1859 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1860
1861 def _testSendmsgDataGenerator(self):
1862 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1863 len(MSG))
1864
1865 def testSendmsgAncillaryGenerator(self):
1866 # Gather (empty) ancillary data from a generator.
1867 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1868
1869 def _testSendmsgAncillaryGenerator(self):
1870 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1871 len(MSG))
1872
1873 def testSendmsgArray(self):
1874 # Send data from an array instead of the usual bytes object.
1875 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1876
1877 def _testSendmsgArray(self):
1878 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1879 len(MSG))
1880
1881 def testSendmsgGather(self):
1882 # Send message data from more than one buffer (gather write).
1883 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1884
1885 def _testSendmsgGather(self):
1886 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1887
1888 def testSendmsgBadArgs(self):
1889 # Check that sendmsg() rejects invalid arguments.
1890 self.assertEqual(self.serv_sock.recv(1000), b"done")
1891
1892 def _testSendmsgBadArgs(self):
1893 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1894 self.assertRaises(TypeError, self.sendmsgToServer,
1895 b"not in an iterable")
1896 self.assertRaises(TypeError, self.sendmsgToServer,
1897 object())
1898 self.assertRaises(TypeError, self.sendmsgToServer,
1899 [object()])
1900 self.assertRaises(TypeError, self.sendmsgToServer,
1901 [MSG, object()])
1902 self.assertRaises(TypeError, self.sendmsgToServer,
1903 [MSG], object())
1904 self.assertRaises(TypeError, self.sendmsgToServer,
1905 [MSG], [], object())
1906 self.assertRaises(TypeError, self.sendmsgToServer,
1907 [MSG], [], 0, object())
1908 self.sendToServer(b"done")
1909
1910 def testSendmsgBadCmsg(self):
1911 # Check that invalid ancillary data items are rejected.
1912 self.assertEqual(self.serv_sock.recv(1000), b"done")
1913
1914 def _testSendmsgBadCmsg(self):
1915 self.assertRaises(TypeError, self.sendmsgToServer,
1916 [MSG], [object()])
1917 self.assertRaises(TypeError, self.sendmsgToServer,
1918 [MSG], [(object(), 0, b"data")])
1919 self.assertRaises(TypeError, self.sendmsgToServer,
1920 [MSG], [(0, object(), b"data")])
1921 self.assertRaises(TypeError, self.sendmsgToServer,
1922 [MSG], [(0, 0, object())])
1923 self.assertRaises(TypeError, self.sendmsgToServer,
1924 [MSG], [(0, 0)])
1925 self.assertRaises(TypeError, self.sendmsgToServer,
1926 [MSG], [(0, 0, b"data", 42)])
1927 self.sendToServer(b"done")
1928
1929 @requireAttrs(socket, "CMSG_SPACE")
1930 def testSendmsgBadMultiCmsg(self):
1931 # Check that invalid ancillary data items are rejected when
1932 # more than one item is present.
1933 self.assertEqual(self.serv_sock.recv(1000), b"done")
1934
1935 @testSendmsgBadMultiCmsg.client_skip
1936 def _testSendmsgBadMultiCmsg(self):
1937 self.assertRaises(TypeError, self.sendmsgToServer,
1938 [MSG], [0, 0, b""])
1939 self.assertRaises(TypeError, self.sendmsgToServer,
1940 [MSG], [(0, 0, b""), object()])
1941 self.sendToServer(b"done")
1942
1943 def testSendmsgExcessCmsgReject(self):
1944 # Check that sendmsg() rejects excess ancillary data items
1945 # when the number that can be sent is limited.
1946 self.assertEqual(self.serv_sock.recv(1000), b"done")
1947
1948 def _testSendmsgExcessCmsgReject(self):
1949 if not hasattr(socket, "CMSG_SPACE"):
1950 # Can only send one item
1951 with self.assertRaises(socket.error) as cm:
1952 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1953 self.assertIsNone(cm.exception.errno)
1954 self.sendToServer(b"done")
1955
1956 def testSendmsgAfterClose(self):
1957 # Check that sendmsg() fails on a closed socket.
1958 pass
1959
1960 def _testSendmsgAfterClose(self):
1961 self.cli_sock.close()
1962 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1963
1964
1965class SendmsgStreamTests(SendmsgTests):
1966 # Tests for sendmsg() which require a stream socket and do not
1967 # involve recvmsg() or recvmsg_into().
1968
1969 def testSendmsgExplicitNoneAddr(self):
1970 # Check that peer address can be specified as None.
1971 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1972
1973 def _testSendmsgExplicitNoneAddr(self):
1974 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1975
1976 def testSendmsgTimeout(self):
1977 # Check that timeout works with sendmsg().
1978 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1979 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1980
1981 def _testSendmsgTimeout(self):
1982 try:
1983 self.cli_sock.settimeout(0.03)
1984 with self.assertRaises(socket.timeout):
1985 while True:
1986 self.sendmsgToServer([b"a"*512])
1987 finally:
1988 self.misc_event.set()
1989
1990 # XXX: would be nice to have more tests for sendmsg flags argument.
1991
1992 # Linux supports MSG_DONTWAIT when sending, but in general, it
1993 # only works when receiving. Could add other platforms if they
1994 # support it too.
1995 @skipWithClientIf(sys.platform not in {"linux2"},
1996 "MSG_DONTWAIT not known to work on this platform when "
1997 "sending")
1998 def testSendmsgDontWait(self):
1999 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2000 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2001 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2002
2003 @testSendmsgDontWait.client_skip
2004 def _testSendmsgDontWait(self):
2005 try:
2006 with self.assertRaises(socket.error) as cm:
2007 while True:
2008 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2009 self.assertIn(cm.exception.errno,
2010 (errno.EAGAIN, errno.EWOULDBLOCK))
2011 finally:
2012 self.misc_event.set()
2013
2014
2015class SendmsgConnectionlessTests(SendmsgTests):
2016 # Tests for sendmsg() which require a connectionless-mode
2017 # (e.g. datagram) socket, and do not involve recvmsg() or
2018 # recvmsg_into().
2019
2020 def testSendmsgNoDestAddr(self):
2021 # Check that sendmsg() fails when no destination address is
2022 # given for unconnected socket.
2023 pass
2024
2025 def _testSendmsgNoDestAddr(self):
2026 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2027 [MSG])
2028 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2029 [MSG], [], 0, None)
2030
2031
2032class RecvmsgGenericTests(SendrecvmsgBase):
2033 # Tests for recvmsg() which can also be emulated using
2034 # recvmsg_into(), and can use any socket type.
2035
2036 def testRecvmsg(self):
2037 # Receive a simple message with recvmsg[_into]().
2038 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2039 self.assertEqual(msg, MSG)
2040 self.checkRecvmsgAddress(addr, self.cli_addr)
2041 self.assertEqual(ancdata, [])
2042 self.checkFlags(flags, eor=True)
2043
2044 def _testRecvmsg(self):
2045 self.sendToServer(MSG)
2046
2047 def testRecvmsgExplicitDefaults(self):
2048 # Test recvmsg[_into]() with default arguments provided explicitly.
2049 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2050 len(MSG), 0, 0)
2051 self.assertEqual(msg, MSG)
2052 self.checkRecvmsgAddress(addr, self.cli_addr)
2053 self.assertEqual(ancdata, [])
2054 self.checkFlags(flags, eor=True)
2055
2056 def _testRecvmsgExplicitDefaults(self):
2057 self.sendToServer(MSG)
2058
2059 def testRecvmsgShorter(self):
2060 # Receive a message smaller than buffer.
2061 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2062 len(MSG) + 42)
2063 self.assertEqual(msg, MSG)
2064 self.checkRecvmsgAddress(addr, self.cli_addr)
2065 self.assertEqual(ancdata, [])
2066 self.checkFlags(flags, eor=True)
2067
2068 def _testRecvmsgShorter(self):
2069 self.sendToServer(MSG)
2070
Charles-François Natali8619cd72011-10-03 19:43:15 +02002071 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2072 # datagram is received (issue #13001).
2073 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002074 def testRecvmsgTrunc(self):
2075 # Receive part of message, check for truncation indicators.
2076 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2077 len(MSG) - 3)
2078 self.assertEqual(msg, MSG[:-3])
2079 self.checkRecvmsgAddress(addr, self.cli_addr)
2080 self.assertEqual(ancdata, [])
2081 self.checkFlags(flags, eor=False)
2082
Charles-François Natali8619cd72011-10-03 19:43:15 +02002083 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002084 def _testRecvmsgTrunc(self):
2085 self.sendToServer(MSG)
2086
2087 def testRecvmsgShortAncillaryBuf(self):
2088 # Test ancillary data buffer too small to hold any ancillary data.
2089 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2090 len(MSG), 1)
2091 self.assertEqual(msg, MSG)
2092 self.checkRecvmsgAddress(addr, self.cli_addr)
2093 self.assertEqual(ancdata, [])
2094 self.checkFlags(flags, eor=True)
2095
2096 def _testRecvmsgShortAncillaryBuf(self):
2097 self.sendToServer(MSG)
2098
2099 def testRecvmsgLongAncillaryBuf(self):
2100 # Test large ancillary data buffer.
2101 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2102 len(MSG), 10240)
2103 self.assertEqual(msg, MSG)
2104 self.checkRecvmsgAddress(addr, self.cli_addr)
2105 self.assertEqual(ancdata, [])
2106 self.checkFlags(flags, eor=True)
2107
2108 def _testRecvmsgLongAncillaryBuf(self):
2109 self.sendToServer(MSG)
2110
2111 def testRecvmsgAfterClose(self):
2112 # Check that recvmsg[_into]() fails on a closed socket.
2113 self.serv_sock.close()
2114 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2115
2116 def _testRecvmsgAfterClose(self):
2117 pass
2118
2119 def testRecvmsgTimeout(self):
2120 # Check that timeout works.
2121 try:
2122 self.serv_sock.settimeout(0.03)
2123 self.assertRaises(socket.timeout,
2124 self.doRecvmsg, self.serv_sock, len(MSG))
2125 finally:
2126 self.misc_event.set()
2127
2128 def _testRecvmsgTimeout(self):
2129 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2130
2131 @requireAttrs(socket, "MSG_PEEK")
2132 def testRecvmsgPeek(self):
2133 # Check that MSG_PEEK in flags enables examination of pending
2134 # data without consuming it.
2135
2136 # Receive part of data with MSG_PEEK.
2137 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2138 len(MSG) - 3, 0,
2139 socket.MSG_PEEK)
2140 self.assertEqual(msg, MSG[:-3])
2141 self.checkRecvmsgAddress(addr, self.cli_addr)
2142 self.assertEqual(ancdata, [])
2143 # Ignoring MSG_TRUNC here (so this test is the same for stream
2144 # and datagram sockets). Some wording in POSIX seems to
2145 # suggest that it needn't be set when peeking, but that may
2146 # just be a slip.
2147 self.checkFlags(flags, eor=False,
2148 ignore=getattr(socket, "MSG_TRUNC", 0))
2149
2150 # Receive all data with MSG_PEEK.
2151 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2152 len(MSG), 0,
2153 socket.MSG_PEEK)
2154 self.assertEqual(msg, MSG)
2155 self.checkRecvmsgAddress(addr, self.cli_addr)
2156 self.assertEqual(ancdata, [])
2157 self.checkFlags(flags, eor=True)
2158
2159 # Check that the same data can still be received normally.
2160 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2161 self.assertEqual(msg, MSG)
2162 self.checkRecvmsgAddress(addr, self.cli_addr)
2163 self.assertEqual(ancdata, [])
2164 self.checkFlags(flags, eor=True)
2165
2166 @testRecvmsgPeek.client_skip
2167 def _testRecvmsgPeek(self):
2168 self.sendToServer(MSG)
2169
2170 @requireAttrs(socket.socket, "sendmsg")
2171 def testRecvmsgFromSendmsg(self):
2172 # Test receiving with recvmsg[_into]() when message is sent
2173 # using sendmsg().
2174 self.serv_sock.settimeout(self.fail_timeout)
2175 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2176 self.assertEqual(msg, MSG)
2177 self.checkRecvmsgAddress(addr, self.cli_addr)
2178 self.assertEqual(ancdata, [])
2179 self.checkFlags(flags, eor=True)
2180
2181 @testRecvmsgFromSendmsg.client_skip
2182 def _testRecvmsgFromSendmsg(self):
2183 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2184
2185
2186class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2187 # Tests which require a stream socket and can use either recvmsg()
2188 # or recvmsg_into().
2189
2190 def testRecvmsgEOF(self):
2191 # Receive end-of-stream indicator (b"", peer socket closed).
2192 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2193 self.assertEqual(msg, b"")
2194 self.checkRecvmsgAddress(addr, self.cli_addr)
2195 self.assertEqual(ancdata, [])
2196 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2197
2198 def _testRecvmsgEOF(self):
2199 self.cli_sock.close()
2200
2201 def testRecvmsgOverflow(self):
2202 # Receive a message in more than one chunk.
2203 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2204 len(MSG) - 3)
2205 self.checkRecvmsgAddress(addr, self.cli_addr)
2206 self.assertEqual(ancdata, [])
2207 self.checkFlags(flags, eor=False)
2208
2209 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2210 self.checkRecvmsgAddress(addr, self.cli_addr)
2211 self.assertEqual(ancdata, [])
2212 self.checkFlags(flags, eor=True)
2213
2214 msg = seg1 + seg2
2215 self.assertEqual(msg, MSG)
2216
2217 def _testRecvmsgOverflow(self):
2218 self.sendToServer(MSG)
2219
2220
2221class RecvmsgTests(RecvmsgGenericTests):
2222 # Tests for recvmsg() which can use any socket type.
2223
2224 def testRecvmsgBadArgs(self):
2225 # Check that recvmsg() rejects invalid arguments.
2226 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2227 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2228 -1, 0, 0)
2229 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2230 len(MSG), -1, 0)
2231 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2232 [bytearray(10)], 0, 0)
2233 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2234 object(), 0, 0)
2235 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2236 len(MSG), object(), 0)
2237 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2238 len(MSG), 0, object())
2239
2240 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2241 self.assertEqual(msg, MSG)
2242 self.checkRecvmsgAddress(addr, self.cli_addr)
2243 self.assertEqual(ancdata, [])
2244 self.checkFlags(flags, eor=True)
2245
2246 def _testRecvmsgBadArgs(self):
2247 self.sendToServer(MSG)
2248
2249
2250class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2251 # Tests for recvmsg_into() which can use any socket type.
2252
2253 def testRecvmsgIntoBadArgs(self):
2254 # Check that recvmsg_into() rejects invalid arguments.
2255 buf = bytearray(len(MSG))
2256 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2257 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2258 len(MSG), 0, 0)
2259 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2260 buf, 0, 0)
2261 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2262 [object()], 0, 0)
2263 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2264 [b"I'm not writable"], 0, 0)
2265 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2266 [buf, object()], 0, 0)
2267 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2268 [buf], -1, 0)
2269 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2270 [buf], object(), 0)
2271 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2272 [buf], 0, object())
2273
2274 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2275 self.assertEqual(nbytes, len(MSG))
2276 self.assertEqual(buf, bytearray(MSG))
2277 self.checkRecvmsgAddress(addr, self.cli_addr)
2278 self.assertEqual(ancdata, [])
2279 self.checkFlags(flags, eor=True)
2280
2281 def _testRecvmsgIntoBadArgs(self):
2282 self.sendToServer(MSG)
2283
2284 def testRecvmsgIntoGenerator(self):
2285 # Receive into buffer obtained from a generator (not a sequence).
2286 buf = bytearray(len(MSG))
2287 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2288 (o for o in [buf]))
2289 self.assertEqual(nbytes, len(MSG))
2290 self.assertEqual(buf, bytearray(MSG))
2291 self.checkRecvmsgAddress(addr, self.cli_addr)
2292 self.assertEqual(ancdata, [])
2293 self.checkFlags(flags, eor=True)
2294
2295 def _testRecvmsgIntoGenerator(self):
2296 self.sendToServer(MSG)
2297
2298 def testRecvmsgIntoArray(self):
2299 # Receive into an array rather than the usual bytearray.
2300 buf = array.array("B", [0] * len(MSG))
2301 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2302 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002303 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002304 self.checkRecvmsgAddress(addr, self.cli_addr)
2305 self.assertEqual(ancdata, [])
2306 self.checkFlags(flags, eor=True)
2307
2308 def _testRecvmsgIntoArray(self):
2309 self.sendToServer(MSG)
2310
2311 def testRecvmsgIntoScatter(self):
2312 # Receive into multiple buffers (scatter write).
2313 b1 = bytearray(b"----")
2314 b2 = bytearray(b"0123456789")
2315 b3 = bytearray(b"--------------")
2316 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2317 [b1, memoryview(b2)[2:9], b3])
2318 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2319 self.assertEqual(b1, bytearray(b"Mary"))
2320 self.assertEqual(b2, bytearray(b"01 had a 9"))
2321 self.assertEqual(b3, bytearray(b"little lamb---"))
2322 self.checkRecvmsgAddress(addr, self.cli_addr)
2323 self.assertEqual(ancdata, [])
2324 self.checkFlags(flags, eor=True)
2325
2326 def _testRecvmsgIntoScatter(self):
2327 self.sendToServer(b"Mary had a little lamb")
2328
2329
2330class CmsgMacroTests(unittest.TestCase):
2331 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2332 # assumptions used by sendmsg() and recvmsg[_into](), which share
2333 # code with these functions.
2334
2335 # Match the definition in socketmodule.c
2336 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2337
2338 @requireAttrs(socket, "CMSG_LEN")
2339 def testCMSG_LEN(self):
2340 # Test CMSG_LEN() with various valid and invalid values,
2341 # checking the assumptions used by recvmsg() and sendmsg().
2342 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2343 values = list(range(257)) + list(range(toobig - 257, toobig))
2344
2345 # struct cmsghdr has at least three members, two of which are ints
2346 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2347 for n in values:
2348 ret = socket.CMSG_LEN(n)
2349 # This is how recvmsg() calculates the data size
2350 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2351 self.assertLessEqual(ret, self.socklen_t_limit)
2352
2353 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2354 # sendmsg() shares code with these functions, and requires
2355 # that it reject values over the limit.
2356 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2357 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2358
2359 @requireAttrs(socket, "CMSG_SPACE")
2360 def testCMSG_SPACE(self):
2361 # Test CMSG_SPACE() with various valid and invalid values,
2362 # checking the assumptions used by sendmsg().
2363 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2364 values = list(range(257)) + list(range(toobig - 257, toobig))
2365
2366 last = socket.CMSG_SPACE(0)
2367 # struct cmsghdr has at least three members, two of which are ints
2368 self.assertGreater(last, array.array("i").itemsize * 2)
2369 for n in values:
2370 ret = socket.CMSG_SPACE(n)
2371 self.assertGreaterEqual(ret, last)
2372 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2373 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2374 self.assertLessEqual(ret, self.socklen_t_limit)
2375 last = ret
2376
2377 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2378 # sendmsg() shares code with these functions, and requires
2379 # that it reject values over the limit.
2380 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2381 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2382
2383
2384class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2385 # Tests for file descriptor passing on Unix-domain sockets.
2386
2387 # Invalid file descriptor value that's unlikely to evaluate to a
2388 # real FD even if one of its bytes is replaced with a different
2389 # value (which shouldn't actually happen).
2390 badfd = -0x5555
2391
2392 def newFDs(self, n):
2393 # Return a list of n file descriptors for newly-created files
2394 # containing their list indices as ASCII numbers.
2395 fds = []
2396 for i in range(n):
2397 fd, path = tempfile.mkstemp()
2398 self.addCleanup(os.unlink, path)
2399 self.addCleanup(os.close, fd)
2400 os.write(fd, str(i).encode())
2401 fds.append(fd)
2402 return fds
2403
2404 def checkFDs(self, fds):
2405 # Check that the file descriptors in the given list contain
2406 # their correct list indices as ASCII numbers.
2407 for n, fd in enumerate(fds):
2408 os.lseek(fd, 0, os.SEEK_SET)
2409 self.assertEqual(os.read(fd, 1024), str(n).encode())
2410
2411 def registerRecvmsgResult(self, result):
2412 self.addCleanup(self.closeRecvmsgFDs, result)
2413
2414 def closeRecvmsgFDs(self, recvmsg_result):
2415 # Close all file descriptors specified in the ancillary data
2416 # of the given return value from recvmsg() or recvmsg_into().
2417 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2418 if (cmsg_level == socket.SOL_SOCKET and
2419 cmsg_type == socket.SCM_RIGHTS):
2420 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002421 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002422 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2423 for fd in fds:
2424 os.close(fd)
2425
2426 def createAndSendFDs(self, n):
2427 # Send n new file descriptors created by newFDs() to the
2428 # server, with the constant MSG as the non-ancillary data.
2429 self.assertEqual(
2430 self.sendmsgToServer([MSG],
2431 [(socket.SOL_SOCKET,
2432 socket.SCM_RIGHTS,
2433 array.array("i", self.newFDs(n)))]),
2434 len(MSG))
2435
2436 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2437 # Check that constant MSG was received with numfds file
2438 # descriptors in a maximum of maxcmsgs control messages (which
2439 # must contain only complete integers). By default, check
2440 # that MSG_CTRUNC is unset, but ignore any flags in
2441 # ignoreflags.
2442 msg, ancdata, flags, addr = result
2443 self.assertEqual(msg, MSG)
2444 self.checkRecvmsgAddress(addr, self.cli_addr)
2445 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2446 ignore=ignoreflags)
2447
2448 self.assertIsInstance(ancdata, list)
2449 self.assertLessEqual(len(ancdata), maxcmsgs)
2450 fds = array.array("i")
2451 for item in ancdata:
2452 self.assertIsInstance(item, tuple)
2453 cmsg_level, cmsg_type, cmsg_data = item
2454 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2455 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2456 self.assertIsInstance(cmsg_data, bytes)
2457 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002458 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002459
2460 self.assertEqual(len(fds), numfds)
2461 self.checkFDs(fds)
2462
2463 def testFDPassSimple(self):
2464 # Pass a single FD (array read from bytes object).
2465 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2466 len(MSG), 10240))
2467
2468 def _testFDPassSimple(self):
2469 self.assertEqual(
2470 self.sendmsgToServer(
2471 [MSG],
2472 [(socket.SOL_SOCKET,
2473 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002474 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002475 len(MSG))
2476
2477 def testMultipleFDPass(self):
2478 # Pass multiple FDs in a single array.
2479 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2480 len(MSG), 10240))
2481
2482 def _testMultipleFDPass(self):
2483 self.createAndSendFDs(4)
2484
2485 @requireAttrs(socket, "CMSG_SPACE")
2486 def testFDPassCMSG_SPACE(self):
2487 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2488 self.checkRecvmsgFDs(
2489 4, self.doRecvmsg(self.serv_sock, len(MSG),
2490 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2491
2492 @testFDPassCMSG_SPACE.client_skip
2493 def _testFDPassCMSG_SPACE(self):
2494 self.createAndSendFDs(4)
2495
2496 def testFDPassCMSG_LEN(self):
2497 # Test using CMSG_LEN() to calculate ancillary buffer size.
2498 self.checkRecvmsgFDs(1,
2499 self.doRecvmsg(self.serv_sock, len(MSG),
2500 socket.CMSG_LEN(4 * SIZEOF_INT)),
2501 # RFC 3542 says implementations may set
2502 # MSG_CTRUNC if there isn't enough space
2503 # for trailing padding.
2504 ignoreflags=socket.MSG_CTRUNC)
2505
2506 def _testFDPassCMSG_LEN(self):
2507 self.createAndSendFDs(1)
2508
Nick Coghlan2496f332011-09-19 20:26:31 +10002509 # Issue #12958: The following test has problems on Mac OS X
2510 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002511 @requireAttrs(socket, "CMSG_SPACE")
2512 def testFDPassSeparate(self):
2513 # Pass two FDs in two separate arrays. Arrays may be combined
2514 # into a single control message by the OS.
2515 self.checkRecvmsgFDs(2,
2516 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2517 maxcmsgs=2)
2518
2519 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002520 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002521 def _testFDPassSeparate(self):
2522 fd0, fd1 = self.newFDs(2)
2523 self.assertEqual(
2524 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2525 socket.SCM_RIGHTS,
2526 array.array("i", [fd0])),
2527 (socket.SOL_SOCKET,
2528 socket.SCM_RIGHTS,
2529 array.array("i", [fd1]))]),
2530 len(MSG))
2531
Nick Coghlan2496f332011-09-19 20:26:31 +10002532 # Issue #12958: The following test has problems on Mac OS X
2533 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002534 @requireAttrs(socket, "CMSG_SPACE")
2535 def testFDPassSeparateMinSpace(self):
2536 # Pass two FDs in two separate arrays, receiving them into the
2537 # minimum space for two arrays.
2538 self.checkRecvmsgFDs(2,
2539 self.doRecvmsg(self.serv_sock, len(MSG),
2540 socket.CMSG_SPACE(SIZEOF_INT) +
2541 socket.CMSG_LEN(SIZEOF_INT)),
2542 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2543
2544 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002545 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002546 def _testFDPassSeparateMinSpace(self):
2547 fd0, fd1 = self.newFDs(2)
2548 self.assertEqual(
2549 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2550 socket.SCM_RIGHTS,
2551 array.array("i", [fd0])),
2552 (socket.SOL_SOCKET,
2553 socket.SCM_RIGHTS,
2554 array.array("i", [fd1]))]),
2555 len(MSG))
2556
2557 def sendAncillaryIfPossible(self, msg, ancdata):
2558 # Try to send msg and ancdata to server, but if the system
2559 # call fails, just send msg with no ancillary data.
2560 try:
2561 nbytes = self.sendmsgToServer([msg], ancdata)
2562 except socket.error as e:
2563 # Check that it was the system call that failed
2564 self.assertIsInstance(e.errno, int)
2565 nbytes = self.sendmsgToServer([msg])
2566 self.assertEqual(nbytes, len(msg))
2567
2568 def testFDPassEmpty(self):
2569 # Try to pass an empty FD array. Can receive either no array
2570 # or an empty array.
2571 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2572 len(MSG), 10240),
2573 ignoreflags=socket.MSG_CTRUNC)
2574
2575 def _testFDPassEmpty(self):
2576 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2577 socket.SCM_RIGHTS,
2578 b"")])
2579
2580 def testFDPassPartialInt(self):
2581 # Try to pass a truncated FD array.
2582 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2583 len(MSG), 10240)
2584 self.assertEqual(msg, MSG)
2585 self.checkRecvmsgAddress(addr, self.cli_addr)
2586 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2587 self.assertLessEqual(len(ancdata), 1)
2588 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2589 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2590 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2591 self.assertLess(len(cmsg_data), SIZEOF_INT)
2592
2593 def _testFDPassPartialInt(self):
2594 self.sendAncillaryIfPossible(
2595 MSG,
2596 [(socket.SOL_SOCKET,
2597 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002598 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002599
2600 @requireAttrs(socket, "CMSG_SPACE")
2601 def testFDPassPartialIntInMiddle(self):
2602 # Try to pass two FD arrays, the first of which is truncated.
2603 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2604 len(MSG), 10240)
2605 self.assertEqual(msg, MSG)
2606 self.checkRecvmsgAddress(addr, self.cli_addr)
2607 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2608 self.assertLessEqual(len(ancdata), 2)
2609 fds = array.array("i")
2610 # Arrays may have been combined in a single control message
2611 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2612 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2613 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002614 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002615 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2616 self.assertLessEqual(len(fds), 2)
2617 self.checkFDs(fds)
2618
2619 @testFDPassPartialIntInMiddle.client_skip
2620 def _testFDPassPartialIntInMiddle(self):
2621 fd0, fd1 = self.newFDs(2)
2622 self.sendAncillaryIfPossible(
2623 MSG,
2624 [(socket.SOL_SOCKET,
2625 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002626 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002627 (socket.SOL_SOCKET,
2628 socket.SCM_RIGHTS,
2629 array.array("i", [fd1]))])
2630
2631 def checkTruncatedHeader(self, result, ignoreflags=0):
2632 # Check that no ancillary data items are returned when data is
2633 # truncated inside the cmsghdr structure.
2634 msg, ancdata, flags, addr = result
2635 self.assertEqual(msg, MSG)
2636 self.checkRecvmsgAddress(addr, self.cli_addr)
2637 self.assertEqual(ancdata, [])
2638 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2639 ignore=ignoreflags)
2640
2641 def testCmsgTruncNoBufSize(self):
2642 # Check that no ancillary data is received when no buffer size
2643 # is specified.
2644 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2645 # BSD seems to set MSG_CTRUNC only
2646 # if an item has been partially
2647 # received.
2648 ignoreflags=socket.MSG_CTRUNC)
2649
2650 def _testCmsgTruncNoBufSize(self):
2651 self.createAndSendFDs(1)
2652
2653 def testCmsgTrunc0(self):
2654 # Check that no ancillary data is received when buffer size is 0.
2655 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2656 ignoreflags=socket.MSG_CTRUNC)
2657
2658 def _testCmsgTrunc0(self):
2659 self.createAndSendFDs(1)
2660
2661 # Check that no ancillary data is returned for various non-zero
2662 # (but still too small) buffer sizes.
2663
2664 def testCmsgTrunc1(self):
2665 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2666
2667 def _testCmsgTrunc1(self):
2668 self.createAndSendFDs(1)
2669
2670 def testCmsgTrunc2Int(self):
2671 # The cmsghdr structure has at least three members, two of
2672 # which are ints, so we still shouldn't see any ancillary
2673 # data.
2674 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2675 SIZEOF_INT * 2))
2676
2677 def _testCmsgTrunc2Int(self):
2678 self.createAndSendFDs(1)
2679
2680 def testCmsgTruncLen0Minus1(self):
2681 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2682 socket.CMSG_LEN(0) - 1))
2683
2684 def _testCmsgTruncLen0Minus1(self):
2685 self.createAndSendFDs(1)
2686
2687 # The following tests try to truncate the control message in the
2688 # middle of the FD array.
2689
2690 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2691 # Check that file descriptor data is truncated to between
2692 # mindata and maxdata bytes when received with buffer size
2693 # ancbuf, and that any complete file descriptor numbers are
2694 # valid.
2695 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2696 len(MSG), ancbuf)
2697 self.assertEqual(msg, MSG)
2698 self.checkRecvmsgAddress(addr, self.cli_addr)
2699 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2700
2701 if mindata == 0 and ancdata == []:
2702 return
2703 self.assertEqual(len(ancdata), 1)
2704 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2705 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2706 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2707 self.assertGreaterEqual(len(cmsg_data), mindata)
2708 self.assertLessEqual(len(cmsg_data), maxdata)
2709 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002710 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002711 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2712 self.checkFDs(fds)
2713
2714 def testCmsgTruncLen0(self):
2715 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2716
2717 def _testCmsgTruncLen0(self):
2718 self.createAndSendFDs(1)
2719
2720 def testCmsgTruncLen0Plus1(self):
2721 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2722
2723 def _testCmsgTruncLen0Plus1(self):
2724 self.createAndSendFDs(2)
2725
2726 def testCmsgTruncLen1(self):
2727 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2728 maxdata=SIZEOF_INT)
2729
2730 def _testCmsgTruncLen1(self):
2731 self.createAndSendFDs(2)
2732
2733 def testCmsgTruncLen2Minus1(self):
2734 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2735 maxdata=(2 * SIZEOF_INT) - 1)
2736
2737 def _testCmsgTruncLen2Minus1(self):
2738 self.createAndSendFDs(2)
2739
2740
2741class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2742 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2743 # features of the RFC 3542 Advanced Sockets API for IPv6.
2744 # Currently we can only handle certain data items (e.g. traffic
2745 # class, hop limit, MTU discovery and fragmentation settings)
2746 # without resorting to unportable means such as the struct module,
2747 # but the tests here are aimed at testing the ancillary data
2748 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2749 # itself.
2750
2751 # Test value to use when setting hop limit of packet
2752 hop_limit = 2
2753
2754 # Test value to use when setting traffic class of packet.
2755 # -1 means "use kernel default".
2756 traffic_class = -1
2757
2758 def ancillaryMapping(self, ancdata):
2759 # Given ancillary data list ancdata, return a mapping from
2760 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2761 # Check that no (level, type) pair appears more than once.
2762 d = {}
2763 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2764 self.assertNotIn((cmsg_level, cmsg_type), d)
2765 d[(cmsg_level, cmsg_type)] = cmsg_data
2766 return d
2767
2768 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2769 # Receive hop limit into ancbufsize bytes of ancillary data
2770 # space. Check that data is MSG, ancillary data is not
2771 # truncated (but ignore any flags in ignoreflags), and hop
2772 # limit is between 0 and maxhop inclusive.
2773 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2774 socket.IPV6_RECVHOPLIMIT, 1)
2775 self.misc_event.set()
2776 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2777 len(MSG), ancbufsize)
2778
2779 self.assertEqual(msg, MSG)
2780 self.checkRecvmsgAddress(addr, self.cli_addr)
2781 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2782 ignore=ignoreflags)
2783
2784 self.assertEqual(len(ancdata), 1)
2785 self.assertIsInstance(ancdata[0], tuple)
2786 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2787 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2788 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2789 self.assertIsInstance(cmsg_data, bytes)
2790 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2791 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002792 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002793 self.assertGreaterEqual(a[0], 0)
2794 self.assertLessEqual(a[0], maxhop)
2795
2796 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2797 def testRecvHopLimit(self):
2798 # Test receiving the packet hop limit as ancillary data.
2799 self.checkHopLimit(ancbufsize=10240)
2800
2801 @testRecvHopLimit.client_skip
2802 def _testRecvHopLimit(self):
2803 # Need to wait until server has asked to receive ancillary
2804 # data, as implementations are not required to buffer it
2805 # otherwise.
2806 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2807 self.sendToServer(MSG)
2808
2809 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2810 def testRecvHopLimitCMSG_SPACE(self):
2811 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2812 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2813
2814 @testRecvHopLimitCMSG_SPACE.client_skip
2815 def _testRecvHopLimitCMSG_SPACE(self):
2816 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2817 self.sendToServer(MSG)
2818
2819 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2820 # 3542 says portable applications must provide space for trailing
2821 # padding. Implementations may set MSG_CTRUNC if there isn't
2822 # enough space for the padding.
2823
2824 @requireAttrs(socket.socket, "sendmsg")
2825 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2826 def testSetHopLimit(self):
2827 # Test setting hop limit on outgoing packet and receiving it
2828 # at the other end.
2829 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2830
2831 @testSetHopLimit.client_skip
2832 def _testSetHopLimit(self):
2833 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2834 self.assertEqual(
2835 self.sendmsgToServer([MSG],
2836 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2837 array.array("i", [self.hop_limit]))]),
2838 len(MSG))
2839
2840 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2841 ignoreflags=0):
2842 # Receive traffic class and hop limit into ancbufsize bytes of
2843 # ancillary data space. Check that data is MSG, ancillary
2844 # data is not truncated (but ignore any flags in ignoreflags),
2845 # and traffic class and hop limit are in range (hop limit no
2846 # more than maxhop).
2847 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2848 socket.IPV6_RECVHOPLIMIT, 1)
2849 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2850 socket.IPV6_RECVTCLASS, 1)
2851 self.misc_event.set()
2852 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2853 len(MSG), ancbufsize)
2854
2855 self.assertEqual(msg, MSG)
2856 self.checkRecvmsgAddress(addr, self.cli_addr)
2857 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2858 ignore=ignoreflags)
2859 self.assertEqual(len(ancdata), 2)
2860 ancmap = self.ancillaryMapping(ancdata)
2861
2862 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2863 self.assertEqual(len(tcdata), SIZEOF_INT)
2864 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002865 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002866 self.assertGreaterEqual(a[0], 0)
2867 self.assertLessEqual(a[0], 255)
2868
2869 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2870 self.assertEqual(len(hldata), SIZEOF_INT)
2871 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002872 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002873 self.assertGreaterEqual(a[0], 0)
2874 self.assertLessEqual(a[0], maxhop)
2875
2876 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2877 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2878 def testRecvTrafficClassAndHopLimit(self):
2879 # Test receiving traffic class and hop limit as ancillary data.
2880 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2881
2882 @testRecvTrafficClassAndHopLimit.client_skip
2883 def _testRecvTrafficClassAndHopLimit(self):
2884 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2885 self.sendToServer(MSG)
2886
2887 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2888 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2889 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2890 # Test receiving traffic class and hop limit, using
2891 # CMSG_SPACE() to calculate buffer size.
2892 self.checkTrafficClassAndHopLimit(
2893 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2894
2895 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2896 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2897 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2898 self.sendToServer(MSG)
2899
2900 @requireAttrs(socket.socket, "sendmsg")
2901 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2902 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2903 def testSetTrafficClassAndHopLimit(self):
2904 # Test setting traffic class and hop limit on outgoing packet,
2905 # and receiving them at the other end.
2906 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2907 maxhop=self.hop_limit)
2908
2909 @testSetTrafficClassAndHopLimit.client_skip
2910 def _testSetTrafficClassAndHopLimit(self):
2911 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2912 self.assertEqual(
2913 self.sendmsgToServer([MSG],
2914 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2915 array.array("i", [self.traffic_class])),
2916 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2917 array.array("i", [self.hop_limit]))]),
2918 len(MSG))
2919
2920 @requireAttrs(socket.socket, "sendmsg")
2921 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2922 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2923 def testOddCmsgSize(self):
2924 # Try to send ancillary data with first item one byte too
2925 # long. Fall back to sending with correct size if this fails,
2926 # and check that second item was handled correctly.
2927 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2928 maxhop=self.hop_limit)
2929
2930 @testOddCmsgSize.client_skip
2931 def _testOddCmsgSize(self):
2932 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2933 try:
2934 nbytes = self.sendmsgToServer(
2935 [MSG],
2936 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002937 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002938 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2939 array.array("i", [self.hop_limit]))])
2940 except socket.error as e:
2941 self.assertIsInstance(e.errno, int)
2942 nbytes = self.sendmsgToServer(
2943 [MSG],
2944 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2945 array.array("i", [self.traffic_class])),
2946 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2947 array.array("i", [self.hop_limit]))])
2948 self.assertEqual(nbytes, len(MSG))
2949
2950 # Tests for proper handling of truncated ancillary data
2951
2952 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2953 # Receive hop limit into ancbufsize bytes of ancillary data
2954 # space, which should be too small to contain the ancillary
2955 # data header (if ancbufsize is None, pass no second argument
2956 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2957 # (unless included in ignoreflags), and no ancillary data is
2958 # returned.
2959 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2960 socket.IPV6_RECVHOPLIMIT, 1)
2961 self.misc_event.set()
2962 args = () if ancbufsize is None else (ancbufsize,)
2963 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2964 len(MSG), *args)
2965
2966 self.assertEqual(msg, MSG)
2967 self.checkRecvmsgAddress(addr, self.cli_addr)
2968 self.assertEqual(ancdata, [])
2969 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2970 ignore=ignoreflags)
2971
2972 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2973 def testCmsgTruncNoBufSize(self):
2974 # Check that no ancillary data is received when no ancillary
2975 # buffer size is provided.
2976 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2977 # BSD seems to set
2978 # MSG_CTRUNC only if an item
2979 # has been partially
2980 # received.
2981 ignoreflags=socket.MSG_CTRUNC)
2982
2983 @testCmsgTruncNoBufSize.client_skip
2984 def _testCmsgTruncNoBufSize(self):
2985 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2986 self.sendToServer(MSG)
2987
2988 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2989 def testSingleCmsgTrunc0(self):
2990 # Check that no ancillary data is received when ancillary
2991 # buffer size is zero.
2992 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2993 ignoreflags=socket.MSG_CTRUNC)
2994
2995 @testSingleCmsgTrunc0.client_skip
2996 def _testSingleCmsgTrunc0(self):
2997 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2998 self.sendToServer(MSG)
2999
3000 # Check that no ancillary data is returned for various non-zero
3001 # (but still too small) buffer sizes.
3002
3003 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3004 def testSingleCmsgTrunc1(self):
3005 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3006
3007 @testSingleCmsgTrunc1.client_skip
3008 def _testSingleCmsgTrunc1(self):
3009 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3010 self.sendToServer(MSG)
3011
3012 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3013 def testSingleCmsgTrunc2Int(self):
3014 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3015
3016 @testSingleCmsgTrunc2Int.client_skip
3017 def _testSingleCmsgTrunc2Int(self):
3018 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3019 self.sendToServer(MSG)
3020
3021 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3022 def testSingleCmsgTruncLen0Minus1(self):
3023 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3024
3025 @testSingleCmsgTruncLen0Minus1.client_skip
3026 def _testSingleCmsgTruncLen0Minus1(self):
3027 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3028 self.sendToServer(MSG)
3029
3030 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3031 def testSingleCmsgTruncInData(self):
3032 # Test truncation of a control message inside its associated
3033 # data. The message may be returned with its data truncated,
3034 # or not returned at all.
3035 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3036 socket.IPV6_RECVHOPLIMIT, 1)
3037 self.misc_event.set()
3038 msg, ancdata, flags, addr = self.doRecvmsg(
3039 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3040
3041 self.assertEqual(msg, MSG)
3042 self.checkRecvmsgAddress(addr, self.cli_addr)
3043 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3044
3045 self.assertLessEqual(len(ancdata), 1)
3046 if ancdata:
3047 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3048 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3049 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3050 self.assertLess(len(cmsg_data), SIZEOF_INT)
3051
3052 @testSingleCmsgTruncInData.client_skip
3053 def _testSingleCmsgTruncInData(self):
3054 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3055 self.sendToServer(MSG)
3056
3057 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3058 # Receive traffic class and hop limit into ancbufsize bytes of
3059 # ancillary data space, which should be large enough to
3060 # contain the first item, but too small to contain the header
3061 # of the second. Check that data is MSG, MSG_CTRUNC is set
3062 # (unless included in ignoreflags), and only one ancillary
3063 # data item is returned.
3064 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3065 socket.IPV6_RECVHOPLIMIT, 1)
3066 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3067 socket.IPV6_RECVTCLASS, 1)
3068 self.misc_event.set()
3069 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3070 len(MSG), ancbufsize)
3071
3072 self.assertEqual(msg, MSG)
3073 self.checkRecvmsgAddress(addr, self.cli_addr)
3074 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3075 ignore=ignoreflags)
3076
3077 self.assertEqual(len(ancdata), 1)
3078 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3079 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3080 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3081 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3082 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003083 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003084 self.assertGreaterEqual(a[0], 0)
3085 self.assertLessEqual(a[0], 255)
3086
3087 # Try the above test with various buffer sizes.
3088
3089 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3090 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3091 def testSecondCmsgTrunc0(self):
3092 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3093 ignoreflags=socket.MSG_CTRUNC)
3094
3095 @testSecondCmsgTrunc0.client_skip
3096 def _testSecondCmsgTrunc0(self):
3097 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3098 self.sendToServer(MSG)
3099
3100 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3101 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3102 def testSecondCmsgTrunc1(self):
3103 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3104
3105 @testSecondCmsgTrunc1.client_skip
3106 def _testSecondCmsgTrunc1(self):
3107 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3108 self.sendToServer(MSG)
3109
3110 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3111 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3112 def testSecondCmsgTrunc2Int(self):
3113 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3114 2 * SIZEOF_INT)
3115
3116 @testSecondCmsgTrunc2Int.client_skip
3117 def _testSecondCmsgTrunc2Int(self):
3118 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3119 self.sendToServer(MSG)
3120
3121 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3122 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3123 def testSecondCmsgTruncLen0Minus1(self):
3124 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3125 socket.CMSG_LEN(0) - 1)
3126
3127 @testSecondCmsgTruncLen0Minus1.client_skip
3128 def _testSecondCmsgTruncLen0Minus1(self):
3129 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3130 self.sendToServer(MSG)
3131
3132 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3133 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3134 def testSecomdCmsgTruncInData(self):
3135 # Test truncation of the second of two control messages inside
3136 # its associated data.
3137 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3138 socket.IPV6_RECVHOPLIMIT, 1)
3139 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3140 socket.IPV6_RECVTCLASS, 1)
3141 self.misc_event.set()
3142 msg, ancdata, flags, addr = self.doRecvmsg(
3143 self.serv_sock, len(MSG),
3144 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3145
3146 self.assertEqual(msg, MSG)
3147 self.checkRecvmsgAddress(addr, self.cli_addr)
3148 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3149
3150 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3151
3152 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3153 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3154 cmsg_types.remove(cmsg_type)
3155 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3156 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003157 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003158 self.assertGreaterEqual(a[0], 0)
3159 self.assertLessEqual(a[0], 255)
3160
3161 if ancdata:
3162 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3163 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3164 cmsg_types.remove(cmsg_type)
3165 self.assertLess(len(cmsg_data), SIZEOF_INT)
3166
3167 self.assertEqual(ancdata, [])
3168
3169 @testSecomdCmsgTruncInData.client_skip
3170 def _testSecomdCmsgTruncInData(self):
3171 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3172 self.sendToServer(MSG)
3173
3174
3175# Derive concrete test classes for different socket types.
3176
3177class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3178 SendrecvmsgConnectionlessBase,
3179 ThreadedSocketTestMixin, UDPTestBase):
3180 pass
3181
3182@requireAttrs(socket.socket, "sendmsg")
3183@unittest.skipUnless(thread, 'Threading required for this test.')
3184class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3185 pass
3186
3187@requireAttrs(socket.socket, "recvmsg")
3188@unittest.skipUnless(thread, 'Threading required for this test.')
3189class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3190 pass
3191
3192@requireAttrs(socket.socket, "recvmsg_into")
3193@unittest.skipUnless(thread, 'Threading required for this test.')
3194class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3195 pass
3196
3197
3198class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3199 SendrecvmsgConnectionlessBase,
3200 ThreadedSocketTestMixin, UDP6TestBase):
3201 pass
3202
3203@requireAttrs(socket.socket, "sendmsg")
3204@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3205@requireSocket("AF_INET6", "SOCK_DGRAM")
3206@unittest.skipUnless(thread, 'Threading required for this test.')
3207class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3208 pass
3209
3210@requireAttrs(socket.socket, "recvmsg")
3211@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3212@requireSocket("AF_INET6", "SOCK_DGRAM")
3213@unittest.skipUnless(thread, 'Threading required for this test.')
3214class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3215 pass
3216
3217@requireAttrs(socket.socket, "recvmsg_into")
3218@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3219@requireSocket("AF_INET6", "SOCK_DGRAM")
3220@unittest.skipUnless(thread, 'Threading required for this test.')
3221class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3222 pass
3223
3224@requireAttrs(socket.socket, "recvmsg")
3225@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3226@requireAttrs(socket, "IPPROTO_IPV6")
3227@requireSocket("AF_INET6", "SOCK_DGRAM")
3228@unittest.skipUnless(thread, 'Threading required for this test.')
3229class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3230 SendrecvmsgUDP6TestBase):
3231 pass
3232
3233@requireAttrs(socket.socket, "recvmsg_into")
3234@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3235@requireAttrs(socket, "IPPROTO_IPV6")
3236@requireSocket("AF_INET6", "SOCK_DGRAM")
3237@unittest.skipUnless(thread, 'Threading required for this test.')
3238class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3239 RFC3542AncillaryTest,
3240 SendrecvmsgUDP6TestBase):
3241 pass
3242
3243
3244class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3245 ConnectedStreamTestMixin, TCPTestBase):
3246 pass
3247
3248@requireAttrs(socket.socket, "sendmsg")
3249@unittest.skipUnless(thread, 'Threading required for this test.')
3250class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3251 pass
3252
3253@requireAttrs(socket.socket, "recvmsg")
3254@unittest.skipUnless(thread, 'Threading required for this test.')
3255class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3256 SendrecvmsgTCPTestBase):
3257 pass
3258
3259@requireAttrs(socket.socket, "recvmsg_into")
3260@unittest.skipUnless(thread, 'Threading required for this test.')
3261class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3262 SendrecvmsgTCPTestBase):
3263 pass
3264
3265
3266class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3267 SendrecvmsgConnectedBase,
3268 ConnectedStreamTestMixin, SCTPStreamBase):
3269 pass
3270
3271@requireAttrs(socket.socket, "sendmsg")
3272@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3273@unittest.skipUnless(thread, 'Threading required for this test.')
3274class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3275 pass
3276
3277@requireAttrs(socket.socket, "recvmsg")
3278@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3279@unittest.skipUnless(thread, 'Threading required for this test.')
3280class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3281 SendrecvmsgSCTPStreamTestBase):
3282 pass
3283
3284@requireAttrs(socket.socket, "recvmsg_into")
3285@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3286@unittest.skipUnless(thread, 'Threading required for this test.')
3287class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3288 SendrecvmsgSCTPStreamTestBase):
3289 pass
3290
3291
3292class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3293 ConnectedStreamTestMixin, UnixStreamBase):
3294 pass
3295
3296@requireAttrs(socket.socket, "sendmsg")
3297@requireAttrs(socket, "AF_UNIX")
3298@unittest.skipUnless(thread, 'Threading required for this test.')
3299class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3300 pass
3301
3302@requireAttrs(socket.socket, "recvmsg")
3303@requireAttrs(socket, "AF_UNIX")
3304@unittest.skipUnless(thread, 'Threading required for this test.')
3305class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3306 SendrecvmsgUnixStreamTestBase):
3307 pass
3308
3309@requireAttrs(socket.socket, "recvmsg_into")
3310@requireAttrs(socket, "AF_UNIX")
3311@unittest.skipUnless(thread, 'Threading required for this test.')
3312class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3313 SendrecvmsgUnixStreamTestBase):
3314 pass
3315
3316@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3317@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3318@unittest.skipUnless(thread, 'Threading required for this test.')
3319class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3320 pass
3321
3322@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3323@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3324@unittest.skipUnless(thread, 'Threading required for this test.')
3325class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3326 SendrecvmsgUnixStreamTestBase):
3327 pass
3328
3329
3330# Test interrupting the interruptible send/receive methods with a
3331# signal when a timeout is set. These tests avoid having multiple
3332# threads alive during the test so that the OS cannot deliver the
3333# signal to the wrong one.
3334
3335class InterruptedTimeoutBase(unittest.TestCase):
3336 # Base class for interrupted send/receive tests. Installs an
3337 # empty handler for SIGALRM and removes it on teardown, along with
3338 # any scheduled alarms.
3339
3340 def setUp(self):
3341 super().setUp()
3342 orig_alrm_handler = signal.signal(signal.SIGALRM,
3343 lambda signum, frame: None)
3344 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3345 self.addCleanup(self.setAlarm, 0)
3346
3347 # Timeout for socket operations
3348 timeout = 4.0
3349
3350 # Provide setAlarm() method to schedule delivery of SIGALRM after
3351 # given number of seconds, or cancel it if zero, and an
3352 # appropriate time value to use. Use setitimer() if available.
3353 if hasattr(signal, "setitimer"):
3354 alarm_time = 0.05
3355
3356 def setAlarm(self, seconds):
3357 signal.setitimer(signal.ITIMER_REAL, seconds)
3358 else:
3359 # Old systems may deliver the alarm up to one second early
3360 alarm_time = 2
3361
3362 def setAlarm(self, seconds):
3363 signal.alarm(seconds)
3364
3365
3366# Require siginterrupt() in order to ensure that system calls are
3367# interrupted by default.
3368@requireAttrs(signal, "siginterrupt")
3369@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3370 "Don't have signal.alarm or signal.setitimer")
3371class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3372 # Test interrupting the recv*() methods with signals when a
3373 # timeout is set.
3374
3375 def setUp(self):
3376 super().setUp()
3377 self.serv.settimeout(self.timeout)
3378
3379 def checkInterruptedRecv(self, func, *args, **kwargs):
3380 # Check that func(*args, **kwargs) raises socket.error with an
3381 # errno of EINTR when interrupted by a signal.
3382 self.setAlarm(self.alarm_time)
3383 with self.assertRaises(socket.error) as cm:
3384 func(*args, **kwargs)
3385 self.assertNotIsInstance(cm.exception, socket.timeout)
3386 self.assertEqual(cm.exception.errno, errno.EINTR)
3387
3388 def testInterruptedRecvTimeout(self):
3389 self.checkInterruptedRecv(self.serv.recv, 1024)
3390
3391 def testInterruptedRecvIntoTimeout(self):
3392 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3393
3394 def testInterruptedRecvfromTimeout(self):
3395 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3396
3397 def testInterruptedRecvfromIntoTimeout(self):
3398 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3399
3400 @requireAttrs(socket.socket, "recvmsg")
3401 def testInterruptedRecvmsgTimeout(self):
3402 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3403
3404 @requireAttrs(socket.socket, "recvmsg_into")
3405 def testInterruptedRecvmsgIntoTimeout(self):
3406 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3407
3408
3409# Require siginterrupt() in order to ensure that system calls are
3410# interrupted by default.
3411@requireAttrs(signal, "siginterrupt")
3412@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3413 "Don't have signal.alarm or signal.setitimer")
3414@unittest.skipUnless(thread, 'Threading required for this test.')
3415class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3416 ThreadSafeCleanupTestCase,
3417 SocketListeningTestMixin, TCPTestBase):
3418 # Test interrupting the interruptible send*() methods with signals
3419 # when a timeout is set.
3420
3421 def setUp(self):
3422 super().setUp()
3423 self.serv_conn = self.newSocket()
3424 self.addCleanup(self.serv_conn.close)
3425 # Use a thread to complete the connection, but wait for it to
3426 # terminate before running the test, so that there is only one
3427 # thread to accept the signal.
3428 cli_thread = threading.Thread(target=self.doConnect)
3429 cli_thread.start()
3430 self.cli_conn, addr = self.serv.accept()
3431 self.addCleanup(self.cli_conn.close)
3432 cli_thread.join()
3433 self.serv_conn.settimeout(self.timeout)
3434
3435 def doConnect(self):
3436 self.serv_conn.connect(self.serv_addr)
3437
3438 def checkInterruptedSend(self, func, *args, **kwargs):
3439 # Check that func(*args, **kwargs), run in a loop, raises
3440 # socket.error with an errno of EINTR when interrupted by a
3441 # signal.
3442 with self.assertRaises(socket.error) as cm:
3443 while True:
3444 self.setAlarm(self.alarm_time)
3445 func(*args, **kwargs)
3446 self.assertNotIsInstance(cm.exception, socket.timeout)
3447 self.assertEqual(cm.exception.errno, errno.EINTR)
3448
Nick Coghlan2496f332011-09-19 20:26:31 +10003449 # Issue #12958: The following tests have problems on Mac OS X
3450 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003451 def testInterruptedSendTimeout(self):
3452 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3453
Nick Coghlan2496f332011-09-19 20:26:31 +10003454 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003455 def testInterruptedSendtoTimeout(self):
3456 # Passing an actual address here as Python's wrapper for
3457 # sendto() doesn't allow passing a zero-length one; POSIX
3458 # requires that the address is ignored since the socket is
3459 # connection-mode, however.
3460 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3461 self.serv_addr)
3462
Nick Coghlan2496f332011-09-19 20:26:31 +10003463 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003464 @requireAttrs(socket.socket, "sendmsg")
3465 def testInterruptedSendmsgTimeout(self):
3466 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3467
3468
Victor Stinner45df8202010-04-28 22:31:17 +00003469@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003470class TCPCloserTest(ThreadedTCPSocketTest):
3471
3472 def testClose(self):
3473 conn, addr = self.serv.accept()
3474 conn.close()
3475
3476 sd = self.cli
3477 read, write, err = select.select([sd], [], [], 1.0)
3478 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003479 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003480
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003481 # Calling close() many times should be safe.
3482 conn.close()
3483 conn.close()
3484
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003485 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003486 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003487 time.sleep(1.0)
3488
Victor Stinner45df8202010-04-28 22:31:17 +00003489@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003490class BasicSocketPairTest(SocketPairTest):
3491
3492 def __init__(self, methodName='runTest'):
3493 SocketPairTest.__init__(self, methodName=methodName)
3494
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003495 def _check_defaults(self, sock):
3496 self.assertIsInstance(sock, socket.socket)
3497 if hasattr(socket, 'AF_UNIX'):
3498 self.assertEqual(sock.family, socket.AF_UNIX)
3499 else:
3500 self.assertEqual(sock.family, socket.AF_INET)
3501 self.assertEqual(sock.type, socket.SOCK_STREAM)
3502 self.assertEqual(sock.proto, 0)
3503
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003504 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003505 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003506
3507 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003508 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003509
Dave Cole331708b2004-08-09 04:51:41 +00003510 def testRecv(self):
3511 msg = self.serv.recv(1024)
3512 self.assertEqual(msg, MSG)
3513
3514 def _testRecv(self):
3515 self.cli.send(MSG)
3516
3517 def testSend(self):
3518 self.serv.send(MSG)
3519
3520 def _testSend(self):
3521 msg = self.cli.recv(1024)
3522 self.assertEqual(msg, MSG)
3523
Victor Stinner45df8202010-04-28 22:31:17 +00003524@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003525class NonBlockingTCPTests(ThreadedTCPSocketTest):
3526
3527 def __init__(self, methodName='runTest'):
3528 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3529
3530 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003531 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003532 self.serv.setblocking(0)
3533 start = time.time()
3534 try:
3535 self.serv.accept()
3536 except socket.error:
3537 pass
3538 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003539 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003540
3541 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003542 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003543
Antoine Pitroub1c54962010-10-14 15:05:38 +00003544 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003545 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003546 def testInitNonBlocking(self):
3547 # reinit server socket
3548 self.serv.close()
3549 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003550 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003551 self.port = support.bind_port(self.serv)
3552 self.serv.listen(1)
3553 # actual testing
3554 start = time.time()
3555 try:
3556 self.serv.accept()
3557 except socket.error:
3558 pass
3559 end = time.time()
3560 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3561
3562 def _testInitNonBlocking(self):
3563 pass
3564
Antoine Pitrou600232b2011-01-05 21:03:42 +00003565 def testInheritFlags(self):
3566 # Issue #7995: when calling accept() on a listening socket with a
3567 # timeout, the resulting socket should not be non-blocking.
3568 self.serv.settimeout(10)
3569 try:
3570 conn, addr = self.serv.accept()
3571 message = conn.recv(len(MSG))
3572 finally:
3573 conn.close()
3574 self.serv.settimeout(None)
3575
3576 def _testInheritFlags(self):
3577 time.sleep(0.1)
3578 self.cli.connect((HOST, self.port))
3579 time.sleep(0.5)
3580 self.cli.send(MSG)
3581
Guido van Rossum24e4af82002-06-12 19:18:08 +00003582 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003583 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003584 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003585 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003586 conn, addr = self.serv.accept()
3587 except socket.error:
3588 pass
3589 else:
3590 self.fail("Error trying to do non-blocking accept.")
3591 read, write, err = select.select([self.serv], [], [])
3592 if self.serv in read:
3593 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003594 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003595 else:
3596 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003597
Guido van Rossum24e4af82002-06-12 19:18:08 +00003598 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003599 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003600 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003601
3602 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003603 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003604 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003605 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003606
3607 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003608 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003609 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003610
3611 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003612 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003613 conn, addr = self.serv.accept()
3614 conn.setblocking(0)
3615 try:
3616 msg = conn.recv(len(MSG))
3617 except socket.error:
3618 pass
3619 else:
3620 self.fail("Error trying to do non-blocking recv.")
3621 read, write, err = select.select([conn], [], [])
3622 if conn in read:
3623 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003624 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003625 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003626 else:
3627 self.fail("Error during select call to non-blocking socket.")
3628
3629 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003630 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003631 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003632 self.cli.send(MSG)
3633
Victor Stinner45df8202010-04-28 22:31:17 +00003634@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003635class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003636 """Unit tests for the object returned by socket.makefile()
3637
Antoine Pitrou834bd812010-10-13 16:17:14 +00003638 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003639 the client connection. You can read from this file to
3640 get output from the server.
3641
Antoine Pitrou834bd812010-10-13 16:17:14 +00003642 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003643 server connection. You can write to this file to send output
3644 to the client.
3645 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003646
Guido van Rossume9f66142002-08-07 15:46:19 +00003647 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003648 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003649 errors = 'strict'
3650 newline = None
3651
3652 read_mode = 'rb'
3653 read_msg = MSG
3654 write_mode = 'wb'
3655 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003656
Guido van Rossum24e4af82002-06-12 19:18:08 +00003657 def __init__(self, methodName='runTest'):
3658 SocketConnectedTest.__init__(self, methodName=methodName)
3659
3660 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003661 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3662 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003663 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003664 self.read_file = self.cli_conn.makefile(
3665 self.read_mode, self.bufsize,
3666 encoding = self.encoding,
3667 errors = self.errors,
3668 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003669
3670 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003671 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003672 self.read_file.close()
3673 self.assertTrue(self.read_file.closed)
3674 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003675 SocketConnectedTest.tearDown(self)
3676
3677 def clientSetUp(self):
3678 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003679 self.write_file = self.serv_conn.makefile(
3680 self.write_mode, self.bufsize,
3681 encoding = self.encoding,
3682 errors = self.errors,
3683 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003684
3685 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003686 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003687 self.write_file.close()
3688 self.assertTrue(self.write_file.closed)
3689 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003690 SocketConnectedTest.clientTearDown(self)
3691
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003692 def testReadAfterTimeout(self):
3693 # Issue #7322: A file object must disallow further reads
3694 # after a timeout has occurred.
3695 self.cli_conn.settimeout(1)
3696 self.read_file.read(3)
3697 # First read raises a timeout
3698 self.assertRaises(socket.timeout, self.read_file.read, 1)
3699 # Second read is disallowed
3700 with self.assertRaises(IOError) as ctx:
3701 self.read_file.read(1)
3702 self.assertIn("cannot read from timed out object", str(ctx.exception))
3703
3704 def _testReadAfterTimeout(self):
3705 self.write_file.write(self.write_msg[0:3])
3706 self.write_file.flush()
3707 self.serv_finished.wait()
3708
Guido van Rossum24e4af82002-06-12 19:18:08 +00003709 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003710 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003711 first_seg = self.read_file.read(len(self.read_msg)-3)
3712 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003713 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003714 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003715
3716 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003717 self.write_file.write(self.write_msg)
3718 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003719
Guido van Rossum8c943832002-08-08 01:00:28 +00003720 def testFullRead(self):
3721 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003722 msg = self.read_file.read()
3723 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003724
3725 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003726 self.write_file.write(self.write_msg)
3727 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003728
Guido van Rossum24e4af82002-06-12 19:18:08 +00003729 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003730 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003731 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003732 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003733 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003734 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003735 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003736 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003737 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003738
3739 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003740 self.write_file.write(self.write_msg)
3741 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003742
3743 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003744 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003745 line = self.read_file.readline()
3746 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003747
3748 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003749 self.write_file.write(self.write_msg)
3750 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003751
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003752 def testCloseAfterMakefile(self):
3753 # The file returned by makefile should keep the socket open.
3754 self.cli_conn.close()
3755 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003756 msg = self.read_file.read()
3757 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003758
3759 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003760 self.write_file.write(self.write_msg)
3761 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003762
3763 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003764 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003765 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003766 if isinstance(self.read_msg, str):
3767 msg = msg.decode()
3768 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003769
3770 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003771 self.write_file.write(self.write_msg)
3772 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003773
Tim Peters116d83c2004-03-28 02:20:45 +00003774 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003775 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003776
3777 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003778 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003779
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003780 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003781 self.assertEqual(self.read_file.mode, self.read_mode)
3782 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003783
3784 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003785 self.assertEqual(self.write_file.mode, self.write_mode)
3786 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003787
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003788 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003789 self.read_file.close()
3790 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003791 self.cli_conn.close()
3792 self.assertRaises(socket.error, self.cli_conn.getsockname)
3793
3794 def _testRealClose(self):
3795 pass
3796
3797
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003798class FileObjectInterruptedTestCase(unittest.TestCase):
3799 """Test that the file object correctly handles EINTR internally."""
3800
3801 class MockSocket(object):
3802 def __init__(self, recv_funcs=()):
3803 # A generator that returns callables that we'll call for each
3804 # call to recv().
3805 self._recv_step = iter(recv_funcs)
3806
3807 def recv_into(self, buffer):
3808 data = next(self._recv_step)()
3809 assert len(buffer) >= len(data)
3810 buffer[:len(data)] = data
3811 return len(data)
3812
3813 def _decref_socketios(self):
3814 pass
3815
3816 def _textiowrap_for_test(self, buffering=-1):
3817 raw = socket.SocketIO(self, "r")
3818 if buffering < 0:
3819 buffering = io.DEFAULT_BUFFER_SIZE
3820 if buffering == 0:
3821 return raw
3822 buffer = io.BufferedReader(raw, buffering)
3823 text = io.TextIOWrapper(buffer, None, None)
3824 text.mode = "rb"
3825 return text
3826
3827 @staticmethod
3828 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003829 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003830
3831 def _textiowrap_mock_socket(self, mock, buffering=-1):
3832 raw = socket.SocketIO(mock, "r")
3833 if buffering < 0:
3834 buffering = io.DEFAULT_BUFFER_SIZE
3835 if buffering == 0:
3836 return raw
3837 buffer = io.BufferedReader(raw, buffering)
3838 text = io.TextIOWrapper(buffer, None, None)
3839 text.mode = "rb"
3840 return text
3841
3842 def _test_readline(self, size=-1, buffering=-1):
3843 mock_sock = self.MockSocket(recv_funcs=[
3844 lambda : b"This is the first line\nAnd the sec",
3845 self._raise_eintr,
3846 lambda : b"ond line is here\n",
3847 lambda : b"",
3848 lambda : b"", # XXX(gps): io library does an extra EOF read
3849 ])
3850 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003851 self.assertEqual(fo.readline(size), "This is the first line\n")
3852 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003853
3854 def _test_read(self, size=-1, buffering=-1):
3855 mock_sock = self.MockSocket(recv_funcs=[
3856 lambda : b"This is the first line\nAnd the sec",
3857 self._raise_eintr,
3858 lambda : b"ond line is here\n",
3859 lambda : b"",
3860 lambda : b"", # XXX(gps): io library does an extra EOF read
3861 ])
3862 expecting = (b"This is the first line\n"
3863 b"And the second line is here\n")
3864 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3865 if buffering == 0:
3866 data = b''
3867 else:
3868 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003869 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003870 while len(data) != len(expecting):
3871 part = fo.read(size)
3872 if not part:
3873 break
3874 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003875 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003876
3877 def test_default(self):
3878 self._test_readline()
3879 self._test_readline(size=100)
3880 self._test_read()
3881 self._test_read(size=100)
3882
3883 def test_with_1k_buffer(self):
3884 self._test_readline(buffering=1024)
3885 self._test_readline(size=100, buffering=1024)
3886 self._test_read(buffering=1024)
3887 self._test_read(size=100, buffering=1024)
3888
3889 def _test_readline_no_buffer(self, size=-1):
3890 mock_sock = self.MockSocket(recv_funcs=[
3891 lambda : b"a",
3892 lambda : b"\n",
3893 lambda : b"B",
3894 self._raise_eintr,
3895 lambda : b"b",
3896 lambda : b"",
3897 ])
3898 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003899 self.assertEqual(fo.readline(size), b"a\n")
3900 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003901
3902 def test_no_buffer(self):
3903 self._test_readline_no_buffer()
3904 self._test_readline_no_buffer(size=4)
3905 self._test_read(buffering=0)
3906 self._test_read(size=100, buffering=0)
3907
3908
Guido van Rossume9f66142002-08-07 15:46:19 +00003909class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3910
3911 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003912
Guido van Rossume9f66142002-08-07 15:46:19 +00003913 In this case (and in this case only), it should be possible to
3914 create a file object, read a line from it, create another file
3915 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003916 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003917 when reading multiple requests from the same socket."""
3918
3919 bufsize = 0 # Use unbuffered mode
3920
3921 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003922 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003923 line = self.read_file.readline() # first line
3924 self.assertEqual(line, b"A. " + self.write_msg) # first line
3925 self.read_file = self.cli_conn.makefile('rb', 0)
3926 line = self.read_file.readline() # second line
3927 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003928
3929 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003930 self.write_file.write(b"A. " + self.write_msg)
3931 self.write_file.write(b"B. " + self.write_msg)
3932 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003933
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003934 def testMakefileClose(self):
3935 # The file returned by makefile should keep the socket open...
3936 self.cli_conn.close()
3937 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003938 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003939 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003940 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003941 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3942
3943 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003944 self.write_file.write(self.write_msg)
3945 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003946
3947 def testMakefileCloseSocketDestroy(self):
3948 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003949 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003950 refcount_after = sys.getrefcount(self.cli_conn)
3951 self.assertEqual(refcount_before - 1, refcount_after)
3952
3953 def _testMakefileCloseSocketDestroy(self):
3954 pass
3955
Antoine Pitrou98b46702010-09-18 22:59:00 +00003956 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003957 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003958 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3959
3960 def testSmallReadNonBlocking(self):
3961 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003962 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3963 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003964 self.evt1.set()
3965 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003966 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003967 if first_seg is None:
3968 # Data not arrived (can happen under Windows), wait a bit
3969 time.sleep(0.5)
3970 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003971 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003972 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003973 self.assertEqual(n, 3)
3974 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003975 self.assertEqual(msg, self.read_msg)
3976 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3977 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003978
3979 def _testSmallReadNonBlocking(self):
3980 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003981 self.write_file.write(self.write_msg)
3982 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003983 self.evt2.set()
3984 # Avoid cloding the socket before the server test has finished,
3985 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3986 self.serv_finished.wait(5.0)
3987
3988 def testWriteNonBlocking(self):
3989 self.cli_finished.wait(5.0)
3990 # The client thread can't skip directly - the SkipTest exception
3991 # would appear as a failure.
3992 if self.serv_skipped:
3993 self.skipTest(self.serv_skipped)
3994
3995 def _testWriteNonBlocking(self):
3996 self.serv_skipped = None
3997 self.serv_conn.setblocking(False)
3998 # Try to saturate the socket buffer pipe with repeated large writes.
3999 BIG = b"x" * (1024 ** 2)
4000 LIMIT = 10
4001 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004002 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004003 self.assertGreater(n, 0)
4004 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004005 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004006 if n is None:
4007 # Succeeded
4008 break
4009 self.assertGreater(n, 0)
4010 else:
4011 # Let us know that this test didn't manage to establish
4012 # the expected conditions. This is not a failure in itself but,
4013 # if it happens repeatedly, the test should be fixed.
4014 self.serv_skipped = "failed to saturate the socket buffer"
4015
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004016
Guido van Rossum8c943832002-08-08 01:00:28 +00004017class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4018
4019 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4020
4021
4022class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4023
4024 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004025
Thomas Woutersb2137042007-02-01 18:02:27 +00004026
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4028 """Tests for socket.makefile() in text mode (rather than binary)"""
4029
4030 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004031 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004032 write_mode = 'wb'
4033 write_msg = MSG
4034 newline = ''
4035
4036
4037class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4038 """Tests for socket.makefile() in text mode (rather than binary)"""
4039
4040 read_mode = 'rb'
4041 read_msg = MSG
4042 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004043 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004044 newline = ''
4045
4046
4047class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4048 """Tests for socket.makefile() in text mode (rather than binary)"""
4049
4050 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004051 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004052 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004053 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004054 newline = ''
4055
4056
Guido van Rossumd8faa362007-04-27 19:54:29 +00004057class NetworkConnectionTest(object):
4058 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004059
Guido van Rossumd8faa362007-04-27 19:54:29 +00004060 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004061 # We're inherited below by BasicTCPTest2, which also inherits
4062 # BasicTCPTest, which defines self.port referenced below.
4063 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004064 self.serv_conn = self.cli
4065
4066class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4067 """Tests that NetworkConnection does not break existing TCP functionality.
4068 """
4069
4070class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004071
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004072 class MockSocket(socket.socket):
4073 def connect(self, *args):
4074 raise socket.timeout('timed out')
4075
4076 @contextlib.contextmanager
4077 def mocked_socket_module(self):
4078 """Return a socket which times out on connect"""
4079 old_socket = socket.socket
4080 socket.socket = self.MockSocket
4081 try:
4082 yield
4083 finally:
4084 socket.socket = old_socket
4085
4086 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004087 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004088 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004089 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004090 with self.assertRaises(socket.error) as cm:
4091 cli.connect((HOST, port))
4092 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4093
4094 def test_create_connection(self):
4095 # Issue #9792: errors raised by create_connection() should have
4096 # a proper errno attribute.
4097 port = support.find_unused_port()
4098 with self.assertRaises(socket.error) as cm:
4099 socket.create_connection((HOST, port))
4100 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4101
4102 def test_create_connection_timeout(self):
4103 # Issue #9792: create_connection() should not recast timeout errors
4104 # as generic socket errors.
4105 with self.mocked_socket_module():
4106 with self.assertRaises(socket.timeout):
4107 socket.create_connection((HOST, 1234))
4108
Guido van Rossumd8faa362007-04-27 19:54:29 +00004109
Victor Stinner45df8202010-04-28 22:31:17 +00004110@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004111class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4112
4113 def __init__(self, methodName='runTest'):
4114 SocketTCPTest.__init__(self, methodName=methodName)
4115 ThreadableTest.__init__(self)
4116
4117 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004118 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004119
4120 def clientTearDown(self):
4121 self.cli.close()
4122 self.cli = None
4123 ThreadableTest.clientTearDown(self)
4124
4125 def _justAccept(self):
4126 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004127 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004128
4129 testFamily = _justAccept
4130 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004131 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004132 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004133 self.assertEqual(self.cli.family, 2)
4134
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004135 testSourceAddress = _justAccept
4136 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004137 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4138 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004139 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004140 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004141 # The port number being used is sufficient to show that the bind()
4142 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004143
Guido van Rossumd8faa362007-04-27 19:54:29 +00004144 testTimeoutDefault = _justAccept
4145 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004146 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004147 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004148 socket.setdefaulttimeout(42)
4149 try:
4150 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004151 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004152 finally:
4153 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004154 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004155
4156 testTimeoutNone = _justAccept
4157 def _testTimeoutNone(self):
4158 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004159 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004160 socket.setdefaulttimeout(30)
4161 try:
4162 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004163 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004164 finally:
4165 socket.setdefaulttimeout(None)
4166 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004167
4168 testTimeoutValueNamed = _justAccept
4169 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004170 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004171 self.assertEqual(self.cli.gettimeout(), 30)
4172
4173 testTimeoutValueNonamed = _justAccept
4174 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004175 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004176 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004177 self.assertEqual(self.cli.gettimeout(), 30)
4178
Victor Stinner45df8202010-04-28 22:31:17 +00004179@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004180class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4181
4182 def __init__(self, methodName='runTest'):
4183 SocketTCPTest.__init__(self, methodName=methodName)
4184 ThreadableTest.__init__(self)
4185
4186 def clientSetUp(self):
4187 pass
4188
4189 def clientTearDown(self):
4190 self.cli.close()
4191 self.cli = None
4192 ThreadableTest.clientTearDown(self)
4193
4194 def testInsideTimeout(self):
4195 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004196 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004197 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004198 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004199 testOutsideTimeout = testInsideTimeout
4200
4201 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004202 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004203 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004204 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004205
4206 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004207 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004208 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004209
4210
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004211class TCPTimeoutTest(SocketTCPTest):
4212
4213 def testTCPTimeout(self):
4214 def raise_timeout(*args, **kwargs):
4215 self.serv.settimeout(1.0)
4216 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004217 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004218 "Error generating a timeout exception (TCP)")
4219
4220 def testTimeoutZero(self):
4221 ok = False
4222 try:
4223 self.serv.settimeout(0.0)
4224 foo = self.serv.accept()
4225 except socket.timeout:
4226 self.fail("caught timeout instead of error (TCP)")
4227 except socket.error:
4228 ok = True
4229 except:
4230 self.fail("caught unexpected exception (TCP)")
4231 if not ok:
4232 self.fail("accept() returned success when we did not expect it")
4233
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004234 def testInterruptedTimeout(self):
4235 # XXX I don't know how to do this test on MSWindows or any other
4236 # plaform that doesn't support signal.alarm() or os.kill(), though
4237 # the bug should have existed on all platforms.
4238 if not hasattr(signal, "alarm"):
4239 return # can only test on *nix
4240 self.serv.settimeout(5.0) # must be longer than alarm
4241 class Alarm(Exception):
4242 pass
4243 def alarm_handler(signal, frame):
4244 raise Alarm
4245 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4246 try:
4247 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4248 try:
4249 foo = self.serv.accept()
4250 except socket.timeout:
4251 self.fail("caught timeout instead of Alarm")
4252 except Alarm:
4253 pass
4254 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004255 self.fail("caught other exception instead of Alarm:"
4256 " %s(%s):\n%s" %
4257 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004258 else:
4259 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004260 finally:
4261 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004262 except Alarm:
4263 self.fail("got Alarm in wrong place")
4264 finally:
4265 # no alarm can be pending. Safe to restore old handler.
4266 signal.signal(signal.SIGALRM, old_alarm)
4267
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004268class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004269
4270 def testUDPTimeout(self):
4271 def raise_timeout(*args, **kwargs):
4272 self.serv.settimeout(1.0)
4273 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004274 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004275 "Error generating a timeout exception (UDP)")
4276
4277 def testTimeoutZero(self):
4278 ok = False
4279 try:
4280 self.serv.settimeout(0.0)
4281 foo = self.serv.recv(1024)
4282 except socket.timeout:
4283 self.fail("caught timeout instead of error (UDP)")
4284 except socket.error:
4285 ok = True
4286 except:
4287 self.fail("caught unexpected exception (UDP)")
4288 if not ok:
4289 self.fail("recv() returned success when we did not expect it")
4290
4291class TestExceptions(unittest.TestCase):
4292
4293 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004294 self.assertTrue(issubclass(socket.error, Exception))
4295 self.assertTrue(issubclass(socket.herror, socket.error))
4296 self.assertTrue(issubclass(socket.gaierror, socket.error))
4297 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004298
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004299class TestLinuxAbstractNamespace(unittest.TestCase):
4300
4301 UNIX_PATH_MAX = 108
4302
4303 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004304 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004305 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4306 s1.bind(address)
4307 s1.listen(1)
4308 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4309 s2.connect(s1.getsockname())
4310 with s1.accept()[0] as s3:
4311 self.assertEqual(s1.getsockname(), address)
4312 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004313
4314 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004315 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004316 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4317 s.bind(address)
4318 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004319
4320 def testNameOverflow(self):
4321 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004322 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4323 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004324
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004325 def testStrName(self):
4326 # Check that an abstract name can be passed as a string.
4327 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4328 try:
4329 s.bind("\x00python\x00test\x00")
4330 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4331 finally:
4332 s.close()
4333
4334class TestUnixDomain(unittest.TestCase):
4335
4336 def setUp(self):
4337 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4338
4339 def tearDown(self):
4340 self.sock.close()
4341
4342 def encoded(self, path):
4343 # Return the given path encoded in the file system encoding,
4344 # or skip the test if this is not possible.
4345 try:
4346 return os.fsencode(path)
4347 except UnicodeEncodeError:
4348 self.skipTest(
4349 "Pathname {0!a} cannot be represented in file "
4350 "system encoding {1!r}".format(
4351 path, sys.getfilesystemencoding()))
4352
Antoine Pitrou16374872011-12-16 15:04:12 +01004353 def bind(self, sock, path):
4354 # Bind the socket
4355 try:
4356 sock.bind(path)
4357 except OSError as e:
4358 if str(e) == "AF_UNIX path too long":
4359 self.skipTest(
4360 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4361 .format(path))
4362 else:
4363 raise
4364
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004365 def testStrAddr(self):
4366 # Test binding to and retrieving a normal string pathname.
4367 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004368 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004369 self.addCleanup(support.unlink, path)
4370 self.assertEqual(self.sock.getsockname(), path)
4371
4372 def testBytesAddr(self):
4373 # Test binding to a bytes pathname.
4374 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004375 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004376 self.addCleanup(support.unlink, path)
4377 self.assertEqual(self.sock.getsockname(), path)
4378
4379 def testSurrogateescapeBind(self):
4380 # Test binding to a valid non-ASCII pathname, with the
4381 # non-ASCII bytes supplied using surrogateescape encoding.
4382 path = os.path.abspath(support.TESTFN_UNICODE)
4383 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004384 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004385 self.addCleanup(support.unlink, path)
4386 self.assertEqual(self.sock.getsockname(), path)
4387
4388 def testUnencodableAddr(self):
4389 # Test binding to a pathname that cannot be encoded in the
4390 # file system encoding.
4391 if support.TESTFN_UNENCODABLE is None:
4392 self.skipTest("No unencodable filename available")
4393 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004394 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004395 self.addCleanup(support.unlink, path)
4396 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004397
Victor Stinner45df8202010-04-28 22:31:17 +00004398@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004399class BufferIOTest(SocketConnectedTest):
4400 """
4401 Test the buffer versions of socket.recv() and socket.send().
4402 """
4403 def __init__(self, methodName='runTest'):
4404 SocketConnectedTest.__init__(self, methodName=methodName)
4405
Antoine Pitrou25480782010-03-17 22:50:28 +00004406 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004407 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004408 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004409 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004410 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004411 self.assertEqual(msg, MSG)
4412
Antoine Pitrou25480782010-03-17 22:50:28 +00004413 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004414 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004415 self.serv_conn.send(buf)
4416
Antoine Pitrou25480782010-03-17 22:50:28 +00004417 def testRecvIntoBytearray(self):
4418 buf = bytearray(1024)
4419 nbytes = self.cli_conn.recv_into(buf)
4420 self.assertEqual(nbytes, len(MSG))
4421 msg = buf[:len(MSG)]
4422 self.assertEqual(msg, MSG)
4423
4424 _testRecvIntoBytearray = _testRecvIntoArray
4425
4426 def testRecvIntoMemoryview(self):
4427 buf = bytearray(1024)
4428 nbytes = self.cli_conn.recv_into(memoryview(buf))
4429 self.assertEqual(nbytes, len(MSG))
4430 msg = buf[:len(MSG)]
4431 self.assertEqual(msg, MSG)
4432
4433 _testRecvIntoMemoryview = _testRecvIntoArray
4434
4435 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004436 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004437 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004438 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004439 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004440 self.assertEqual(msg, MSG)
4441
Antoine Pitrou25480782010-03-17 22:50:28 +00004442 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004443 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004444 self.serv_conn.send(buf)
4445
Antoine Pitrou25480782010-03-17 22:50:28 +00004446 def testRecvFromIntoBytearray(self):
4447 buf = bytearray(1024)
4448 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4449 self.assertEqual(nbytes, len(MSG))
4450 msg = buf[:len(MSG)]
4451 self.assertEqual(msg, MSG)
4452
4453 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4454
4455 def testRecvFromIntoMemoryview(self):
4456 buf = bytearray(1024)
4457 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4458 self.assertEqual(nbytes, len(MSG))
4459 msg = buf[:len(MSG)]
4460 self.assertEqual(msg, MSG)
4461
4462 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4463
Christian Heimes043d6f62008-01-07 17:19:16 +00004464
4465TIPC_STYPE = 2000
4466TIPC_LOWER = 200
4467TIPC_UPPER = 210
4468
4469def isTipcAvailable():
4470 """Check if the TIPC module is loaded
4471
4472 The TIPC module is not loaded automatically on Ubuntu and probably
4473 other Linux distros.
4474 """
4475 if not hasattr(socket, "AF_TIPC"):
4476 return False
4477 if not os.path.isfile("/proc/modules"):
4478 return False
4479 with open("/proc/modules") as f:
4480 for line in f:
4481 if line.startswith("tipc "):
4482 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004483 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004484 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4485 return False
4486
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004487class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004488 def testRDM(self):
4489 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4490 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004491 self.addCleanup(srv.close)
4492 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004493
4494 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4495 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4496 TIPC_LOWER, TIPC_UPPER)
4497 srv.bind(srvaddr)
4498
4499 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4500 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4501 cli.sendto(MSG, sendaddr)
4502
4503 msg, recvaddr = srv.recvfrom(1024)
4504
4505 self.assertEqual(cli.getsockname(), recvaddr)
4506 self.assertEqual(msg, MSG)
4507
4508
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004509class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004510 def __init__(self, methodName = 'runTest'):
4511 unittest.TestCase.__init__(self, methodName = methodName)
4512 ThreadableTest.__init__(self)
4513
4514 def setUp(self):
4515 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004516 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004517 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4518 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4519 TIPC_LOWER, TIPC_UPPER)
4520 self.srv.bind(srvaddr)
4521 self.srv.listen(5)
4522 self.serverExplicitReady()
4523 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004524 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004525
4526 def clientSetUp(self):
4527 # The is a hittable race between serverExplicitReady() and the
4528 # accept() call; sleep a little while to avoid it, otherwise
4529 # we could get an exception
4530 time.sleep(0.1)
4531 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004532 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004533 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4534 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4535 self.cli.connect(addr)
4536 self.cliaddr = self.cli.getsockname()
4537
4538 def testStream(self):
4539 msg = self.conn.recv(1024)
4540 self.assertEqual(msg, MSG)
4541 self.assertEqual(self.cliaddr, self.connaddr)
4542
4543 def _testStream(self):
4544 self.cli.send(MSG)
4545 self.cli.close()
4546
4547
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004548@unittest.skipUnless(thread, 'Threading required for this test.')
4549class ContextManagersTest(ThreadedTCPSocketTest):
4550
4551 def _testSocketClass(self):
4552 # base test
4553 with socket.socket() as sock:
4554 self.assertFalse(sock._closed)
4555 self.assertTrue(sock._closed)
4556 # close inside with block
4557 with socket.socket() as sock:
4558 sock.close()
4559 self.assertTrue(sock._closed)
4560 # exception inside with block
4561 with socket.socket() as sock:
4562 self.assertRaises(socket.error, sock.sendall, b'foo')
4563 self.assertTrue(sock._closed)
4564
4565 def testCreateConnectionBase(self):
4566 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004567 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004568 data = conn.recv(1024)
4569 conn.sendall(data)
4570
4571 def _testCreateConnectionBase(self):
4572 address = self.serv.getsockname()
4573 with socket.create_connection(address) as sock:
4574 self.assertFalse(sock._closed)
4575 sock.sendall(b'foo')
4576 self.assertEqual(sock.recv(1024), b'foo')
4577 self.assertTrue(sock._closed)
4578
4579 def testCreateConnectionClose(self):
4580 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004581 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004582 data = conn.recv(1024)
4583 conn.sendall(data)
4584
4585 def _testCreateConnectionClose(self):
4586 address = self.serv.getsockname()
4587 with socket.create_connection(address) as sock:
4588 sock.close()
4589 self.assertTrue(sock._closed)
4590 self.assertRaises(socket.error, sock.sendall, b'foo')
4591
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004592
Antoine Pitroub1c54962010-10-14 15:05:38 +00004593@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4594 "SOCK_CLOEXEC not defined")
4595@unittest.skipUnless(fcntl, "module fcntl not available")
4596class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004597 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004598 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004599 with socket.socket(socket.AF_INET,
4600 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4601 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4602 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004603
4604
4605@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4606 "SOCK_NONBLOCK not defined")
4607class NonblockConstantTest(unittest.TestCase):
4608 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4609 if nonblock:
4610 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4611 self.assertEqual(s.gettimeout(), timeout)
4612 else:
4613 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4614 self.assertEqual(s.gettimeout(), None)
4615
Charles-François Natali239bb962011-06-03 12:55:15 +02004616 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004617 def test_SOCK_NONBLOCK(self):
4618 # a lot of it seems silly and redundant, but I wanted to test that
4619 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004620 with socket.socket(socket.AF_INET,
4621 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4622 self.checkNonblock(s)
4623 s.setblocking(1)
4624 self.checkNonblock(s, False)
4625 s.setblocking(0)
4626 self.checkNonblock(s)
4627 s.settimeout(None)
4628 self.checkNonblock(s, False)
4629 s.settimeout(2.0)
4630 self.checkNonblock(s, timeout=2.0)
4631 s.setblocking(1)
4632 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004633 # defaulttimeout
4634 t = socket.getdefaulttimeout()
4635 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004636 with socket.socket() as s:
4637 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004638 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004639 with socket.socket() as s:
4640 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004641 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004642 with socket.socket() as s:
4643 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004644 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004645 with socket.socket() as s:
4646 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004647 socket.setdefaulttimeout(t)
4648
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004649
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004650@unittest.skipUnless(os.name == "nt", "Windows specific")
4651@unittest.skipUnless(multiprocessing, "need multiprocessing")
4652class TestSocketSharing(SocketTCPTest):
4653 # This must be classmethod and not staticmethod or multiprocessing
4654 # won't be able to bootstrap it.
4655 @classmethod
4656 def remoteProcessServer(cls, q):
4657 # Recreate socket from shared data
4658 sdata = q.get()
4659 message = q.get()
4660
4661 s = socket.fromshare(sdata)
4662 s2, c = s.accept()
4663
4664 # Send the message
4665 s2.sendall(message)
4666 s2.close()
4667 s.close()
4668
4669 def testShare(self):
4670 # Transfer the listening server socket to another process
4671 # and service it from there.
4672
4673 # Create process:
4674 q = multiprocessing.Queue()
4675 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4676 p.start()
4677
4678 # Get the shared socket data
4679 data = self.serv.share(p.pid)
4680
4681 # Pass the shared socket to the other process
4682 addr = self.serv.getsockname()
4683 self.serv.close()
4684 q.put(data)
4685
4686 # The data that the server will send us
4687 message = b"slapmahfro"
4688 q.put(message)
4689
4690 # Connect
4691 s = socket.create_connection(addr)
4692 # listen for the data
4693 m = []
4694 while True:
4695 data = s.recv(100)
4696 if not data:
4697 break
4698 m.append(data)
4699 s.close()
4700 received = b"".join(m)
4701 self.assertEqual(received, message)
4702 p.join()
4703
4704 def testShareLength(self):
4705 data = self.serv.share(os.getpid())
4706 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4707 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4708
4709 def compareSockets(self, org, other):
4710 # socket sharing is expected to work only for blocking socket
4711 # since the internal python timout value isn't transfered.
4712 self.assertEqual(org.gettimeout(), None)
4713 self.assertEqual(org.gettimeout(), other.gettimeout())
4714
4715 self.assertEqual(org.family, other.family)
4716 self.assertEqual(org.type, other.type)
4717 # If the user specified "0" for proto, then
4718 # internally windows will have picked the correct value.
4719 # Python introspection on the socket however will still return
4720 # 0. For the shared socket, the python value is recreated
4721 # from the actual value, so it may not compare correctly.
4722 if org.proto != 0:
4723 self.assertEqual(org.proto, other.proto)
4724
4725 def testShareLocal(self):
4726 data = self.serv.share(os.getpid())
4727 s = socket.fromshare(data)
4728 try:
4729 self.compareSockets(self.serv, s)
4730 finally:
4731 s.close()
4732
4733 def testTypes(self):
4734 families = [socket.AF_INET, socket.AF_INET6]
4735 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4736 for f in families:
4737 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004738 try:
4739 source = socket.socket(f, t)
4740 except OSError:
4741 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004742 try:
4743 data = source.share(os.getpid())
4744 shared = socket.fromshare(data)
4745 try:
4746 self.compareSockets(source, shared)
4747 finally:
4748 shared.close()
4749 finally:
4750 source.close()
4751
4752
Guido van Rossumb995eb72002-07-31 16:08:40 +00004753def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004754 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004755 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004756
4757 tests.extend([
4758 NonBlockingTCPTests,
4759 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004760 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004761 UnbufferedFileObjectClassTestCase,
4762 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004763 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004764 UnicodeReadFileObjectClassTestCase,
4765 UnicodeWriteFileObjectClassTestCase,
4766 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004767 NetworkConnectionNoServer,
4768 NetworkConnectionAttributesTest,
4769 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004770 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004771 CloexecConstantTest,
4772 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004773 ])
Dave Cole331708b2004-08-09 04:51:41 +00004774 if hasattr(socket, "socketpair"):
4775 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004776 if hasattr(socket, "AF_UNIX"):
4777 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004778 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004779 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004780 if isTipcAvailable():
4781 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004782 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004783 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004784 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004785 tests.extend([
4786 CmsgMacroTests,
4787 SendmsgUDPTest,
4788 RecvmsgUDPTest,
4789 RecvmsgIntoUDPTest,
4790 SendmsgUDP6Test,
4791 RecvmsgUDP6Test,
4792 RecvmsgRFC3542AncillaryUDP6Test,
4793 RecvmsgIntoRFC3542AncillaryUDP6Test,
4794 RecvmsgIntoUDP6Test,
4795 SendmsgTCPTest,
4796 RecvmsgTCPTest,
4797 RecvmsgIntoTCPTest,
4798 SendmsgSCTPStreamTest,
4799 RecvmsgSCTPStreamTest,
4800 RecvmsgIntoSCTPStreamTest,
4801 SendmsgUnixStreamTest,
4802 RecvmsgUnixStreamTest,
4803 RecvmsgIntoUnixStreamTest,
4804 RecvmsgSCMRightsStreamTest,
4805 RecvmsgIntoSCMRightsStreamTest,
4806 # These are slow when setitimer() is not available
4807 InterruptedRecvTimeoutTest,
4808 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004809 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004810 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004811
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004812 thread_info = support.threading_setup()
4813 support.run_unittest(*tests)
4814 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004815
4816if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004817 test_main()