blob: 7716d334c5317156af87719f749ce1152d8aa08d [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
Antoine Pitroub7eb5632012-06-24 01:34:13 +02005from unittest.case import _ExpectedFailure
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006
Christian Heimes5e696852008-04-09 08:37:03 +00007import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00008import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00009import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +000010import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100011import tempfile
12import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000013import time
14import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000015import queue
Jack Jansen522e7692002-09-06 21:57:50 +000016import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000017import os
18import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000019import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000020import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000021from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000022import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000023import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010024import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020025import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000026try:
27 import fcntl
28except ImportError:
29 fcntl = False
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000030try:
31 import multiprocessing
32except ImportError:
33 multiprocessing = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000034
Benjamin Petersonee8712c2008-05-20 21:35:26 +000035HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000036MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
Victor Stinner45df8202010-04-28 22:31:17 +000038try:
39 import _thread as thread
40 import threading
41except ImportError:
42 thread = None
43 threading = None
44
Charles-François Natali47413c12011-10-06 19:47:44 +020045def _have_socket_can():
46 """Check whether CAN sockets are supported on this host."""
47 try:
48 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
49 except (AttributeError, socket.error, OSError):
50 return False
51 else:
52 s.close()
53 return True
54
Charles-François Natali10b8cf42011-11-10 19:21:37 +010055def _have_socket_rds():
56 """Check whether RDS sockets are supported on this host."""
57 try:
58 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
59 except (AttributeError, OSError):
60 return False
61 else:
62 s.close()
63 return True
64
Charles-François Natali47413c12011-10-06 19:47:44 +020065HAVE_SOCKET_CAN = _have_socket_can()
66
Charles-François Natali10b8cf42011-11-10 19:21:37 +010067HAVE_SOCKET_RDS = _have_socket_rds()
68
Nick Coghlan96fe56a2011-08-22 11:55:57 +100069# Size in bytes of the int type
70SIZEOF_INT = array.array("i").itemsize
71
Guido van Rossum24e4af82002-06-12 19:18:08 +000072class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000073
Guido van Rossum24e4af82002-06-12 19:18:08 +000074 def setUp(self):
75 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000076 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000077 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000078
Guido van Rossum24e4af82002-06-12 19:18:08 +000079 def tearDown(self):
80 self.serv.close()
81 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000082
Guido van Rossum24e4af82002-06-12 19:18:08 +000083class SocketUDPTest(unittest.TestCase):
84
85 def setUp(self):
86 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000087 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000088
89 def tearDown(self):
90 self.serv.close()
91 self.serv = None
92
Nick Coghlan96fe56a2011-08-22 11:55:57 +100093class ThreadSafeCleanupTestCase(unittest.TestCase):
94 """Subclass of unittest.TestCase with thread-safe cleanup methods.
95
96 This subclass protects the addCleanup() and doCleanups() methods
97 with a recursive lock.
98 """
99
100 if threading:
101 def __init__(self, *args, **kwargs):
102 super().__init__(*args, **kwargs)
103 self._cleanup_lock = threading.RLock()
104
105 def addCleanup(self, *args, **kwargs):
106 with self._cleanup_lock:
107 return super().addCleanup(*args, **kwargs)
108
109 def doCleanups(self, *args, **kwargs):
110 with self._cleanup_lock:
111 return super().doCleanups(*args, **kwargs)
112
Charles-François Natali47413c12011-10-06 19:47:44 +0200113class SocketCANTest(unittest.TestCase):
114
115 """To be able to run this test, a `vcan0` CAN interface can be created with
116 the following commands:
117 # modprobe vcan
118 # ip link add dev vcan0 type vcan
119 # ifconfig vcan0 up
120 """
121 interface = 'vcan0'
122 bufsize = 128
123
124 def setUp(self):
125 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200126 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200127 try:
128 self.s.bind((self.interface,))
129 except socket.error:
130 self.skipTest('network interface `%s` does not exist' %
131 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200132
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100133
134class SocketRDSTest(unittest.TestCase):
135
136 """To be able to run this test, the `rds` kernel module must be loaded:
137 # modprobe rds
138 """
139 bufsize = 8192
140
141 def setUp(self):
142 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
143 self.addCleanup(self.serv.close)
144 try:
145 self.port = support.bind_port(self.serv)
146 except OSError:
147 self.skipTest('unable to bind RDS socket')
148
149
Guido van Rossum24e4af82002-06-12 19:18:08 +0000150class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000151 """Threadable Test class
152
153 The ThreadableTest class makes it easy to create a threaded
154 client/server pair from an existing unit test. To create a
155 new threaded class from an existing unit test, use multiple
156 inheritance:
157
158 class NewClass (OldClass, ThreadableTest):
159 pass
160
161 This class defines two new fixture functions with obvious
162 purposes for overriding:
163
164 clientSetUp ()
165 clientTearDown ()
166
167 Any new test functions within the class must then define
168 tests in pairs, where the test name is preceeded with a
169 '_' to indicate the client portion of the test. Ex:
170
171 def testFoo(self):
172 # Server portion
173
174 def _testFoo(self):
175 # Client portion
176
177 Any exceptions raised by the clients during their tests
178 are caught and transferred to the main thread to alert
179 the testing framework.
180
181 Note, the server setup function cannot call any blocking
182 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000183 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000184 the blocking call (such as in setting up a client/server
185 connection and performing the accept() in setUp().
186 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000187
188 def __init__(self):
189 # Swap the true setup function
190 self.__setUp = self.setUp
191 self.__tearDown = self.tearDown
192 self.setUp = self._setUp
193 self.tearDown = self._tearDown
194
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000195 def serverExplicitReady(self):
196 """This method allows the server to explicitly indicate that
197 it wants the client thread to proceed. This is useful if the
198 server is about to execute a blocking routine that is
199 dependent upon the client thread during its setup routine."""
200 self.server_ready.set()
201
Guido van Rossum24e4af82002-06-12 19:18:08 +0000202 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000203 self.server_ready = threading.Event()
204 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000205 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000206 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200207 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000208
209 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000210 methodname = self.id()
211 i = methodname.rfind('.')
212 methodname = methodname[i+1:]
213 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000214 self.client_thread = thread.start_new_thread(
215 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000216
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200217 try:
218 self.__setUp()
219 except:
220 self.server_crashed = True
221 raise
222 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000223 self.server_ready.set()
224 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000225
226 def _tearDown(self):
227 self.__tearDown()
228 self.done.wait()
229
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000230 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000231 exc = self.queue.get()
232 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233
234 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000235 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200237 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200238 if self.server_crashed:
239 self.clientTearDown()
240 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000241 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000242 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000243 try:
244 test_func()
Antoine Pitroub7eb5632012-06-24 01:34:13 +0200245 except _ExpectedFailure:
Nick Coghlan2496f332011-09-19 20:26:31 +1000246 # We deliberately ignore expected failures
247 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000248 except BaseException as e:
249 self.queue.put(e)
250 finally:
251 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000252
253 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000254 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000255
256 def clientTearDown(self):
257 self.done.set()
258 thread.exit()
259
260class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
261
262 def __init__(self, methodName='runTest'):
263 SocketTCPTest.__init__(self, methodName=methodName)
264 ThreadableTest.__init__(self)
265
266 def clientSetUp(self):
267 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
268
269 def clientTearDown(self):
270 self.cli.close()
271 self.cli = None
272 ThreadableTest.clientTearDown(self)
273
274class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
275
276 def __init__(self, methodName='runTest'):
277 SocketUDPTest.__init__(self, methodName=methodName)
278 ThreadableTest.__init__(self)
279
280 def clientSetUp(self):
281 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
282
Brian Curtin3beb38f2010-11-04 03:41:43 +0000283 def clientTearDown(self):
284 self.cli.close()
285 self.cli = None
286 ThreadableTest.clientTearDown(self)
287
Charles-François Natali47413c12011-10-06 19:47:44 +0200288class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
289
290 def __init__(self, methodName='runTest'):
291 SocketCANTest.__init__(self, methodName=methodName)
292 ThreadableTest.__init__(self)
293
294 def clientSetUp(self):
295 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
296 try:
297 self.cli.bind((self.interface,))
298 except socket.error:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200299 # skipTest should not be called here, and will be called in the
300 # server instead
301 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200302
303 def clientTearDown(self):
304 self.cli.close()
305 self.cli = None
306 ThreadableTest.clientTearDown(self)
307
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100308class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
309
310 def __init__(self, methodName='runTest'):
311 SocketRDSTest.__init__(self, methodName=methodName)
312 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100313
314 def clientSetUp(self):
315 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
316 try:
317 # RDS sockets must be bound explicitly to send or receive data
318 self.cli.bind((HOST, 0))
319 self.cli_addr = self.cli.getsockname()
320 except OSError:
321 # skipTest should not be called here, and will be called in the
322 # server instead
323 pass
324
325 def clientTearDown(self):
326 self.cli.close()
327 self.cli = None
328 ThreadableTest.clientTearDown(self)
329
Guido van Rossum24e4af82002-06-12 19:18:08 +0000330class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000331 """Socket tests for client-server connection.
332
333 self.cli_conn is a client socket connected to the server. The
334 setUp() method guarantees that it is connected to the server.
335 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000336
337 def __init__(self, methodName='runTest'):
338 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
339
340 def setUp(self):
341 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000342 # Indicate explicitly we're ready for the client thread to
343 # proceed and then perform the blocking call to accept
344 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000345 conn, addr = self.serv.accept()
346 self.cli_conn = conn
347
348 def tearDown(self):
349 self.cli_conn.close()
350 self.cli_conn = None
351 ThreadedTCPSocketTest.tearDown(self)
352
353 def clientSetUp(self):
354 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000355 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356 self.serv_conn = self.cli
357
358 def clientTearDown(self):
359 self.serv_conn.close()
360 self.serv_conn = None
361 ThreadedTCPSocketTest.clientTearDown(self)
362
Dave Cole331708b2004-08-09 04:51:41 +0000363class SocketPairTest(unittest.TestCase, ThreadableTest):
364
365 def __init__(self, methodName='runTest'):
366 unittest.TestCase.__init__(self, methodName=methodName)
367 ThreadableTest.__init__(self)
368
369 def setUp(self):
370 self.serv, self.cli = socket.socketpair()
371
372 def tearDown(self):
373 self.serv.close()
374 self.serv = None
375
376 def clientSetUp(self):
377 pass
378
379 def clientTearDown(self):
380 self.cli.close()
381 self.cli = None
382 ThreadableTest.clientTearDown(self)
383
Tim Peters494aaee2004-08-09 18:54:11 +0000384
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000385# The following classes are used by the sendmsg()/recvmsg() tests.
386# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
387# gives a drop-in replacement for SocketConnectedTest, but different
388# address families can be used, and the attributes serv_addr and
389# cli_addr will be set to the addresses of the endpoints.
390
391class SocketTestBase(unittest.TestCase):
392 """A base class for socket tests.
393
394 Subclasses must provide methods newSocket() to return a new socket
395 and bindSock(sock) to bind it to an unused address.
396
397 Creates a socket self.serv and sets self.serv_addr to its address.
398 """
399
400 def setUp(self):
401 self.serv = self.newSocket()
402 self.bindServer()
403
404 def bindServer(self):
405 """Bind server socket and set self.serv_addr to its address."""
406 self.bindSock(self.serv)
407 self.serv_addr = self.serv.getsockname()
408
409 def tearDown(self):
410 self.serv.close()
411 self.serv = None
412
413
414class SocketListeningTestMixin(SocketTestBase):
415 """Mixin to listen on the server socket."""
416
417 def setUp(self):
418 super().setUp()
419 self.serv.listen(1)
420
421
422class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
423 ThreadableTest):
424 """Mixin to add client socket and allow client/server tests.
425
426 Client socket is self.cli and its address is self.cli_addr. See
427 ThreadableTest for usage information.
428 """
429
430 def __init__(self, *args, **kwargs):
431 super().__init__(*args, **kwargs)
432 ThreadableTest.__init__(self)
433
434 def clientSetUp(self):
435 self.cli = self.newClientSocket()
436 self.bindClient()
437
438 def newClientSocket(self):
439 """Return a new socket for use as client."""
440 return self.newSocket()
441
442 def bindClient(self):
443 """Bind client socket and set self.cli_addr to its address."""
444 self.bindSock(self.cli)
445 self.cli_addr = self.cli.getsockname()
446
447 def clientTearDown(self):
448 self.cli.close()
449 self.cli = None
450 ThreadableTest.clientTearDown(self)
451
452
453class ConnectedStreamTestMixin(SocketListeningTestMixin,
454 ThreadedSocketTestMixin):
455 """Mixin to allow client/server stream tests with connected client.
456
457 Server's socket representing connection to client is self.cli_conn
458 and client's connection to server is self.serv_conn. (Based on
459 SocketConnectedTest.)
460 """
461
462 def setUp(self):
463 super().setUp()
464 # Indicate explicitly we're ready for the client thread to
465 # proceed and then perform the blocking call to accept
466 self.serverExplicitReady()
467 conn, addr = self.serv.accept()
468 self.cli_conn = conn
469
470 def tearDown(self):
471 self.cli_conn.close()
472 self.cli_conn = None
473 super().tearDown()
474
475 def clientSetUp(self):
476 super().clientSetUp()
477 self.cli.connect(self.serv_addr)
478 self.serv_conn = self.cli
479
480 def clientTearDown(self):
481 self.serv_conn.close()
482 self.serv_conn = None
483 super().clientTearDown()
484
485
486class UnixSocketTestBase(SocketTestBase):
487 """Base class for Unix-domain socket tests."""
488
489 # This class is used for file descriptor passing tests, so we
490 # create the sockets in a private directory so that other users
491 # can't send anything that might be problematic for a privileged
492 # user running the tests.
493
494 def setUp(self):
495 self.dir_path = tempfile.mkdtemp()
496 self.addCleanup(os.rmdir, self.dir_path)
497 super().setUp()
498
499 def bindSock(self, sock):
500 path = tempfile.mktemp(dir=self.dir_path)
501 sock.bind(path)
502 self.addCleanup(support.unlink, path)
503
504class UnixStreamBase(UnixSocketTestBase):
505 """Base class for Unix-domain SOCK_STREAM tests."""
506
507 def newSocket(self):
508 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
509
510
511class InetTestBase(SocketTestBase):
512 """Base class for IPv4 socket tests."""
513
514 host = HOST
515
516 def setUp(self):
517 super().setUp()
518 self.port = self.serv_addr[1]
519
520 def bindSock(self, sock):
521 support.bind_port(sock, host=self.host)
522
523class TCPTestBase(InetTestBase):
524 """Base class for TCP-over-IPv4 tests."""
525
526 def newSocket(self):
527 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
528
529class UDPTestBase(InetTestBase):
530 """Base class for UDP-over-IPv4 tests."""
531
532 def newSocket(self):
533 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
534
535class SCTPStreamBase(InetTestBase):
536 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
537
538 def newSocket(self):
539 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
540 socket.IPPROTO_SCTP)
541
542
543class Inet6TestBase(InetTestBase):
544 """Base class for IPv6 socket tests."""
545
546 # Don't use "localhost" here - it may not have an IPv6 address
547 # assigned to it by default (e.g. in /etc/hosts), and if someone
548 # has assigned it an IPv4-mapped address, then it's unlikely to
549 # work with the full IPv6 API.
550 host = "::1"
551
552class UDP6TestBase(Inet6TestBase):
553 """Base class for UDP-over-IPv6 tests."""
554
555 def newSocket(self):
556 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
557
558
559# Test-skipping decorators for use with ThreadableTest.
560
561def skipWithClientIf(condition, reason):
562 """Skip decorated test if condition is true, add client_skip decorator.
563
564 If the decorated object is not a class, sets its attribute
565 "client_skip" to a decorator which will return an empty function
566 if the test is to be skipped, or the original function if it is
567 not. This can be used to avoid running the client part of a
568 skipped test when using ThreadableTest.
569 """
570 def client_pass(*args, **kwargs):
571 pass
572 def skipdec(obj):
573 retval = unittest.skip(reason)(obj)
574 if not isinstance(obj, type):
575 retval.client_skip = lambda f: client_pass
576 return retval
577 def noskipdec(obj):
578 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
579 obj.client_skip = lambda f: f
580 return obj
581 return skipdec if condition else noskipdec
582
583
584def requireAttrs(obj, *attributes):
585 """Skip decorated test if obj is missing any of the given attributes.
586
587 Sets client_skip attribute as skipWithClientIf() does.
588 """
589 missing = [name for name in attributes if not hasattr(obj, name)]
590 return skipWithClientIf(
591 missing, "don't have " + ", ".join(name for name in missing))
592
593
594def requireSocket(*args):
595 """Skip decorated test if a socket cannot be created with given arguments.
596
597 When an argument is given as a string, will use the value of that
598 attribute of the socket module, or skip the test if it doesn't
599 exist. Sets client_skip attribute as skipWithClientIf() does.
600 """
601 err = None
602 missing = [obj for obj in args if
603 isinstance(obj, str) and not hasattr(socket, obj)]
604 if missing:
605 err = "don't have " + ", ".join(name for name in missing)
606 else:
607 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
608 for obj in args]
609 try:
610 s = socket.socket(*callargs)
611 except socket.error as e:
612 # XXX: check errno?
613 err = str(e)
614 else:
615 s.close()
616 return skipWithClientIf(
617 err is not None,
618 "can't create socket({0}): {1}".format(
619 ", ".join(str(o) for o in args), err))
620
621
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622#######################################################################
623## Begin Tests
624
625class GeneralModuleTests(unittest.TestCase):
626
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000627 def test_repr(self):
628 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000629 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000630 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000631
Raymond Hettinger027bb632004-05-31 03:09:25 +0000632 def test_weakref(self):
633 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
634 p = proxy(s)
635 self.assertEqual(p.fileno(), s.fileno())
636 s.close()
637 s = None
638 try:
639 p.fileno()
640 except ReferenceError:
641 pass
642 else:
643 self.fail('Socket proxy still exists')
644
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000646 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300647 msg = "Error raising socket exception (%s)."
648 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300650 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000651 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300652 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000654
Ezio Melotti63e42302011-05-07 19:47:48 +0300655 def testSendtoErrors(self):
656 # Testing that sendto doens't masks failures. See #10169.
657 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
658 self.addCleanup(s.close)
659 s.bind(('', 0))
660 sockname = s.getsockname()
661 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300662 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300663 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300664 self.assertEqual(str(cm.exception),
665 "'str' does not support the buffer interface")
666 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300667 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300668 self.assertEqual(str(cm.exception),
669 "'complex' does not support the buffer interface")
670 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300671 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300672 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300673 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300674 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300675 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300676 self.assertEqual(str(cm.exception),
677 "'str' does not support the buffer interface")
678 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300679 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300680 self.assertEqual(str(cm.exception),
681 "'complex' does not support the buffer interface")
682 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300683 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300684 self.assertIn('not NoneType', str(cm.exception))
685 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300686 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300687 self.assertIn('an integer is required', str(cm.exception))
688 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300689 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300690 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300691 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300692 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300693 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300694 self.assertIn('(1 given)', str(cm.exception))
695 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300696 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300697 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300698
Guido van Rossum24e4af82002-06-12 19:18:08 +0000699 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000700 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 socket.AF_INET
702 socket.SOCK_STREAM
703 socket.SOCK_DGRAM
704 socket.SOCK_RAW
705 socket.SOCK_RDM
706 socket.SOCK_SEQPACKET
707 socket.SOL_SOCKET
708 socket.SO_REUSEADDR
709
Guido van Rossum654c11e2002-06-13 20:24:17 +0000710 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000711 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000712 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000713 try:
714 ip = socket.gethostbyname(hostname)
715 except socket.error:
716 # Probably name lookup wasn't set up right; skip this test
717 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000718 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000719 try:
720 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
721 except socket.error:
722 # Probably a similar problem as above; skip this test
723 return
Brett Cannon01668a12005-03-11 00:04:17 +0000724 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000725 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000726 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000727 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000728
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000729 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
730 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
731 def test_sethostname(self):
732 oldhn = socket.gethostname()
733 try:
734 socket.sethostname('new')
735 except socket.error as e:
736 if e.errno == errno.EPERM:
737 self.skipTest("test should be run as root")
738 else:
739 raise
740 try:
741 # running test as root!
742 self.assertEqual(socket.gethostname(), 'new')
743 # Should work with bytes objects too
744 socket.sethostname(b'bar')
745 self.assertEqual(socket.gethostname(), 'bar')
746 finally:
747 socket.sethostname(oldhn)
748
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700749 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
750 'socket.if_nameindex() not available.')
751 def testInterfaceNameIndex(self):
752 interfaces = socket.if_nameindex()
753 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200754 self.assertIsInstance(index, int)
755 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700756 # interface indices are non-zero integers
757 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200758 _index = socket.if_nametoindex(name)
759 self.assertIsInstance(_index, int)
760 self.assertEqual(index, _index)
761 _name = socket.if_indextoname(index)
762 self.assertIsInstance(_name, str)
763 self.assertEqual(name, _name)
764
765 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
766 'socket.if_nameindex() not available.')
767 def testInvalidInterfaceNameIndex(self):
768 # test nonexistent interface index/name
769 self.assertRaises(socket.error, socket.if_indextoname, 0)
770 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
771 # test with invalid values
772 self.assertRaises(TypeError, socket.if_nametoindex, 0)
773 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700774
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000775 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000776 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000777 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778 try:
779 # On some versions, this loses a reference
780 orig = sys.getrefcount(__name__)
781 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000782 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000783 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000785
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788 try:
789 # On some versions, this crashes the interpreter.
790 socket.getnameinfo(('x', 0, 0, 0), 0)
791 except socket.error:
792 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000793
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000794 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000795 # This just checks that htons etc. are their own inverse,
796 # when looking at the lower 16 or 32 bits.
797 sizes = {socket.htonl: 32, socket.ntohl: 32,
798 socket.htons: 16, socket.ntohs: 16}
799 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000800 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000801 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
802 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000803
Guido van Rossuma2627af2002-09-14 00:58:46 +0000804 swapped = func(mask)
805 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000806 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000807
Guido van Rossum018919a2007-01-15 00:07:32 +0000808 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000809 good_values = [ 1, 2, 3, 1, 2, 3 ]
810 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000811 for k in good_values:
812 socket.ntohl(k)
813 socket.ntohs(k)
814 socket.htonl(k)
815 socket.htons(k)
816 for k in bad_values:
817 self.assertRaises(OverflowError, socket.ntohl, k)
818 self.assertRaises(OverflowError, socket.ntohs, k)
819 self.assertRaises(OverflowError, socket.htonl, k)
820 self.assertRaises(OverflowError, socket.htons, k)
821
Barry Warsaw11b91a02004-06-28 00:50:43 +0000822 def testGetServBy(self):
823 eq = self.assertEqual
824 # Find one service that exists, then check all the related interfaces.
825 # I've ordered this by protocols that have both a tcp and udp
826 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200827 if (sys.platform.startswith(('freebsd', 'netbsd'))
828 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000829 # avoid the 'echo' service on this platform, as there is an
830 # assumption breaking non-standard port/protocol entry
831 services = ('daytime', 'qotd', 'domain')
832 else:
833 services = ('echo', 'daytime', 'domain')
834 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000835 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000836 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000837 break
838 except socket.error:
839 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000840 else:
841 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000842 # Try same call with optional protocol omitted
843 port2 = socket.getservbyname(service)
844 eq(port, port2)
845 # Try udp, but don't barf it it doesn't exist
846 try:
847 udpport = socket.getservbyname(service, 'udp')
848 except socket.error:
849 udpport = None
850 else:
851 eq(udpport, port)
852 # Now make sure the lookup by port returns the same service name
853 eq(socket.getservbyport(port2), service)
854 eq(socket.getservbyport(port, 'tcp'), service)
855 if udpport is not None:
856 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000857 # Make sure getservbyport does not accept out of range ports.
858 self.assertRaises(OverflowError, socket.getservbyport, -1)
859 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000861 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000862 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000863 # The default timeout should initially be None
864 self.assertEqual(socket.getdefaulttimeout(), None)
865 s = socket.socket()
866 self.assertEqual(s.gettimeout(), None)
867 s.close()
868
869 # Set the default timeout to 10, and see if it propagates
870 socket.setdefaulttimeout(10)
871 self.assertEqual(socket.getdefaulttimeout(), 10)
872 s = socket.socket()
873 self.assertEqual(s.gettimeout(), 10)
874 s.close()
875
876 # Reset the default timeout to None, and see if it propagates
877 socket.setdefaulttimeout(None)
878 self.assertEqual(socket.getdefaulttimeout(), None)
879 s = socket.socket()
880 self.assertEqual(s.gettimeout(), None)
881 s.close()
882
883 # Check that setting it to an invalid value raises ValueError
884 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
885
886 # Check that setting it to an invalid type raises TypeError
887 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
888
Benjamin Petersonf91df042009-02-13 02:50:59 +0000889 def testIPv4_inet_aton_fourbytes(self):
890 if not hasattr(socket, 'inet_aton'):
891 return # No inet_aton, nothing to check
892 # Test that issue1008086 and issue767150 are fixed.
893 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000894 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
895 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000896
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000897 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000898 if not hasattr(socket, 'inet_pton'):
899 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000900 from socket import inet_aton as f, inet_pton, AF_INET
901 g = lambda a: inet_pton(AF_INET, a)
902
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100903 assertInvalid = lambda func,a: self.assertRaises(
904 (socket.error, ValueError), func, a
905 )
906
Ezio Melottib3aedd42010-11-20 19:04:17 +0000907 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
908 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
909 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
910 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
911 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100912 assertInvalid(f, '0.0.0.')
913 assertInvalid(f, '300.0.0.0')
914 assertInvalid(f, 'a.0.0.0')
915 assertInvalid(f, '1.2.3.4.5')
916 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000917
Ezio Melottib3aedd42010-11-20 19:04:17 +0000918 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
919 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
920 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
921 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100922 assertInvalid(g, '0.0.0.')
923 assertInvalid(g, '300.0.0.0')
924 assertInvalid(g, 'a.0.0.0')
925 assertInvalid(g, '1.2.3.4.5')
926 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000927
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000928 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000929 if not hasattr(socket, 'inet_pton'):
930 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000931 try:
932 from socket import inet_pton, AF_INET6, has_ipv6
933 if not has_ipv6:
934 return
935 except ImportError:
936 return
937 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100938 assertInvalid = lambda a: self.assertRaises(
939 (socket.error, ValueError), f, a
940 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000941
Ezio Melottib3aedd42010-11-20 19:04:17 +0000942 self.assertEqual(b'\x00' * 16, f('::'))
943 self.assertEqual(b'\x00' * 16, f('0::0'))
944 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
945 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000946 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 +0000947 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
948 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100949 self.assertEqual(
950 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
951 f('ad42:abc::127:0:254:2')
952 )
953 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
954 assertInvalid('0x20::')
955 assertInvalid(':::')
956 assertInvalid('::0::')
957 assertInvalid('1::abc::')
958 assertInvalid('1::abc::def')
959 assertInvalid('1:2:3:4:5:6:')
960 assertInvalid('1:2:3:4:5:6')
961 assertInvalid('1:2:3:4:5:6:7:8:')
962 assertInvalid('1:2:3:4:5:6:7:8:0')
963
964 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
965 f('::254.42.23.64')
966 )
967 self.assertEqual(
968 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
969 f('42::a29b:254.42.23.64')
970 )
971 self.assertEqual(
972 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
973 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
974 )
975 assertInvalid('255.254.253.252')
976 assertInvalid('1::260.2.3.0')
977 assertInvalid('1::0.be.e.0')
978 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
979 assertInvalid('::1.2.3.4:0')
980 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +0000981
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000982 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000983 if not hasattr(socket, 'inet_ntop'):
984 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000985 from socket import inet_ntoa as f, inet_ntop, AF_INET
986 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100987 assertInvalid = lambda func,a: self.assertRaises(
988 (socket.error, ValueError), func, a
989 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000990
Ezio Melottib3aedd42010-11-20 19:04:17 +0000991 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
992 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
993 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
994 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100995 assertInvalid(f, b'\x00' * 3)
996 assertInvalid(f, b'\x00' * 5)
997 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +0000998
Ezio Melottib3aedd42010-11-20 19:04:17 +0000999 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1000 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1001 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001002 assertInvalid(g, b'\x00' * 3)
1003 assertInvalid(g, b'\x00' * 5)
1004 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001005
1006 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001007 if not hasattr(socket, 'inet_ntop'):
1008 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001009 try:
1010 from socket import inet_ntop, AF_INET6, has_ipv6
1011 if not has_ipv6:
1012 return
1013 except ImportError:
1014 return
1015 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001016 assertInvalid = lambda a: self.assertRaises(
1017 (socket.error, ValueError), f, a
1018 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001019
Ezio Melottib3aedd42010-11-20 19:04:17 +00001020 self.assertEqual('::', f(b'\x00' * 16))
1021 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1022 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001023 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001024 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 +00001025 )
1026
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001027 assertInvalid(b'\x12' * 15)
1028 assertInvalid(b'\x12' * 17)
1029 assertInvalid(b'\x12' * 4)
1030
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001031 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001032
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001033 def testSockName(self):
1034 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001035 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001036 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001037 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001038 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001039 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001040 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1041 # it reasonable to get the host's addr in addition to 0.0.0.0.
1042 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001043 try:
1044 my_ip_addr = socket.gethostbyname(socket.gethostname())
1045 except socket.error:
1046 # Probably name lookup wasn't set up right; skip this test
1047 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001048 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001049 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050
1051 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001052 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001053 # We know a socket should start without reuse==0
1054 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001055 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001056 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001057 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058
1059 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001060 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001062 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001063 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1064 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001065 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001067 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001068 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001069 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1070 sock.settimeout(1)
1071 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001072 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001073
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074 def testNewAttributes(self):
1075 # testing .family, .type and .protocol
1076 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1077 self.assertEqual(sock.family, socket.AF_INET)
1078 self.assertEqual(sock.type, socket.SOCK_STREAM)
1079 self.assertEqual(sock.proto, 0)
1080 sock.close()
1081
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001082 def test_getsockaddrarg(self):
1083 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001084 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001085 big_port = port + 65536
1086 neg_port = port - 65536
1087 sock = socket.socket()
1088 try:
1089 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1090 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1091 sock.bind((host, port))
1092 finally:
1093 sock.close()
1094
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001095 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001096 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001097 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1098 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1099 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1100 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001101 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1102 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001103 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001104 self.assertRaises(ValueError, s.ioctl, -1, None)
1105 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001106
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001107 def testGetaddrinfo(self):
1108 try:
1109 socket.getaddrinfo('localhost', 80)
1110 except socket.gaierror as err:
1111 if err.errno == socket.EAI_SERVICE:
1112 # see http://bugs.python.org/issue1282647
1113 self.skipTest("buggy libc version")
1114 raise
1115 # len of every sequence is supposed to be == 5
1116 for info in socket.getaddrinfo(HOST, None):
1117 self.assertEqual(len(info), 5)
1118 # host can be a domain name, a string representation of an
1119 # IPv4/v6 address or None
1120 socket.getaddrinfo('localhost', 80)
1121 socket.getaddrinfo('127.0.0.1', 80)
1122 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001123 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001124 socket.getaddrinfo('::1', 80)
1125 # port can be a string service name such as "http", a numeric
1126 # port number or None
1127 socket.getaddrinfo(HOST, "http")
1128 socket.getaddrinfo(HOST, 80)
1129 socket.getaddrinfo(HOST, None)
1130 # test family and socktype filters
1131 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1132 for family, _, _, _, _ in infos:
1133 self.assertEqual(family, socket.AF_INET)
1134 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1135 for _, socktype, _, _, _ in infos:
1136 self.assertEqual(socktype, socket.SOCK_STREAM)
1137 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001138 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001139 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1140 # a server willing to support both IPv4 and IPv6 will
1141 # usually do this
1142 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1143 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001144 # test keyword arguments
1145 a = socket.getaddrinfo(HOST, None)
1146 b = socket.getaddrinfo(host=HOST, port=None)
1147 self.assertEqual(a, b)
1148 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1149 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1150 self.assertEqual(a, b)
1151 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1152 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1153 self.assertEqual(a, b)
1154 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1155 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1156 self.assertEqual(a, b)
1157 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1158 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1159 self.assertEqual(a, b)
1160 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1161 socket.AI_PASSIVE)
1162 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1163 type=socket.SOCK_STREAM, proto=0,
1164 flags=socket.AI_PASSIVE)
1165 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001166 # Issue #6697.
1167 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001168
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001169 def test_getnameinfo(self):
1170 # only IP addresses are allowed
1171 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1172
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001173 @unittest.skipUnless(support.is_resource_enabled('network'),
1174 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001175 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001176 # Check for internet access before running test (issue #12804).
1177 try:
1178 socket.gethostbyname('python.org')
1179 except socket.gaierror as e:
1180 if e.errno == socket.EAI_NODATA:
1181 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001182 # these should all be successful
1183 socket.gethostbyname('испытание.python.org')
1184 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001185 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1186 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1187 # have a reverse entry yet
1188 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001189
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001190 def check_sendall_interrupted(self, with_timeout):
1191 # socketpair() is not stricly required, but it makes things easier.
1192 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1193 self.skipTest("signal.alarm and socket.socketpair required for this test")
1194 # Our signal handlers clobber the C errno by calling a math function
1195 # with an invalid domain value.
1196 def ok_handler(*args):
1197 self.assertRaises(ValueError, math.acosh, 0)
1198 def raising_handler(*args):
1199 self.assertRaises(ValueError, math.acosh, 0)
1200 1 // 0
1201 c, s = socket.socketpair()
1202 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1203 try:
1204 if with_timeout:
1205 # Just above the one second minimum for signal.alarm
1206 c.settimeout(1.5)
1207 with self.assertRaises(ZeroDivisionError):
1208 signal.alarm(1)
1209 c.sendall(b"x" * (1024**2))
1210 if with_timeout:
1211 signal.signal(signal.SIGALRM, ok_handler)
1212 signal.alarm(1)
1213 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1214 finally:
1215 signal.signal(signal.SIGALRM, old_alarm)
1216 c.close()
1217 s.close()
1218
1219 def test_sendall_interrupted(self):
1220 self.check_sendall_interrupted(False)
1221
1222 def test_sendall_interrupted_with_timeout(self):
1223 self.check_sendall_interrupted(True)
1224
Antoine Pitroue033e062010-10-29 10:38:18 +00001225 def test_dealloc_warn(self):
1226 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1227 r = repr(sock)
1228 with self.assertWarns(ResourceWarning) as cm:
1229 sock = None
1230 support.gc_collect()
1231 self.assertIn(r, str(cm.warning.args[0]))
1232 # An open socket file object gets dereferenced after the socket
1233 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1234 f = sock.makefile('rb')
1235 r = repr(sock)
1236 sock = None
1237 support.gc_collect()
1238 with self.assertWarns(ResourceWarning):
1239 f = None
1240 support.gc_collect()
1241
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001242 def test_name_closed_socketio(self):
1243 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1244 fp = sock.makefile("rb")
1245 fp.close()
1246 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1247
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001248 def test_pickle(self):
1249 sock = socket.socket()
1250 with sock:
1251 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1252 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1253
Antoine Pitrou3cade992011-05-10 19:19:13 +02001254 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001255 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1256 srv.bind((HOST, 0))
1257 # backlog = 0
1258 srv.listen(0)
1259 srv.close()
1260
Charles-François Natali42663332012-01-02 15:57:30 +01001261 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001262 def test_flowinfo(self):
1263 self.assertRaises(OverflowError, socket.getnameinfo,
1264 ('::1',0, 0xffffffff), 0)
1265 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1266 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1267
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001268
Charles-François Natali47413c12011-10-06 19:47:44 +02001269@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1270class BasicCANTest(unittest.TestCase):
1271
1272 def testCrucialConstants(self):
1273 socket.AF_CAN
1274 socket.PF_CAN
1275 socket.CAN_RAW
1276
1277 def testCreateSocket(self):
1278 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1279 pass
1280
1281 def testBindAny(self):
1282 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1283 s.bind(('', ))
1284
1285 def testTooLongInterfaceName(self):
1286 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1287 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001288 self.assertRaisesRegex(socket.error, 'interface name too long',
1289 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001290
1291 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1292 'socket.CAN_RAW_LOOPBACK required for this test.')
1293 def testLoopback(self):
1294 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1295 for loopback in (0, 1):
1296 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1297 loopback)
1298 self.assertEqual(loopback,
1299 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1300
1301 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1302 'socket.CAN_RAW_FILTER required for this test.')
1303 def testFilter(self):
1304 can_id, can_mask = 0x200, 0x700
1305 can_filter = struct.pack("=II", can_id, can_mask)
1306 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1307 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1308 self.assertEqual(can_filter,
1309 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1310
1311
1312@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1313@unittest.skipUnless(thread, 'Threading required for this test.')
1314class CANTest(ThreadedCANSocketTest):
1315
1316 """The CAN frame structure is defined in <linux/can.h>:
1317
1318 struct can_frame {
1319 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1320 __u8 can_dlc; /* data length code: 0 .. 8 */
1321 __u8 data[8] __attribute__((aligned(8)));
1322 };
1323 """
1324 can_frame_fmt = "=IB3x8s"
1325
1326 def __init__(self, methodName='runTest'):
1327 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1328
1329 @classmethod
1330 def build_can_frame(cls, can_id, data):
1331 """Build a CAN frame."""
1332 can_dlc = len(data)
1333 data = data.ljust(8, b'\x00')
1334 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1335
1336 @classmethod
1337 def dissect_can_frame(cls, frame):
1338 """Dissect a CAN frame."""
1339 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1340 return (can_id, can_dlc, data[:can_dlc])
1341
1342 def testSendFrame(self):
1343 cf, addr = self.s.recvfrom(self.bufsize)
1344 self.assertEqual(self.cf, cf)
1345 self.assertEqual(addr[0], self.interface)
1346 self.assertEqual(addr[1], socket.AF_CAN)
1347
1348 def _testSendFrame(self):
1349 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1350 self.cli.send(self.cf)
1351
1352 def testSendMaxFrame(self):
1353 cf, addr = self.s.recvfrom(self.bufsize)
1354 self.assertEqual(self.cf, cf)
1355
1356 def _testSendMaxFrame(self):
1357 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1358 self.cli.send(self.cf)
1359
1360 def testSendMultiFrames(self):
1361 cf, addr = self.s.recvfrom(self.bufsize)
1362 self.assertEqual(self.cf1, cf)
1363
1364 cf, addr = self.s.recvfrom(self.bufsize)
1365 self.assertEqual(self.cf2, cf)
1366
1367 def _testSendMultiFrames(self):
1368 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1369 self.cli.send(self.cf1)
1370
1371 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1372 self.cli.send(self.cf2)
1373
1374
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001375@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1376class BasicRDSTest(unittest.TestCase):
1377
1378 def testCrucialConstants(self):
1379 socket.AF_RDS
1380 socket.PF_RDS
1381
1382 def testCreateSocket(self):
1383 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1384 pass
1385
1386 def testSocketBufferSize(self):
1387 bufsize = 16384
1388 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1389 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1390 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1391
1392
1393@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1394@unittest.skipUnless(thread, 'Threading required for this test.')
1395class RDSTest(ThreadedRDSSocketTest):
1396
1397 def __init__(self, methodName='runTest'):
1398 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1399
Charles-François Natali240c55f2011-11-10 20:33:36 +01001400 def setUp(self):
1401 super().setUp()
1402 self.evt = threading.Event()
1403
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001404 def testSendAndRecv(self):
1405 data, addr = self.serv.recvfrom(self.bufsize)
1406 self.assertEqual(self.data, data)
1407 self.assertEqual(self.cli_addr, addr)
1408
1409 def _testSendAndRecv(self):
1410 self.data = b'spam'
1411 self.cli.sendto(self.data, 0, (HOST, self.port))
1412
1413 def testPeek(self):
1414 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1415 self.assertEqual(self.data, data)
1416 data, addr = self.serv.recvfrom(self.bufsize)
1417 self.assertEqual(self.data, data)
1418
1419 def _testPeek(self):
1420 self.data = b'spam'
1421 self.cli.sendto(self.data, 0, (HOST, self.port))
1422
1423 @requireAttrs(socket.socket, 'recvmsg')
1424 def testSendAndRecvMsg(self):
1425 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1426 self.assertEqual(self.data, data)
1427
1428 @requireAttrs(socket.socket, 'sendmsg')
1429 def _testSendAndRecvMsg(self):
1430 self.data = b'hello ' * 10
1431 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1432
1433 def testSendAndRecvMulti(self):
1434 data, addr = self.serv.recvfrom(self.bufsize)
1435 self.assertEqual(self.data1, data)
1436
1437 data, addr = self.serv.recvfrom(self.bufsize)
1438 self.assertEqual(self.data2, data)
1439
1440 def _testSendAndRecvMulti(self):
1441 self.data1 = b'bacon'
1442 self.cli.sendto(self.data1, 0, (HOST, self.port))
1443
1444 self.data2 = b'egg'
1445 self.cli.sendto(self.data2, 0, (HOST, self.port))
1446
1447 def testSelect(self):
1448 r, w, x = select.select([self.serv], [], [], 3.0)
1449 self.assertIn(self.serv, r)
1450 data, addr = self.serv.recvfrom(self.bufsize)
1451 self.assertEqual(self.data, data)
1452
1453 def _testSelect(self):
1454 self.data = b'select'
1455 self.cli.sendto(self.data, 0, (HOST, self.port))
1456
1457 def testCongestion(self):
1458 # wait until the sender is done
1459 self.evt.wait()
1460
1461 def _testCongestion(self):
1462 # test the behavior in case of congestion
1463 self.data = b'fill'
1464 self.cli.setblocking(False)
1465 try:
1466 # try to lower the receiver's socket buffer size
1467 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1468 except OSError:
1469 pass
1470 with self.assertRaises(OSError) as cm:
1471 try:
1472 # fill the receiver's socket buffer
1473 while True:
1474 self.cli.sendto(self.data, 0, (HOST, self.port))
1475 finally:
1476 # signal the receiver we're done
1477 self.evt.set()
1478 # sendto() should have failed with ENOBUFS
1479 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1480 # and we should have received a congestion notification through poll
1481 r, w, x = select.select([self.serv], [], [], 3.0)
1482 self.assertIn(self.serv, r)
1483
1484
Victor Stinner45df8202010-04-28 22:31:17 +00001485@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001486class BasicTCPTest(SocketConnectedTest):
1487
1488 def __init__(self, methodName='runTest'):
1489 SocketConnectedTest.__init__(self, methodName=methodName)
1490
1491 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001492 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001493 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001494 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001495
1496 def _testRecv(self):
1497 self.serv_conn.send(MSG)
1498
1499 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001500 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001501 seg1 = self.cli_conn.recv(len(MSG) - 3)
1502 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001503 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001504 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001505
1506 def _testOverFlowRecv(self):
1507 self.serv_conn.send(MSG)
1508
1509 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001510 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001511 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001512 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001513
1514 def _testRecvFrom(self):
1515 self.serv_conn.send(MSG)
1516
1517 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001518 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001519 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1520 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001521 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001522 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001523
1524 def _testOverFlowRecvFrom(self):
1525 self.serv_conn.send(MSG)
1526
1527 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001528 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001529 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001530 while 1:
1531 read = self.cli_conn.recv(1024)
1532 if not read:
1533 break
Guido van Rossume531e292002-08-08 20:28:34 +00001534 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001535 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001536
1537 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001538 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001539 self.serv_conn.sendall(big_chunk)
1540
1541 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001542 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001543 fd = self.cli_conn.fileno()
1544 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001545 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001546 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001547 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001548 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001549
1550 def _testFromFd(self):
1551 self.serv_conn.send(MSG)
1552
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001553 def testDup(self):
1554 # Testing dup()
1555 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001556 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001557 msg = sock.recv(1024)
1558 self.assertEqual(msg, MSG)
1559
1560 def _testDup(self):
1561 self.serv_conn.send(MSG)
1562
Guido van Rossum24e4af82002-06-12 19:18:08 +00001563 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001564 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001565 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001566 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001567 # wait for _testShutdown to finish: on OS X, when the server
1568 # closes the connection the client also becomes disconnected,
1569 # and the client's shutdown call will fail. (Issue #4397.)
1570 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001571
1572 def _testShutdown(self):
1573 self.serv_conn.send(MSG)
1574 self.serv_conn.shutdown(2)
1575
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001576 def testDetach(self):
1577 # Testing detach()
1578 fileno = self.cli_conn.fileno()
1579 f = self.cli_conn.detach()
1580 self.assertEqual(f, fileno)
1581 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001582 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001583 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1584 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001585 # ...but we can create another socket using the (still open)
1586 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001587 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001588 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001589 msg = sock.recv(1024)
1590 self.assertEqual(msg, MSG)
1591
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001592 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001593 self.serv_conn.send(MSG)
1594
Victor Stinner45df8202010-04-28 22:31:17 +00001595@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001596class BasicUDPTest(ThreadedUDPSocketTest):
1597
1598 def __init__(self, methodName='runTest'):
1599 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1600
1601 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001602 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001603 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001604 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001605
1606 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001607 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001608
Guido van Rossum1c938012002-06-12 21:17:20 +00001609 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001610 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001611 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001612 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001613
Guido van Rossum1c938012002-06-12 21:17:20 +00001614 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001615 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001616
Guido van Rossumd8faa362007-04-27 19:54:29 +00001617 def testRecvFromNegative(self):
1618 # Negative lengths passed to recvfrom should give ValueError.
1619 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1620
1621 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001622 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001623
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001624# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1625# same test code is used with different families and types of socket
1626# (e.g. stream, datagram), and tests using recvmsg() are repeated
1627# using recvmsg_into().
1628#
1629# The generic test classes such as SendmsgTests and
1630# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1631# supplied with sockets cli_sock and serv_sock representing the
1632# client's and the server's end of the connection respectively, and
1633# attributes cli_addr and serv_addr holding their (numeric where
1634# appropriate) addresses.
1635#
1636# The final concrete test classes combine these with subclasses of
1637# SocketTestBase which set up client and server sockets of a specific
1638# type, and with subclasses of SendrecvmsgBase such as
1639# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1640# sockets to cli_sock and serv_sock and override the methods and
1641# attributes of SendrecvmsgBase to fill in destination addresses if
1642# needed when sending, check for specific flags in msg_flags, etc.
1643#
1644# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1645# recvmsg_into().
1646
1647# XXX: like the other datagram (UDP) tests in this module, the code
1648# here assumes that datagram delivery on the local machine will be
1649# reliable.
1650
1651class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1652 # Base class for sendmsg()/recvmsg() tests.
1653
1654 # Time in seconds to wait before considering a test failed, or
1655 # None for no timeout. Not all tests actually set a timeout.
1656 fail_timeout = 3.0
1657
1658 def setUp(self):
1659 self.misc_event = threading.Event()
1660 super().setUp()
1661
1662 def sendToServer(self, msg):
1663 # Send msg to the server.
1664 return self.cli_sock.send(msg)
1665
1666 # Tuple of alternative default arguments for sendmsg() when called
1667 # via sendmsgToServer() (e.g. to include a destination address).
1668 sendmsg_to_server_defaults = ()
1669
1670 def sendmsgToServer(self, *args):
1671 # Call sendmsg() on self.cli_sock with the given arguments,
1672 # filling in any arguments which are not supplied with the
1673 # corresponding items of self.sendmsg_to_server_defaults, if
1674 # any.
1675 return self.cli_sock.sendmsg(
1676 *(args + self.sendmsg_to_server_defaults[len(args):]))
1677
1678 def doRecvmsg(self, sock, bufsize, *args):
1679 # Call recvmsg() on sock with given arguments and return its
1680 # result. Should be used for tests which can use either
1681 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1682 # this method with one which emulates it using recvmsg_into(),
1683 # thus allowing the same test to be used for both methods.
1684 result = sock.recvmsg(bufsize, *args)
1685 self.registerRecvmsgResult(result)
1686 return result
1687
1688 def registerRecvmsgResult(self, result):
1689 # Called by doRecvmsg() with the return value of recvmsg() or
1690 # recvmsg_into(). Can be overridden to arrange cleanup based
1691 # on the returned ancillary data, for instance.
1692 pass
1693
1694 def checkRecvmsgAddress(self, addr1, addr2):
1695 # Called to compare the received address with the address of
1696 # the peer.
1697 self.assertEqual(addr1, addr2)
1698
1699 # Flags that are normally unset in msg_flags
1700 msg_flags_common_unset = 0
1701 for name in ("MSG_CTRUNC", "MSG_OOB"):
1702 msg_flags_common_unset |= getattr(socket, name, 0)
1703
1704 # Flags that are normally set
1705 msg_flags_common_set = 0
1706
1707 # Flags set when a complete record has been received (e.g. MSG_EOR
1708 # for SCTP)
1709 msg_flags_eor_indicator = 0
1710
1711 # Flags set when a complete record has not been received
1712 # (e.g. MSG_TRUNC for datagram sockets)
1713 msg_flags_non_eor_indicator = 0
1714
1715 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1716 # Method to check the value of msg_flags returned by recvmsg[_into]().
1717 #
1718 # Checks that all bits in msg_flags_common_set attribute are
1719 # set in "flags" and all bits in msg_flags_common_unset are
1720 # unset.
1721 #
1722 # The "eor" argument specifies whether the flags should
1723 # indicate that a full record (or datagram) has been received.
1724 # If "eor" is None, no checks are done; otherwise, checks
1725 # that:
1726 #
1727 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1728 # set and all bits in msg_flags_non_eor_indicator are unset
1729 #
1730 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1731 # are set and all bits in msg_flags_eor_indicator are unset
1732 #
1733 # If "checkset" and/or "checkunset" are supplied, they require
1734 # the given bits to be set or unset respectively, overriding
1735 # what the attributes require for those bits.
1736 #
1737 # If any bits are set in "ignore", they will not be checked,
1738 # regardless of the other inputs.
1739 #
1740 # Will raise Exception if the inputs require a bit to be both
1741 # set and unset, and it is not ignored.
1742
1743 defaultset = self.msg_flags_common_set
1744 defaultunset = self.msg_flags_common_unset
1745
1746 if eor:
1747 defaultset |= self.msg_flags_eor_indicator
1748 defaultunset |= self.msg_flags_non_eor_indicator
1749 elif eor is not None:
1750 defaultset |= self.msg_flags_non_eor_indicator
1751 defaultunset |= self.msg_flags_eor_indicator
1752
1753 # Function arguments override defaults
1754 defaultset &= ~checkunset
1755 defaultunset &= ~checkset
1756
1757 # Merge arguments with remaining defaults, and check for conflicts
1758 checkset |= defaultset
1759 checkunset |= defaultunset
1760 inboth = checkset & checkunset & ~ignore
1761 if inboth:
1762 raise Exception("contradictory set, unset requirements for flags "
1763 "{0:#x}".format(inboth))
1764
1765 # Compare with given msg_flags value
1766 mask = (checkset | checkunset) & ~ignore
1767 self.assertEqual(flags & mask, checkset & mask)
1768
1769
1770class RecvmsgIntoMixin(SendrecvmsgBase):
1771 # Mixin to implement doRecvmsg() using recvmsg_into().
1772
1773 def doRecvmsg(self, sock, bufsize, *args):
1774 buf = bytearray(bufsize)
1775 result = sock.recvmsg_into([buf], *args)
1776 self.registerRecvmsgResult(result)
1777 self.assertGreaterEqual(result[0], 0)
1778 self.assertLessEqual(result[0], bufsize)
1779 return (bytes(buf[:result[0]]),) + result[1:]
1780
1781
1782class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1783 # Defines flags to be checked in msg_flags for datagram sockets.
1784
1785 @property
1786 def msg_flags_non_eor_indicator(self):
1787 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1788
1789
1790class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1791 # Defines flags to be checked in msg_flags for SCTP sockets.
1792
1793 @property
1794 def msg_flags_eor_indicator(self):
1795 return super().msg_flags_eor_indicator | socket.MSG_EOR
1796
1797
1798class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1799 # Base class for tests on connectionless-mode sockets. Users must
1800 # supply sockets on attributes cli and serv to be mapped to
1801 # cli_sock and serv_sock respectively.
1802
1803 @property
1804 def serv_sock(self):
1805 return self.serv
1806
1807 @property
1808 def cli_sock(self):
1809 return self.cli
1810
1811 @property
1812 def sendmsg_to_server_defaults(self):
1813 return ([], [], 0, self.serv_addr)
1814
1815 def sendToServer(self, msg):
1816 return self.cli_sock.sendto(msg, self.serv_addr)
1817
1818
1819class SendrecvmsgConnectedBase(SendrecvmsgBase):
1820 # Base class for tests on connected sockets. Users must supply
1821 # sockets on attributes serv_conn and cli_conn (representing the
1822 # connections *to* the server and the client), to be mapped to
1823 # cli_sock and serv_sock respectively.
1824
1825 @property
1826 def serv_sock(self):
1827 return self.cli_conn
1828
1829 @property
1830 def cli_sock(self):
1831 return self.serv_conn
1832
1833 def checkRecvmsgAddress(self, addr1, addr2):
1834 # Address is currently "unspecified" for a connected socket,
1835 # so we don't examine it
1836 pass
1837
1838
1839class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1840 # Base class to set a timeout on server's socket.
1841
1842 def setUp(self):
1843 super().setUp()
1844 self.serv_sock.settimeout(self.fail_timeout)
1845
1846
1847class SendmsgTests(SendrecvmsgServerTimeoutBase):
1848 # Tests for sendmsg() which can use any socket type and do not
1849 # involve recvmsg() or recvmsg_into().
1850
1851 def testSendmsg(self):
1852 # Send a simple message with sendmsg().
1853 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1854
1855 def _testSendmsg(self):
1856 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1857
1858 def testSendmsgDataGenerator(self):
1859 # Send from buffer obtained from a generator (not a sequence).
1860 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1861
1862 def _testSendmsgDataGenerator(self):
1863 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1864 len(MSG))
1865
1866 def testSendmsgAncillaryGenerator(self):
1867 # Gather (empty) ancillary data from a generator.
1868 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1869
1870 def _testSendmsgAncillaryGenerator(self):
1871 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1872 len(MSG))
1873
1874 def testSendmsgArray(self):
1875 # Send data from an array instead of the usual bytes object.
1876 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1877
1878 def _testSendmsgArray(self):
1879 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1880 len(MSG))
1881
1882 def testSendmsgGather(self):
1883 # Send message data from more than one buffer (gather write).
1884 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1885
1886 def _testSendmsgGather(self):
1887 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1888
1889 def testSendmsgBadArgs(self):
1890 # Check that sendmsg() rejects invalid arguments.
1891 self.assertEqual(self.serv_sock.recv(1000), b"done")
1892
1893 def _testSendmsgBadArgs(self):
1894 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1895 self.assertRaises(TypeError, self.sendmsgToServer,
1896 b"not in an iterable")
1897 self.assertRaises(TypeError, self.sendmsgToServer,
1898 object())
1899 self.assertRaises(TypeError, self.sendmsgToServer,
1900 [object()])
1901 self.assertRaises(TypeError, self.sendmsgToServer,
1902 [MSG, object()])
1903 self.assertRaises(TypeError, self.sendmsgToServer,
1904 [MSG], object())
1905 self.assertRaises(TypeError, self.sendmsgToServer,
1906 [MSG], [], object())
1907 self.assertRaises(TypeError, self.sendmsgToServer,
1908 [MSG], [], 0, object())
1909 self.sendToServer(b"done")
1910
1911 def testSendmsgBadCmsg(self):
1912 # Check that invalid ancillary data items are rejected.
1913 self.assertEqual(self.serv_sock.recv(1000), b"done")
1914
1915 def _testSendmsgBadCmsg(self):
1916 self.assertRaises(TypeError, self.sendmsgToServer,
1917 [MSG], [object()])
1918 self.assertRaises(TypeError, self.sendmsgToServer,
1919 [MSG], [(object(), 0, b"data")])
1920 self.assertRaises(TypeError, self.sendmsgToServer,
1921 [MSG], [(0, object(), b"data")])
1922 self.assertRaises(TypeError, self.sendmsgToServer,
1923 [MSG], [(0, 0, object())])
1924 self.assertRaises(TypeError, self.sendmsgToServer,
1925 [MSG], [(0, 0)])
1926 self.assertRaises(TypeError, self.sendmsgToServer,
1927 [MSG], [(0, 0, b"data", 42)])
1928 self.sendToServer(b"done")
1929
1930 @requireAttrs(socket, "CMSG_SPACE")
1931 def testSendmsgBadMultiCmsg(self):
1932 # Check that invalid ancillary data items are rejected when
1933 # more than one item is present.
1934 self.assertEqual(self.serv_sock.recv(1000), b"done")
1935
1936 @testSendmsgBadMultiCmsg.client_skip
1937 def _testSendmsgBadMultiCmsg(self):
1938 self.assertRaises(TypeError, self.sendmsgToServer,
1939 [MSG], [0, 0, b""])
1940 self.assertRaises(TypeError, self.sendmsgToServer,
1941 [MSG], [(0, 0, b""), object()])
1942 self.sendToServer(b"done")
1943
1944 def testSendmsgExcessCmsgReject(self):
1945 # Check that sendmsg() rejects excess ancillary data items
1946 # when the number that can be sent is limited.
1947 self.assertEqual(self.serv_sock.recv(1000), b"done")
1948
1949 def _testSendmsgExcessCmsgReject(self):
1950 if not hasattr(socket, "CMSG_SPACE"):
1951 # Can only send one item
1952 with self.assertRaises(socket.error) as cm:
1953 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1954 self.assertIsNone(cm.exception.errno)
1955 self.sendToServer(b"done")
1956
1957 def testSendmsgAfterClose(self):
1958 # Check that sendmsg() fails on a closed socket.
1959 pass
1960
1961 def _testSendmsgAfterClose(self):
1962 self.cli_sock.close()
1963 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1964
1965
1966class SendmsgStreamTests(SendmsgTests):
1967 # Tests for sendmsg() which require a stream socket and do not
1968 # involve recvmsg() or recvmsg_into().
1969
1970 def testSendmsgExplicitNoneAddr(self):
1971 # Check that peer address can be specified as None.
1972 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1973
1974 def _testSendmsgExplicitNoneAddr(self):
1975 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1976
1977 def testSendmsgTimeout(self):
1978 # Check that timeout works with sendmsg().
1979 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1980 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1981
1982 def _testSendmsgTimeout(self):
1983 try:
1984 self.cli_sock.settimeout(0.03)
1985 with self.assertRaises(socket.timeout):
1986 while True:
1987 self.sendmsgToServer([b"a"*512])
1988 finally:
1989 self.misc_event.set()
1990
1991 # XXX: would be nice to have more tests for sendmsg flags argument.
1992
1993 # Linux supports MSG_DONTWAIT when sending, but in general, it
1994 # only works when receiving. Could add other platforms if they
1995 # support it too.
1996 @skipWithClientIf(sys.platform not in {"linux2"},
1997 "MSG_DONTWAIT not known to work on this platform when "
1998 "sending")
1999 def testSendmsgDontWait(self):
2000 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2001 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2002 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2003
2004 @testSendmsgDontWait.client_skip
2005 def _testSendmsgDontWait(self):
2006 try:
2007 with self.assertRaises(socket.error) as cm:
2008 while True:
2009 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2010 self.assertIn(cm.exception.errno,
2011 (errno.EAGAIN, errno.EWOULDBLOCK))
2012 finally:
2013 self.misc_event.set()
2014
2015
2016class SendmsgConnectionlessTests(SendmsgTests):
2017 # Tests for sendmsg() which require a connectionless-mode
2018 # (e.g. datagram) socket, and do not involve recvmsg() or
2019 # recvmsg_into().
2020
2021 def testSendmsgNoDestAddr(self):
2022 # Check that sendmsg() fails when no destination address is
2023 # given for unconnected socket.
2024 pass
2025
2026 def _testSendmsgNoDestAddr(self):
2027 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2028 [MSG])
2029 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2030 [MSG], [], 0, None)
2031
2032
2033class RecvmsgGenericTests(SendrecvmsgBase):
2034 # Tests for recvmsg() which can also be emulated using
2035 # recvmsg_into(), and can use any socket type.
2036
2037 def testRecvmsg(self):
2038 # Receive a simple message with recvmsg[_into]().
2039 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2040 self.assertEqual(msg, MSG)
2041 self.checkRecvmsgAddress(addr, self.cli_addr)
2042 self.assertEqual(ancdata, [])
2043 self.checkFlags(flags, eor=True)
2044
2045 def _testRecvmsg(self):
2046 self.sendToServer(MSG)
2047
2048 def testRecvmsgExplicitDefaults(self):
2049 # Test recvmsg[_into]() with default arguments provided explicitly.
2050 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2051 len(MSG), 0, 0)
2052 self.assertEqual(msg, MSG)
2053 self.checkRecvmsgAddress(addr, self.cli_addr)
2054 self.assertEqual(ancdata, [])
2055 self.checkFlags(flags, eor=True)
2056
2057 def _testRecvmsgExplicitDefaults(self):
2058 self.sendToServer(MSG)
2059
2060 def testRecvmsgShorter(self):
2061 # Receive a message smaller than buffer.
2062 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2063 len(MSG) + 42)
2064 self.assertEqual(msg, MSG)
2065 self.checkRecvmsgAddress(addr, self.cli_addr)
2066 self.assertEqual(ancdata, [])
2067 self.checkFlags(flags, eor=True)
2068
2069 def _testRecvmsgShorter(self):
2070 self.sendToServer(MSG)
2071
Charles-François Natali8619cd72011-10-03 19:43:15 +02002072 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2073 # datagram is received (issue #13001).
2074 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002075 def testRecvmsgTrunc(self):
2076 # Receive part of message, check for truncation indicators.
2077 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2078 len(MSG) - 3)
2079 self.assertEqual(msg, MSG[:-3])
2080 self.checkRecvmsgAddress(addr, self.cli_addr)
2081 self.assertEqual(ancdata, [])
2082 self.checkFlags(flags, eor=False)
2083
Charles-François Natali8619cd72011-10-03 19:43:15 +02002084 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002085 def _testRecvmsgTrunc(self):
2086 self.sendToServer(MSG)
2087
2088 def testRecvmsgShortAncillaryBuf(self):
2089 # Test ancillary data buffer too small to hold any ancillary data.
2090 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2091 len(MSG), 1)
2092 self.assertEqual(msg, MSG)
2093 self.checkRecvmsgAddress(addr, self.cli_addr)
2094 self.assertEqual(ancdata, [])
2095 self.checkFlags(flags, eor=True)
2096
2097 def _testRecvmsgShortAncillaryBuf(self):
2098 self.sendToServer(MSG)
2099
2100 def testRecvmsgLongAncillaryBuf(self):
2101 # Test large ancillary data buffer.
2102 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2103 len(MSG), 10240)
2104 self.assertEqual(msg, MSG)
2105 self.checkRecvmsgAddress(addr, self.cli_addr)
2106 self.assertEqual(ancdata, [])
2107 self.checkFlags(flags, eor=True)
2108
2109 def _testRecvmsgLongAncillaryBuf(self):
2110 self.sendToServer(MSG)
2111
2112 def testRecvmsgAfterClose(self):
2113 # Check that recvmsg[_into]() fails on a closed socket.
2114 self.serv_sock.close()
2115 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2116
2117 def _testRecvmsgAfterClose(self):
2118 pass
2119
2120 def testRecvmsgTimeout(self):
2121 # Check that timeout works.
2122 try:
2123 self.serv_sock.settimeout(0.03)
2124 self.assertRaises(socket.timeout,
2125 self.doRecvmsg, self.serv_sock, len(MSG))
2126 finally:
2127 self.misc_event.set()
2128
2129 def _testRecvmsgTimeout(self):
2130 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2131
2132 @requireAttrs(socket, "MSG_PEEK")
2133 def testRecvmsgPeek(self):
2134 # Check that MSG_PEEK in flags enables examination of pending
2135 # data without consuming it.
2136
2137 # Receive part of data with MSG_PEEK.
2138 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2139 len(MSG) - 3, 0,
2140 socket.MSG_PEEK)
2141 self.assertEqual(msg, MSG[:-3])
2142 self.checkRecvmsgAddress(addr, self.cli_addr)
2143 self.assertEqual(ancdata, [])
2144 # Ignoring MSG_TRUNC here (so this test is the same for stream
2145 # and datagram sockets). Some wording in POSIX seems to
2146 # suggest that it needn't be set when peeking, but that may
2147 # just be a slip.
2148 self.checkFlags(flags, eor=False,
2149 ignore=getattr(socket, "MSG_TRUNC", 0))
2150
2151 # Receive all data with MSG_PEEK.
2152 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2153 len(MSG), 0,
2154 socket.MSG_PEEK)
2155 self.assertEqual(msg, MSG)
2156 self.checkRecvmsgAddress(addr, self.cli_addr)
2157 self.assertEqual(ancdata, [])
2158 self.checkFlags(flags, eor=True)
2159
2160 # Check that the same data can still be received normally.
2161 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2162 self.assertEqual(msg, MSG)
2163 self.checkRecvmsgAddress(addr, self.cli_addr)
2164 self.assertEqual(ancdata, [])
2165 self.checkFlags(flags, eor=True)
2166
2167 @testRecvmsgPeek.client_skip
2168 def _testRecvmsgPeek(self):
2169 self.sendToServer(MSG)
2170
2171 @requireAttrs(socket.socket, "sendmsg")
2172 def testRecvmsgFromSendmsg(self):
2173 # Test receiving with recvmsg[_into]() when message is sent
2174 # using sendmsg().
2175 self.serv_sock.settimeout(self.fail_timeout)
2176 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2177 self.assertEqual(msg, MSG)
2178 self.checkRecvmsgAddress(addr, self.cli_addr)
2179 self.assertEqual(ancdata, [])
2180 self.checkFlags(flags, eor=True)
2181
2182 @testRecvmsgFromSendmsg.client_skip
2183 def _testRecvmsgFromSendmsg(self):
2184 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2185
2186
2187class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2188 # Tests which require a stream socket and can use either recvmsg()
2189 # or recvmsg_into().
2190
2191 def testRecvmsgEOF(self):
2192 # Receive end-of-stream indicator (b"", peer socket closed).
2193 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2194 self.assertEqual(msg, b"")
2195 self.checkRecvmsgAddress(addr, self.cli_addr)
2196 self.assertEqual(ancdata, [])
2197 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2198
2199 def _testRecvmsgEOF(self):
2200 self.cli_sock.close()
2201
2202 def testRecvmsgOverflow(self):
2203 # Receive a message in more than one chunk.
2204 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2205 len(MSG) - 3)
2206 self.checkRecvmsgAddress(addr, self.cli_addr)
2207 self.assertEqual(ancdata, [])
2208 self.checkFlags(flags, eor=False)
2209
2210 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2211 self.checkRecvmsgAddress(addr, self.cli_addr)
2212 self.assertEqual(ancdata, [])
2213 self.checkFlags(flags, eor=True)
2214
2215 msg = seg1 + seg2
2216 self.assertEqual(msg, MSG)
2217
2218 def _testRecvmsgOverflow(self):
2219 self.sendToServer(MSG)
2220
2221
2222class RecvmsgTests(RecvmsgGenericTests):
2223 # Tests for recvmsg() which can use any socket type.
2224
2225 def testRecvmsgBadArgs(self):
2226 # Check that recvmsg() rejects invalid arguments.
2227 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2228 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2229 -1, 0, 0)
2230 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2231 len(MSG), -1, 0)
2232 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2233 [bytearray(10)], 0, 0)
2234 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2235 object(), 0, 0)
2236 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2237 len(MSG), object(), 0)
2238 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2239 len(MSG), 0, object())
2240
2241 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2242 self.assertEqual(msg, MSG)
2243 self.checkRecvmsgAddress(addr, self.cli_addr)
2244 self.assertEqual(ancdata, [])
2245 self.checkFlags(flags, eor=True)
2246
2247 def _testRecvmsgBadArgs(self):
2248 self.sendToServer(MSG)
2249
2250
2251class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2252 # Tests for recvmsg_into() which can use any socket type.
2253
2254 def testRecvmsgIntoBadArgs(self):
2255 # Check that recvmsg_into() rejects invalid arguments.
2256 buf = bytearray(len(MSG))
2257 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2258 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2259 len(MSG), 0, 0)
2260 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2261 buf, 0, 0)
2262 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2263 [object()], 0, 0)
2264 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2265 [b"I'm not writable"], 0, 0)
2266 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2267 [buf, object()], 0, 0)
2268 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2269 [buf], -1, 0)
2270 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2271 [buf], object(), 0)
2272 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2273 [buf], 0, object())
2274
2275 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2276 self.assertEqual(nbytes, len(MSG))
2277 self.assertEqual(buf, bytearray(MSG))
2278 self.checkRecvmsgAddress(addr, self.cli_addr)
2279 self.assertEqual(ancdata, [])
2280 self.checkFlags(flags, eor=True)
2281
2282 def _testRecvmsgIntoBadArgs(self):
2283 self.sendToServer(MSG)
2284
2285 def testRecvmsgIntoGenerator(self):
2286 # Receive into buffer obtained from a generator (not a sequence).
2287 buf = bytearray(len(MSG))
2288 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2289 (o for o in [buf]))
2290 self.assertEqual(nbytes, len(MSG))
2291 self.assertEqual(buf, bytearray(MSG))
2292 self.checkRecvmsgAddress(addr, self.cli_addr)
2293 self.assertEqual(ancdata, [])
2294 self.checkFlags(flags, eor=True)
2295
2296 def _testRecvmsgIntoGenerator(self):
2297 self.sendToServer(MSG)
2298
2299 def testRecvmsgIntoArray(self):
2300 # Receive into an array rather than the usual bytearray.
2301 buf = array.array("B", [0] * len(MSG))
2302 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2303 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002304 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002305 self.checkRecvmsgAddress(addr, self.cli_addr)
2306 self.assertEqual(ancdata, [])
2307 self.checkFlags(flags, eor=True)
2308
2309 def _testRecvmsgIntoArray(self):
2310 self.sendToServer(MSG)
2311
2312 def testRecvmsgIntoScatter(self):
2313 # Receive into multiple buffers (scatter write).
2314 b1 = bytearray(b"----")
2315 b2 = bytearray(b"0123456789")
2316 b3 = bytearray(b"--------------")
2317 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2318 [b1, memoryview(b2)[2:9], b3])
2319 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2320 self.assertEqual(b1, bytearray(b"Mary"))
2321 self.assertEqual(b2, bytearray(b"01 had a 9"))
2322 self.assertEqual(b3, bytearray(b"little lamb---"))
2323 self.checkRecvmsgAddress(addr, self.cli_addr)
2324 self.assertEqual(ancdata, [])
2325 self.checkFlags(flags, eor=True)
2326
2327 def _testRecvmsgIntoScatter(self):
2328 self.sendToServer(b"Mary had a little lamb")
2329
2330
2331class CmsgMacroTests(unittest.TestCase):
2332 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2333 # assumptions used by sendmsg() and recvmsg[_into](), which share
2334 # code with these functions.
2335
2336 # Match the definition in socketmodule.c
2337 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2338
2339 @requireAttrs(socket, "CMSG_LEN")
2340 def testCMSG_LEN(self):
2341 # Test CMSG_LEN() with various valid and invalid values,
2342 # checking the assumptions used by recvmsg() and sendmsg().
2343 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2344 values = list(range(257)) + list(range(toobig - 257, toobig))
2345
2346 # struct cmsghdr has at least three members, two of which are ints
2347 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2348 for n in values:
2349 ret = socket.CMSG_LEN(n)
2350 # This is how recvmsg() calculates the data size
2351 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2352 self.assertLessEqual(ret, self.socklen_t_limit)
2353
2354 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2355 # sendmsg() shares code with these functions, and requires
2356 # that it reject values over the limit.
2357 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2358 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2359
2360 @requireAttrs(socket, "CMSG_SPACE")
2361 def testCMSG_SPACE(self):
2362 # Test CMSG_SPACE() with various valid and invalid values,
2363 # checking the assumptions used by sendmsg().
2364 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2365 values = list(range(257)) + list(range(toobig - 257, toobig))
2366
2367 last = socket.CMSG_SPACE(0)
2368 # struct cmsghdr has at least three members, two of which are ints
2369 self.assertGreater(last, array.array("i").itemsize * 2)
2370 for n in values:
2371 ret = socket.CMSG_SPACE(n)
2372 self.assertGreaterEqual(ret, last)
2373 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2374 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2375 self.assertLessEqual(ret, self.socklen_t_limit)
2376 last = ret
2377
2378 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2379 # sendmsg() shares code with these functions, and requires
2380 # that it reject values over the limit.
2381 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2382 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2383
2384
2385class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2386 # Tests for file descriptor passing on Unix-domain sockets.
2387
2388 # Invalid file descriptor value that's unlikely to evaluate to a
2389 # real FD even if one of its bytes is replaced with a different
2390 # value (which shouldn't actually happen).
2391 badfd = -0x5555
2392
2393 def newFDs(self, n):
2394 # Return a list of n file descriptors for newly-created files
2395 # containing their list indices as ASCII numbers.
2396 fds = []
2397 for i in range(n):
2398 fd, path = tempfile.mkstemp()
2399 self.addCleanup(os.unlink, path)
2400 self.addCleanup(os.close, fd)
2401 os.write(fd, str(i).encode())
2402 fds.append(fd)
2403 return fds
2404
2405 def checkFDs(self, fds):
2406 # Check that the file descriptors in the given list contain
2407 # their correct list indices as ASCII numbers.
2408 for n, fd in enumerate(fds):
2409 os.lseek(fd, 0, os.SEEK_SET)
2410 self.assertEqual(os.read(fd, 1024), str(n).encode())
2411
2412 def registerRecvmsgResult(self, result):
2413 self.addCleanup(self.closeRecvmsgFDs, result)
2414
2415 def closeRecvmsgFDs(self, recvmsg_result):
2416 # Close all file descriptors specified in the ancillary data
2417 # of the given return value from recvmsg() or recvmsg_into().
2418 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2419 if (cmsg_level == socket.SOL_SOCKET and
2420 cmsg_type == socket.SCM_RIGHTS):
2421 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002422 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002423 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2424 for fd in fds:
2425 os.close(fd)
2426
2427 def createAndSendFDs(self, n):
2428 # Send n new file descriptors created by newFDs() to the
2429 # server, with the constant MSG as the non-ancillary data.
2430 self.assertEqual(
2431 self.sendmsgToServer([MSG],
2432 [(socket.SOL_SOCKET,
2433 socket.SCM_RIGHTS,
2434 array.array("i", self.newFDs(n)))]),
2435 len(MSG))
2436
2437 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2438 # Check that constant MSG was received with numfds file
2439 # descriptors in a maximum of maxcmsgs control messages (which
2440 # must contain only complete integers). By default, check
2441 # that MSG_CTRUNC is unset, but ignore any flags in
2442 # ignoreflags.
2443 msg, ancdata, flags, addr = result
2444 self.assertEqual(msg, MSG)
2445 self.checkRecvmsgAddress(addr, self.cli_addr)
2446 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2447 ignore=ignoreflags)
2448
2449 self.assertIsInstance(ancdata, list)
2450 self.assertLessEqual(len(ancdata), maxcmsgs)
2451 fds = array.array("i")
2452 for item in ancdata:
2453 self.assertIsInstance(item, tuple)
2454 cmsg_level, cmsg_type, cmsg_data = item
2455 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2456 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2457 self.assertIsInstance(cmsg_data, bytes)
2458 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002459 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002460
2461 self.assertEqual(len(fds), numfds)
2462 self.checkFDs(fds)
2463
2464 def testFDPassSimple(self):
2465 # Pass a single FD (array read from bytes object).
2466 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2467 len(MSG), 10240))
2468
2469 def _testFDPassSimple(self):
2470 self.assertEqual(
2471 self.sendmsgToServer(
2472 [MSG],
2473 [(socket.SOL_SOCKET,
2474 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002475 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002476 len(MSG))
2477
2478 def testMultipleFDPass(self):
2479 # Pass multiple FDs in a single array.
2480 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2481 len(MSG), 10240))
2482
2483 def _testMultipleFDPass(self):
2484 self.createAndSendFDs(4)
2485
2486 @requireAttrs(socket, "CMSG_SPACE")
2487 def testFDPassCMSG_SPACE(self):
2488 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2489 self.checkRecvmsgFDs(
2490 4, self.doRecvmsg(self.serv_sock, len(MSG),
2491 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2492
2493 @testFDPassCMSG_SPACE.client_skip
2494 def _testFDPassCMSG_SPACE(self):
2495 self.createAndSendFDs(4)
2496
2497 def testFDPassCMSG_LEN(self):
2498 # Test using CMSG_LEN() to calculate ancillary buffer size.
2499 self.checkRecvmsgFDs(1,
2500 self.doRecvmsg(self.serv_sock, len(MSG),
2501 socket.CMSG_LEN(4 * SIZEOF_INT)),
2502 # RFC 3542 says implementations may set
2503 # MSG_CTRUNC if there isn't enough space
2504 # for trailing padding.
2505 ignoreflags=socket.MSG_CTRUNC)
2506
2507 def _testFDPassCMSG_LEN(self):
2508 self.createAndSendFDs(1)
2509
Nick Coghlan2496f332011-09-19 20:26:31 +10002510 # Issue #12958: The following test has problems on Mac OS X
2511 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002512 @requireAttrs(socket, "CMSG_SPACE")
2513 def testFDPassSeparate(self):
2514 # Pass two FDs in two separate arrays. Arrays may be combined
2515 # into a single control message by the OS.
2516 self.checkRecvmsgFDs(2,
2517 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2518 maxcmsgs=2)
2519
2520 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002521 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002522 def _testFDPassSeparate(self):
2523 fd0, fd1 = self.newFDs(2)
2524 self.assertEqual(
2525 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2526 socket.SCM_RIGHTS,
2527 array.array("i", [fd0])),
2528 (socket.SOL_SOCKET,
2529 socket.SCM_RIGHTS,
2530 array.array("i", [fd1]))]),
2531 len(MSG))
2532
Nick Coghlan2496f332011-09-19 20:26:31 +10002533 # Issue #12958: The following test has problems on Mac OS X
2534 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002535 @requireAttrs(socket, "CMSG_SPACE")
2536 def testFDPassSeparateMinSpace(self):
2537 # Pass two FDs in two separate arrays, receiving them into the
2538 # minimum space for two arrays.
2539 self.checkRecvmsgFDs(2,
2540 self.doRecvmsg(self.serv_sock, len(MSG),
2541 socket.CMSG_SPACE(SIZEOF_INT) +
2542 socket.CMSG_LEN(SIZEOF_INT)),
2543 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2544
2545 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002546 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002547 def _testFDPassSeparateMinSpace(self):
2548 fd0, fd1 = self.newFDs(2)
2549 self.assertEqual(
2550 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2551 socket.SCM_RIGHTS,
2552 array.array("i", [fd0])),
2553 (socket.SOL_SOCKET,
2554 socket.SCM_RIGHTS,
2555 array.array("i", [fd1]))]),
2556 len(MSG))
2557
2558 def sendAncillaryIfPossible(self, msg, ancdata):
2559 # Try to send msg and ancdata to server, but if the system
2560 # call fails, just send msg with no ancillary data.
2561 try:
2562 nbytes = self.sendmsgToServer([msg], ancdata)
2563 except socket.error as e:
2564 # Check that it was the system call that failed
2565 self.assertIsInstance(e.errno, int)
2566 nbytes = self.sendmsgToServer([msg])
2567 self.assertEqual(nbytes, len(msg))
2568
2569 def testFDPassEmpty(self):
2570 # Try to pass an empty FD array. Can receive either no array
2571 # or an empty array.
2572 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2573 len(MSG), 10240),
2574 ignoreflags=socket.MSG_CTRUNC)
2575
2576 def _testFDPassEmpty(self):
2577 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2578 socket.SCM_RIGHTS,
2579 b"")])
2580
2581 def testFDPassPartialInt(self):
2582 # Try to pass a truncated FD array.
2583 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2584 len(MSG), 10240)
2585 self.assertEqual(msg, MSG)
2586 self.checkRecvmsgAddress(addr, self.cli_addr)
2587 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2588 self.assertLessEqual(len(ancdata), 1)
2589 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2590 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2591 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2592 self.assertLess(len(cmsg_data), SIZEOF_INT)
2593
2594 def _testFDPassPartialInt(self):
2595 self.sendAncillaryIfPossible(
2596 MSG,
2597 [(socket.SOL_SOCKET,
2598 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002599 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002600
2601 @requireAttrs(socket, "CMSG_SPACE")
2602 def testFDPassPartialIntInMiddle(self):
2603 # Try to pass two FD arrays, the first of which is truncated.
2604 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2605 len(MSG), 10240)
2606 self.assertEqual(msg, MSG)
2607 self.checkRecvmsgAddress(addr, self.cli_addr)
2608 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2609 self.assertLessEqual(len(ancdata), 2)
2610 fds = array.array("i")
2611 # Arrays may have been combined in a single control message
2612 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2613 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2614 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002615 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002616 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2617 self.assertLessEqual(len(fds), 2)
2618 self.checkFDs(fds)
2619
2620 @testFDPassPartialIntInMiddle.client_skip
2621 def _testFDPassPartialIntInMiddle(self):
2622 fd0, fd1 = self.newFDs(2)
2623 self.sendAncillaryIfPossible(
2624 MSG,
2625 [(socket.SOL_SOCKET,
2626 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002627 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002628 (socket.SOL_SOCKET,
2629 socket.SCM_RIGHTS,
2630 array.array("i", [fd1]))])
2631
2632 def checkTruncatedHeader(self, result, ignoreflags=0):
2633 # Check that no ancillary data items are returned when data is
2634 # truncated inside the cmsghdr structure.
2635 msg, ancdata, flags, addr = result
2636 self.assertEqual(msg, MSG)
2637 self.checkRecvmsgAddress(addr, self.cli_addr)
2638 self.assertEqual(ancdata, [])
2639 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2640 ignore=ignoreflags)
2641
2642 def testCmsgTruncNoBufSize(self):
2643 # Check that no ancillary data is received when no buffer size
2644 # is specified.
2645 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2646 # BSD seems to set MSG_CTRUNC only
2647 # if an item has been partially
2648 # received.
2649 ignoreflags=socket.MSG_CTRUNC)
2650
2651 def _testCmsgTruncNoBufSize(self):
2652 self.createAndSendFDs(1)
2653
2654 def testCmsgTrunc0(self):
2655 # Check that no ancillary data is received when buffer size is 0.
2656 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2657 ignoreflags=socket.MSG_CTRUNC)
2658
2659 def _testCmsgTrunc0(self):
2660 self.createAndSendFDs(1)
2661
2662 # Check that no ancillary data is returned for various non-zero
2663 # (but still too small) buffer sizes.
2664
2665 def testCmsgTrunc1(self):
2666 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2667
2668 def _testCmsgTrunc1(self):
2669 self.createAndSendFDs(1)
2670
2671 def testCmsgTrunc2Int(self):
2672 # The cmsghdr structure has at least three members, two of
2673 # which are ints, so we still shouldn't see any ancillary
2674 # data.
2675 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2676 SIZEOF_INT * 2))
2677
2678 def _testCmsgTrunc2Int(self):
2679 self.createAndSendFDs(1)
2680
2681 def testCmsgTruncLen0Minus1(self):
2682 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2683 socket.CMSG_LEN(0) - 1))
2684
2685 def _testCmsgTruncLen0Minus1(self):
2686 self.createAndSendFDs(1)
2687
2688 # The following tests try to truncate the control message in the
2689 # middle of the FD array.
2690
2691 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2692 # Check that file descriptor data is truncated to between
2693 # mindata and maxdata bytes when received with buffer size
2694 # ancbuf, and that any complete file descriptor numbers are
2695 # valid.
2696 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2697 len(MSG), ancbuf)
2698 self.assertEqual(msg, MSG)
2699 self.checkRecvmsgAddress(addr, self.cli_addr)
2700 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2701
2702 if mindata == 0 and ancdata == []:
2703 return
2704 self.assertEqual(len(ancdata), 1)
2705 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2706 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2707 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2708 self.assertGreaterEqual(len(cmsg_data), mindata)
2709 self.assertLessEqual(len(cmsg_data), maxdata)
2710 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002711 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002712 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2713 self.checkFDs(fds)
2714
2715 def testCmsgTruncLen0(self):
2716 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2717
2718 def _testCmsgTruncLen0(self):
2719 self.createAndSendFDs(1)
2720
2721 def testCmsgTruncLen0Plus1(self):
2722 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2723
2724 def _testCmsgTruncLen0Plus1(self):
2725 self.createAndSendFDs(2)
2726
2727 def testCmsgTruncLen1(self):
2728 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2729 maxdata=SIZEOF_INT)
2730
2731 def _testCmsgTruncLen1(self):
2732 self.createAndSendFDs(2)
2733
2734 def testCmsgTruncLen2Minus1(self):
2735 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2736 maxdata=(2 * SIZEOF_INT) - 1)
2737
2738 def _testCmsgTruncLen2Minus1(self):
2739 self.createAndSendFDs(2)
2740
2741
2742class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2743 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2744 # features of the RFC 3542 Advanced Sockets API for IPv6.
2745 # Currently we can only handle certain data items (e.g. traffic
2746 # class, hop limit, MTU discovery and fragmentation settings)
2747 # without resorting to unportable means such as the struct module,
2748 # but the tests here are aimed at testing the ancillary data
2749 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2750 # itself.
2751
2752 # Test value to use when setting hop limit of packet
2753 hop_limit = 2
2754
2755 # Test value to use when setting traffic class of packet.
2756 # -1 means "use kernel default".
2757 traffic_class = -1
2758
2759 def ancillaryMapping(self, ancdata):
2760 # Given ancillary data list ancdata, return a mapping from
2761 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2762 # Check that no (level, type) pair appears more than once.
2763 d = {}
2764 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2765 self.assertNotIn((cmsg_level, cmsg_type), d)
2766 d[(cmsg_level, cmsg_type)] = cmsg_data
2767 return d
2768
2769 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2770 # Receive hop limit into ancbufsize bytes of ancillary data
2771 # space. Check that data is MSG, ancillary data is not
2772 # truncated (but ignore any flags in ignoreflags), and hop
2773 # limit is between 0 and maxhop inclusive.
2774 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2775 socket.IPV6_RECVHOPLIMIT, 1)
2776 self.misc_event.set()
2777 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2778 len(MSG), ancbufsize)
2779
2780 self.assertEqual(msg, MSG)
2781 self.checkRecvmsgAddress(addr, self.cli_addr)
2782 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2783 ignore=ignoreflags)
2784
2785 self.assertEqual(len(ancdata), 1)
2786 self.assertIsInstance(ancdata[0], tuple)
2787 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2788 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2789 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2790 self.assertIsInstance(cmsg_data, bytes)
2791 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2792 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002793 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002794 self.assertGreaterEqual(a[0], 0)
2795 self.assertLessEqual(a[0], maxhop)
2796
2797 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2798 def testRecvHopLimit(self):
2799 # Test receiving the packet hop limit as ancillary data.
2800 self.checkHopLimit(ancbufsize=10240)
2801
2802 @testRecvHopLimit.client_skip
2803 def _testRecvHopLimit(self):
2804 # Need to wait until server has asked to receive ancillary
2805 # data, as implementations are not required to buffer it
2806 # otherwise.
2807 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2808 self.sendToServer(MSG)
2809
2810 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2811 def testRecvHopLimitCMSG_SPACE(self):
2812 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2813 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2814
2815 @testRecvHopLimitCMSG_SPACE.client_skip
2816 def _testRecvHopLimitCMSG_SPACE(self):
2817 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2818 self.sendToServer(MSG)
2819
2820 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2821 # 3542 says portable applications must provide space for trailing
2822 # padding. Implementations may set MSG_CTRUNC if there isn't
2823 # enough space for the padding.
2824
2825 @requireAttrs(socket.socket, "sendmsg")
2826 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2827 def testSetHopLimit(self):
2828 # Test setting hop limit on outgoing packet and receiving it
2829 # at the other end.
2830 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2831
2832 @testSetHopLimit.client_skip
2833 def _testSetHopLimit(self):
2834 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2835 self.assertEqual(
2836 self.sendmsgToServer([MSG],
2837 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2838 array.array("i", [self.hop_limit]))]),
2839 len(MSG))
2840
2841 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2842 ignoreflags=0):
2843 # Receive traffic class and hop limit into ancbufsize bytes of
2844 # ancillary data space. Check that data is MSG, ancillary
2845 # data is not truncated (but ignore any flags in ignoreflags),
2846 # and traffic class and hop limit are in range (hop limit no
2847 # more than maxhop).
2848 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2849 socket.IPV6_RECVHOPLIMIT, 1)
2850 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2851 socket.IPV6_RECVTCLASS, 1)
2852 self.misc_event.set()
2853 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2854 len(MSG), ancbufsize)
2855
2856 self.assertEqual(msg, MSG)
2857 self.checkRecvmsgAddress(addr, self.cli_addr)
2858 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2859 ignore=ignoreflags)
2860 self.assertEqual(len(ancdata), 2)
2861 ancmap = self.ancillaryMapping(ancdata)
2862
2863 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2864 self.assertEqual(len(tcdata), SIZEOF_INT)
2865 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002866 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002867 self.assertGreaterEqual(a[0], 0)
2868 self.assertLessEqual(a[0], 255)
2869
2870 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2871 self.assertEqual(len(hldata), SIZEOF_INT)
2872 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002873 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002874 self.assertGreaterEqual(a[0], 0)
2875 self.assertLessEqual(a[0], maxhop)
2876
2877 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2878 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2879 def testRecvTrafficClassAndHopLimit(self):
2880 # Test receiving traffic class and hop limit as ancillary data.
2881 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2882
2883 @testRecvTrafficClassAndHopLimit.client_skip
2884 def _testRecvTrafficClassAndHopLimit(self):
2885 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2886 self.sendToServer(MSG)
2887
2888 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2889 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2890 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2891 # Test receiving traffic class and hop limit, using
2892 # CMSG_SPACE() to calculate buffer size.
2893 self.checkTrafficClassAndHopLimit(
2894 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2895
2896 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2897 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2898 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2899 self.sendToServer(MSG)
2900
2901 @requireAttrs(socket.socket, "sendmsg")
2902 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2903 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2904 def testSetTrafficClassAndHopLimit(self):
2905 # Test setting traffic class and hop limit on outgoing packet,
2906 # and receiving them at the other end.
2907 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2908 maxhop=self.hop_limit)
2909
2910 @testSetTrafficClassAndHopLimit.client_skip
2911 def _testSetTrafficClassAndHopLimit(self):
2912 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2913 self.assertEqual(
2914 self.sendmsgToServer([MSG],
2915 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2916 array.array("i", [self.traffic_class])),
2917 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2918 array.array("i", [self.hop_limit]))]),
2919 len(MSG))
2920
2921 @requireAttrs(socket.socket, "sendmsg")
2922 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2923 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2924 def testOddCmsgSize(self):
2925 # Try to send ancillary data with first item one byte too
2926 # long. Fall back to sending with correct size if this fails,
2927 # and check that second item was handled correctly.
2928 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2929 maxhop=self.hop_limit)
2930
2931 @testOddCmsgSize.client_skip
2932 def _testOddCmsgSize(self):
2933 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2934 try:
2935 nbytes = self.sendmsgToServer(
2936 [MSG],
2937 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002938 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002939 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2940 array.array("i", [self.hop_limit]))])
2941 except socket.error as e:
2942 self.assertIsInstance(e.errno, int)
2943 nbytes = self.sendmsgToServer(
2944 [MSG],
2945 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2946 array.array("i", [self.traffic_class])),
2947 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2948 array.array("i", [self.hop_limit]))])
2949 self.assertEqual(nbytes, len(MSG))
2950
2951 # Tests for proper handling of truncated ancillary data
2952
2953 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2954 # Receive hop limit into ancbufsize bytes of ancillary data
2955 # space, which should be too small to contain the ancillary
2956 # data header (if ancbufsize is None, pass no second argument
2957 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2958 # (unless included in ignoreflags), and no ancillary data is
2959 # returned.
2960 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2961 socket.IPV6_RECVHOPLIMIT, 1)
2962 self.misc_event.set()
2963 args = () if ancbufsize is None else (ancbufsize,)
2964 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2965 len(MSG), *args)
2966
2967 self.assertEqual(msg, MSG)
2968 self.checkRecvmsgAddress(addr, self.cli_addr)
2969 self.assertEqual(ancdata, [])
2970 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2971 ignore=ignoreflags)
2972
2973 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2974 def testCmsgTruncNoBufSize(self):
2975 # Check that no ancillary data is received when no ancillary
2976 # buffer size is provided.
2977 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2978 # BSD seems to set
2979 # MSG_CTRUNC only if an item
2980 # has been partially
2981 # received.
2982 ignoreflags=socket.MSG_CTRUNC)
2983
2984 @testCmsgTruncNoBufSize.client_skip
2985 def _testCmsgTruncNoBufSize(self):
2986 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2987 self.sendToServer(MSG)
2988
2989 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2990 def testSingleCmsgTrunc0(self):
2991 # Check that no ancillary data is received when ancillary
2992 # buffer size is zero.
2993 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2994 ignoreflags=socket.MSG_CTRUNC)
2995
2996 @testSingleCmsgTrunc0.client_skip
2997 def _testSingleCmsgTrunc0(self):
2998 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2999 self.sendToServer(MSG)
3000
3001 # Check that no ancillary data is returned for various non-zero
3002 # (but still too small) buffer sizes.
3003
3004 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3005 def testSingleCmsgTrunc1(self):
3006 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3007
3008 @testSingleCmsgTrunc1.client_skip
3009 def _testSingleCmsgTrunc1(self):
3010 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3011 self.sendToServer(MSG)
3012
3013 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3014 def testSingleCmsgTrunc2Int(self):
3015 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3016
3017 @testSingleCmsgTrunc2Int.client_skip
3018 def _testSingleCmsgTrunc2Int(self):
3019 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3020 self.sendToServer(MSG)
3021
3022 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3023 def testSingleCmsgTruncLen0Minus1(self):
3024 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3025
3026 @testSingleCmsgTruncLen0Minus1.client_skip
3027 def _testSingleCmsgTruncLen0Minus1(self):
3028 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3029 self.sendToServer(MSG)
3030
3031 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3032 def testSingleCmsgTruncInData(self):
3033 # Test truncation of a control message inside its associated
3034 # data. The message may be returned with its data truncated,
3035 # or not returned at all.
3036 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3037 socket.IPV6_RECVHOPLIMIT, 1)
3038 self.misc_event.set()
3039 msg, ancdata, flags, addr = self.doRecvmsg(
3040 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3041
3042 self.assertEqual(msg, MSG)
3043 self.checkRecvmsgAddress(addr, self.cli_addr)
3044 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3045
3046 self.assertLessEqual(len(ancdata), 1)
3047 if ancdata:
3048 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3049 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3050 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3051 self.assertLess(len(cmsg_data), SIZEOF_INT)
3052
3053 @testSingleCmsgTruncInData.client_skip
3054 def _testSingleCmsgTruncInData(self):
3055 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3056 self.sendToServer(MSG)
3057
3058 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3059 # Receive traffic class and hop limit into ancbufsize bytes of
3060 # ancillary data space, which should be large enough to
3061 # contain the first item, but too small to contain the header
3062 # of the second. Check that data is MSG, MSG_CTRUNC is set
3063 # (unless included in ignoreflags), and only one ancillary
3064 # data item is returned.
3065 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3066 socket.IPV6_RECVHOPLIMIT, 1)
3067 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3068 socket.IPV6_RECVTCLASS, 1)
3069 self.misc_event.set()
3070 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3071 len(MSG), ancbufsize)
3072
3073 self.assertEqual(msg, MSG)
3074 self.checkRecvmsgAddress(addr, self.cli_addr)
3075 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3076 ignore=ignoreflags)
3077
3078 self.assertEqual(len(ancdata), 1)
3079 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3080 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3081 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3082 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3083 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003084 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003085 self.assertGreaterEqual(a[0], 0)
3086 self.assertLessEqual(a[0], 255)
3087
3088 # Try the above test with various buffer sizes.
3089
3090 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3091 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3092 def testSecondCmsgTrunc0(self):
3093 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3094 ignoreflags=socket.MSG_CTRUNC)
3095
3096 @testSecondCmsgTrunc0.client_skip
3097 def _testSecondCmsgTrunc0(self):
3098 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3099 self.sendToServer(MSG)
3100
3101 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3102 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3103 def testSecondCmsgTrunc1(self):
3104 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3105
3106 @testSecondCmsgTrunc1.client_skip
3107 def _testSecondCmsgTrunc1(self):
3108 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3109 self.sendToServer(MSG)
3110
3111 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3112 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3113 def testSecondCmsgTrunc2Int(self):
3114 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3115 2 * SIZEOF_INT)
3116
3117 @testSecondCmsgTrunc2Int.client_skip
3118 def _testSecondCmsgTrunc2Int(self):
3119 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3120 self.sendToServer(MSG)
3121
3122 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3123 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3124 def testSecondCmsgTruncLen0Minus1(self):
3125 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3126 socket.CMSG_LEN(0) - 1)
3127
3128 @testSecondCmsgTruncLen0Minus1.client_skip
3129 def _testSecondCmsgTruncLen0Minus1(self):
3130 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3131 self.sendToServer(MSG)
3132
3133 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3134 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3135 def testSecomdCmsgTruncInData(self):
3136 # Test truncation of the second of two control messages inside
3137 # its associated data.
3138 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3139 socket.IPV6_RECVHOPLIMIT, 1)
3140 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3141 socket.IPV6_RECVTCLASS, 1)
3142 self.misc_event.set()
3143 msg, ancdata, flags, addr = self.doRecvmsg(
3144 self.serv_sock, len(MSG),
3145 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3146
3147 self.assertEqual(msg, MSG)
3148 self.checkRecvmsgAddress(addr, self.cli_addr)
3149 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3150
3151 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3152
3153 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3154 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3155 cmsg_types.remove(cmsg_type)
3156 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3157 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003158 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003159 self.assertGreaterEqual(a[0], 0)
3160 self.assertLessEqual(a[0], 255)
3161
3162 if ancdata:
3163 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3164 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3165 cmsg_types.remove(cmsg_type)
3166 self.assertLess(len(cmsg_data), SIZEOF_INT)
3167
3168 self.assertEqual(ancdata, [])
3169
3170 @testSecomdCmsgTruncInData.client_skip
3171 def _testSecomdCmsgTruncInData(self):
3172 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3173 self.sendToServer(MSG)
3174
3175
3176# Derive concrete test classes for different socket types.
3177
3178class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3179 SendrecvmsgConnectionlessBase,
3180 ThreadedSocketTestMixin, UDPTestBase):
3181 pass
3182
3183@requireAttrs(socket.socket, "sendmsg")
3184@unittest.skipUnless(thread, 'Threading required for this test.')
3185class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3186 pass
3187
3188@requireAttrs(socket.socket, "recvmsg")
3189@unittest.skipUnless(thread, 'Threading required for this test.')
3190class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3191 pass
3192
3193@requireAttrs(socket.socket, "recvmsg_into")
3194@unittest.skipUnless(thread, 'Threading required for this test.')
3195class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3196 pass
3197
3198
3199class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3200 SendrecvmsgConnectionlessBase,
3201 ThreadedSocketTestMixin, UDP6TestBase):
3202 pass
3203
3204@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003205@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003206@requireSocket("AF_INET6", "SOCK_DGRAM")
3207@unittest.skipUnless(thread, 'Threading required for this test.')
3208class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3209 pass
3210
3211@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003212@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003213@requireSocket("AF_INET6", "SOCK_DGRAM")
3214@unittest.skipUnless(thread, 'Threading required for this test.')
3215class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3216 pass
3217
3218@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003219@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003220@requireSocket("AF_INET6", "SOCK_DGRAM")
3221@unittest.skipUnless(thread, 'Threading required for this test.')
3222class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3223 pass
3224
3225@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003226@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003227@requireAttrs(socket, "IPPROTO_IPV6")
3228@requireSocket("AF_INET6", "SOCK_DGRAM")
3229@unittest.skipUnless(thread, 'Threading required for this test.')
3230class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3231 SendrecvmsgUDP6TestBase):
3232 pass
3233
3234@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003235@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003236@requireAttrs(socket, "IPPROTO_IPV6")
3237@requireSocket("AF_INET6", "SOCK_DGRAM")
3238@unittest.skipUnless(thread, 'Threading required for this test.')
3239class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3240 RFC3542AncillaryTest,
3241 SendrecvmsgUDP6TestBase):
3242 pass
3243
3244
3245class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3246 ConnectedStreamTestMixin, TCPTestBase):
3247 pass
3248
3249@requireAttrs(socket.socket, "sendmsg")
3250@unittest.skipUnless(thread, 'Threading required for this test.')
3251class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3252 pass
3253
3254@requireAttrs(socket.socket, "recvmsg")
3255@unittest.skipUnless(thread, 'Threading required for this test.')
3256class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3257 SendrecvmsgTCPTestBase):
3258 pass
3259
3260@requireAttrs(socket.socket, "recvmsg_into")
3261@unittest.skipUnless(thread, 'Threading required for this test.')
3262class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3263 SendrecvmsgTCPTestBase):
3264 pass
3265
3266
3267class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3268 SendrecvmsgConnectedBase,
3269 ConnectedStreamTestMixin, SCTPStreamBase):
3270 pass
3271
3272@requireAttrs(socket.socket, "sendmsg")
3273@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3274@unittest.skipUnless(thread, 'Threading required for this test.')
3275class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3276 pass
3277
3278@requireAttrs(socket.socket, "recvmsg")
3279@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3280@unittest.skipUnless(thread, 'Threading required for this test.')
3281class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3282 SendrecvmsgSCTPStreamTestBase):
3283 pass
3284
3285@requireAttrs(socket.socket, "recvmsg_into")
3286@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3287@unittest.skipUnless(thread, 'Threading required for this test.')
3288class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3289 SendrecvmsgSCTPStreamTestBase):
3290 pass
3291
3292
3293class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3294 ConnectedStreamTestMixin, UnixStreamBase):
3295 pass
3296
3297@requireAttrs(socket.socket, "sendmsg")
3298@requireAttrs(socket, "AF_UNIX")
3299@unittest.skipUnless(thread, 'Threading required for this test.')
3300class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3301 pass
3302
3303@requireAttrs(socket.socket, "recvmsg")
3304@requireAttrs(socket, "AF_UNIX")
3305@unittest.skipUnless(thread, 'Threading required for this test.')
3306class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3307 SendrecvmsgUnixStreamTestBase):
3308 pass
3309
3310@requireAttrs(socket.socket, "recvmsg_into")
3311@requireAttrs(socket, "AF_UNIX")
3312@unittest.skipUnless(thread, 'Threading required for this test.')
3313class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3314 SendrecvmsgUnixStreamTestBase):
3315 pass
3316
3317@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3318@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3319@unittest.skipUnless(thread, 'Threading required for this test.')
3320class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3321 pass
3322
3323@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3324@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3325@unittest.skipUnless(thread, 'Threading required for this test.')
3326class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3327 SendrecvmsgUnixStreamTestBase):
3328 pass
3329
3330
3331# Test interrupting the interruptible send/receive methods with a
3332# signal when a timeout is set. These tests avoid having multiple
3333# threads alive during the test so that the OS cannot deliver the
3334# signal to the wrong one.
3335
3336class InterruptedTimeoutBase(unittest.TestCase):
3337 # Base class for interrupted send/receive tests. Installs an
3338 # empty handler for SIGALRM and removes it on teardown, along with
3339 # any scheduled alarms.
3340
3341 def setUp(self):
3342 super().setUp()
3343 orig_alrm_handler = signal.signal(signal.SIGALRM,
3344 lambda signum, frame: None)
3345 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3346 self.addCleanup(self.setAlarm, 0)
3347
3348 # Timeout for socket operations
3349 timeout = 4.0
3350
3351 # Provide setAlarm() method to schedule delivery of SIGALRM after
3352 # given number of seconds, or cancel it if zero, and an
3353 # appropriate time value to use. Use setitimer() if available.
3354 if hasattr(signal, "setitimer"):
3355 alarm_time = 0.05
3356
3357 def setAlarm(self, seconds):
3358 signal.setitimer(signal.ITIMER_REAL, seconds)
3359 else:
3360 # Old systems may deliver the alarm up to one second early
3361 alarm_time = 2
3362
3363 def setAlarm(self, seconds):
3364 signal.alarm(seconds)
3365
3366
3367# Require siginterrupt() in order to ensure that system calls are
3368# interrupted by default.
3369@requireAttrs(signal, "siginterrupt")
3370@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3371 "Don't have signal.alarm or signal.setitimer")
3372class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3373 # Test interrupting the recv*() methods with signals when a
3374 # timeout is set.
3375
3376 def setUp(self):
3377 super().setUp()
3378 self.serv.settimeout(self.timeout)
3379
3380 def checkInterruptedRecv(self, func, *args, **kwargs):
3381 # Check that func(*args, **kwargs) raises socket.error with an
3382 # errno of EINTR when interrupted by a signal.
3383 self.setAlarm(self.alarm_time)
3384 with self.assertRaises(socket.error) as cm:
3385 func(*args, **kwargs)
3386 self.assertNotIsInstance(cm.exception, socket.timeout)
3387 self.assertEqual(cm.exception.errno, errno.EINTR)
3388
3389 def testInterruptedRecvTimeout(self):
3390 self.checkInterruptedRecv(self.serv.recv, 1024)
3391
3392 def testInterruptedRecvIntoTimeout(self):
3393 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3394
3395 def testInterruptedRecvfromTimeout(self):
3396 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3397
3398 def testInterruptedRecvfromIntoTimeout(self):
3399 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3400
3401 @requireAttrs(socket.socket, "recvmsg")
3402 def testInterruptedRecvmsgTimeout(self):
3403 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3404
3405 @requireAttrs(socket.socket, "recvmsg_into")
3406 def testInterruptedRecvmsgIntoTimeout(self):
3407 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3408
3409
3410# Require siginterrupt() in order to ensure that system calls are
3411# interrupted by default.
3412@requireAttrs(signal, "siginterrupt")
3413@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3414 "Don't have signal.alarm or signal.setitimer")
3415@unittest.skipUnless(thread, 'Threading required for this test.')
3416class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3417 ThreadSafeCleanupTestCase,
3418 SocketListeningTestMixin, TCPTestBase):
3419 # Test interrupting the interruptible send*() methods with signals
3420 # when a timeout is set.
3421
3422 def setUp(self):
3423 super().setUp()
3424 self.serv_conn = self.newSocket()
3425 self.addCleanup(self.serv_conn.close)
3426 # Use a thread to complete the connection, but wait for it to
3427 # terminate before running the test, so that there is only one
3428 # thread to accept the signal.
3429 cli_thread = threading.Thread(target=self.doConnect)
3430 cli_thread.start()
3431 self.cli_conn, addr = self.serv.accept()
3432 self.addCleanup(self.cli_conn.close)
3433 cli_thread.join()
3434 self.serv_conn.settimeout(self.timeout)
3435
3436 def doConnect(self):
3437 self.serv_conn.connect(self.serv_addr)
3438
3439 def checkInterruptedSend(self, func, *args, **kwargs):
3440 # Check that func(*args, **kwargs), run in a loop, raises
3441 # socket.error with an errno of EINTR when interrupted by a
3442 # signal.
3443 with self.assertRaises(socket.error) as cm:
3444 while True:
3445 self.setAlarm(self.alarm_time)
3446 func(*args, **kwargs)
3447 self.assertNotIsInstance(cm.exception, socket.timeout)
3448 self.assertEqual(cm.exception.errno, errno.EINTR)
3449
Nick Coghlan2496f332011-09-19 20:26:31 +10003450 # Issue #12958: The following tests have problems on Mac OS X
3451 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003452 def testInterruptedSendTimeout(self):
3453 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3454
Nick Coghlan2496f332011-09-19 20:26:31 +10003455 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003456 def testInterruptedSendtoTimeout(self):
3457 # Passing an actual address here as Python's wrapper for
3458 # sendto() doesn't allow passing a zero-length one; POSIX
3459 # requires that the address is ignored since the socket is
3460 # connection-mode, however.
3461 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3462 self.serv_addr)
3463
Nick Coghlan2496f332011-09-19 20:26:31 +10003464 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003465 @requireAttrs(socket.socket, "sendmsg")
3466 def testInterruptedSendmsgTimeout(self):
3467 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3468
3469
Victor Stinner45df8202010-04-28 22:31:17 +00003470@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003471class TCPCloserTest(ThreadedTCPSocketTest):
3472
3473 def testClose(self):
3474 conn, addr = self.serv.accept()
3475 conn.close()
3476
3477 sd = self.cli
3478 read, write, err = select.select([sd], [], [], 1.0)
3479 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003480 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003481
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003482 # Calling close() many times should be safe.
3483 conn.close()
3484 conn.close()
3485
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003486 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003487 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003488 time.sleep(1.0)
3489
Victor Stinner45df8202010-04-28 22:31:17 +00003490@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003491class BasicSocketPairTest(SocketPairTest):
3492
3493 def __init__(self, methodName='runTest'):
3494 SocketPairTest.__init__(self, methodName=methodName)
3495
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003496 def _check_defaults(self, sock):
3497 self.assertIsInstance(sock, socket.socket)
3498 if hasattr(socket, 'AF_UNIX'):
3499 self.assertEqual(sock.family, socket.AF_UNIX)
3500 else:
3501 self.assertEqual(sock.family, socket.AF_INET)
3502 self.assertEqual(sock.type, socket.SOCK_STREAM)
3503 self.assertEqual(sock.proto, 0)
3504
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003505 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003506 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003507
3508 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003509 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003510
Dave Cole331708b2004-08-09 04:51:41 +00003511 def testRecv(self):
3512 msg = self.serv.recv(1024)
3513 self.assertEqual(msg, MSG)
3514
3515 def _testRecv(self):
3516 self.cli.send(MSG)
3517
3518 def testSend(self):
3519 self.serv.send(MSG)
3520
3521 def _testSend(self):
3522 msg = self.cli.recv(1024)
3523 self.assertEqual(msg, MSG)
3524
Victor Stinner45df8202010-04-28 22:31:17 +00003525@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003526class NonBlockingTCPTests(ThreadedTCPSocketTest):
3527
3528 def __init__(self, methodName='runTest'):
3529 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3530
3531 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003532 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003533 self.serv.setblocking(0)
3534 start = time.time()
3535 try:
3536 self.serv.accept()
3537 except socket.error:
3538 pass
3539 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003540 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003541
3542 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003543 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003544
Antoine Pitroub1c54962010-10-14 15:05:38 +00003545 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003546 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003547 def testInitNonBlocking(self):
3548 # reinit server socket
3549 self.serv.close()
3550 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003551 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003552 self.port = support.bind_port(self.serv)
3553 self.serv.listen(1)
3554 # actual testing
3555 start = time.time()
3556 try:
3557 self.serv.accept()
3558 except socket.error:
3559 pass
3560 end = time.time()
3561 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3562
3563 def _testInitNonBlocking(self):
3564 pass
3565
Antoine Pitrou600232b2011-01-05 21:03:42 +00003566 def testInheritFlags(self):
3567 # Issue #7995: when calling accept() on a listening socket with a
3568 # timeout, the resulting socket should not be non-blocking.
3569 self.serv.settimeout(10)
3570 try:
3571 conn, addr = self.serv.accept()
3572 message = conn.recv(len(MSG))
3573 finally:
3574 conn.close()
3575 self.serv.settimeout(None)
3576
3577 def _testInheritFlags(self):
3578 time.sleep(0.1)
3579 self.cli.connect((HOST, self.port))
3580 time.sleep(0.5)
3581 self.cli.send(MSG)
3582
Guido van Rossum24e4af82002-06-12 19:18:08 +00003583 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003584 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003585 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003586 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003587 conn, addr = self.serv.accept()
3588 except socket.error:
3589 pass
3590 else:
3591 self.fail("Error trying to do non-blocking accept.")
3592 read, write, err = select.select([self.serv], [], [])
3593 if self.serv in read:
3594 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003595 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003596 else:
3597 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003598
Guido van Rossum24e4af82002-06-12 19:18:08 +00003599 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003600 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003601 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003602
3603 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003604 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003605 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003606 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003607
3608 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003609 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003610 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003611
3612 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003613 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003614 conn, addr = self.serv.accept()
3615 conn.setblocking(0)
3616 try:
3617 msg = conn.recv(len(MSG))
3618 except socket.error:
3619 pass
3620 else:
3621 self.fail("Error trying to do non-blocking recv.")
3622 read, write, err = select.select([conn], [], [])
3623 if conn in read:
3624 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003625 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003626 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003627 else:
3628 self.fail("Error during select call to non-blocking socket.")
3629
3630 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003631 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003632 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003633 self.cli.send(MSG)
3634
Victor Stinner45df8202010-04-28 22:31:17 +00003635@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003636class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003637 """Unit tests for the object returned by socket.makefile()
3638
Antoine Pitrou834bd812010-10-13 16:17:14 +00003639 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003640 the client connection. You can read from this file to
3641 get output from the server.
3642
Antoine Pitrou834bd812010-10-13 16:17:14 +00003643 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003644 server connection. You can write to this file to send output
3645 to the client.
3646 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003647
Guido van Rossume9f66142002-08-07 15:46:19 +00003648 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003649 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003650 errors = 'strict'
3651 newline = None
3652
3653 read_mode = 'rb'
3654 read_msg = MSG
3655 write_mode = 'wb'
3656 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003657
Guido van Rossum24e4af82002-06-12 19:18:08 +00003658 def __init__(self, methodName='runTest'):
3659 SocketConnectedTest.__init__(self, methodName=methodName)
3660
3661 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003662 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3663 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003664 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003665 self.read_file = self.cli_conn.makefile(
3666 self.read_mode, self.bufsize,
3667 encoding = self.encoding,
3668 errors = self.errors,
3669 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003670
3671 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003672 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003673 self.read_file.close()
3674 self.assertTrue(self.read_file.closed)
3675 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003676 SocketConnectedTest.tearDown(self)
3677
3678 def clientSetUp(self):
3679 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003680 self.write_file = self.serv_conn.makefile(
3681 self.write_mode, self.bufsize,
3682 encoding = self.encoding,
3683 errors = self.errors,
3684 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003685
3686 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003687 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003688 self.write_file.close()
3689 self.assertTrue(self.write_file.closed)
3690 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003691 SocketConnectedTest.clientTearDown(self)
3692
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003693 def testReadAfterTimeout(self):
3694 # Issue #7322: A file object must disallow further reads
3695 # after a timeout has occurred.
3696 self.cli_conn.settimeout(1)
3697 self.read_file.read(3)
3698 # First read raises a timeout
3699 self.assertRaises(socket.timeout, self.read_file.read, 1)
3700 # Second read is disallowed
3701 with self.assertRaises(IOError) as ctx:
3702 self.read_file.read(1)
3703 self.assertIn("cannot read from timed out object", str(ctx.exception))
3704
3705 def _testReadAfterTimeout(self):
3706 self.write_file.write(self.write_msg[0:3])
3707 self.write_file.flush()
3708 self.serv_finished.wait()
3709
Guido van Rossum24e4af82002-06-12 19:18:08 +00003710 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003711 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003712 first_seg = self.read_file.read(len(self.read_msg)-3)
3713 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003714 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003715 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003716
3717 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003718 self.write_file.write(self.write_msg)
3719 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003720
Guido van Rossum8c943832002-08-08 01:00:28 +00003721 def testFullRead(self):
3722 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003723 msg = self.read_file.read()
3724 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003725
3726 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003727 self.write_file.write(self.write_msg)
3728 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003729
Guido van Rossum24e4af82002-06-12 19:18:08 +00003730 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003731 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003732 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003733 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003734 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003735 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003736 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003737 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003738 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003739
3740 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003741 self.write_file.write(self.write_msg)
3742 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003743
3744 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003745 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003746 line = self.read_file.readline()
3747 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003748
3749 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003750 self.write_file.write(self.write_msg)
3751 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003752
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003753 def testCloseAfterMakefile(self):
3754 # The file returned by makefile should keep the socket open.
3755 self.cli_conn.close()
3756 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003757 msg = self.read_file.read()
3758 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003759
3760 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003761 self.write_file.write(self.write_msg)
3762 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003763
3764 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003765 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003766 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003767 if isinstance(self.read_msg, str):
3768 msg = msg.decode()
3769 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003770
3771 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003772 self.write_file.write(self.write_msg)
3773 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003774
Tim Peters116d83c2004-03-28 02:20:45 +00003775 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003776 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003777
3778 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003779 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003780
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003781 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003782 self.assertEqual(self.read_file.mode, self.read_mode)
3783 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003784
3785 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003786 self.assertEqual(self.write_file.mode, self.write_mode)
3787 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003788
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003789 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003790 self.read_file.close()
3791 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003792 self.cli_conn.close()
3793 self.assertRaises(socket.error, self.cli_conn.getsockname)
3794
3795 def _testRealClose(self):
3796 pass
3797
3798
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003799class FileObjectInterruptedTestCase(unittest.TestCase):
3800 """Test that the file object correctly handles EINTR internally."""
3801
3802 class MockSocket(object):
3803 def __init__(self, recv_funcs=()):
3804 # A generator that returns callables that we'll call for each
3805 # call to recv().
3806 self._recv_step = iter(recv_funcs)
3807
3808 def recv_into(self, buffer):
3809 data = next(self._recv_step)()
3810 assert len(buffer) >= len(data)
3811 buffer[:len(data)] = data
3812 return len(data)
3813
3814 def _decref_socketios(self):
3815 pass
3816
3817 def _textiowrap_for_test(self, buffering=-1):
3818 raw = socket.SocketIO(self, "r")
3819 if buffering < 0:
3820 buffering = io.DEFAULT_BUFFER_SIZE
3821 if buffering == 0:
3822 return raw
3823 buffer = io.BufferedReader(raw, buffering)
3824 text = io.TextIOWrapper(buffer, None, None)
3825 text.mode = "rb"
3826 return text
3827
3828 @staticmethod
3829 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003830 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003831
3832 def _textiowrap_mock_socket(self, mock, buffering=-1):
3833 raw = socket.SocketIO(mock, "r")
3834 if buffering < 0:
3835 buffering = io.DEFAULT_BUFFER_SIZE
3836 if buffering == 0:
3837 return raw
3838 buffer = io.BufferedReader(raw, buffering)
3839 text = io.TextIOWrapper(buffer, None, None)
3840 text.mode = "rb"
3841 return text
3842
3843 def _test_readline(self, size=-1, buffering=-1):
3844 mock_sock = self.MockSocket(recv_funcs=[
3845 lambda : b"This is the first line\nAnd the sec",
3846 self._raise_eintr,
3847 lambda : b"ond line is here\n",
3848 lambda : b"",
3849 lambda : b"", # XXX(gps): io library does an extra EOF read
3850 ])
3851 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003852 self.assertEqual(fo.readline(size), "This is the first line\n")
3853 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003854
3855 def _test_read(self, size=-1, buffering=-1):
3856 mock_sock = self.MockSocket(recv_funcs=[
3857 lambda : b"This is the first line\nAnd the sec",
3858 self._raise_eintr,
3859 lambda : b"ond line is here\n",
3860 lambda : b"",
3861 lambda : b"", # XXX(gps): io library does an extra EOF read
3862 ])
3863 expecting = (b"This is the first line\n"
3864 b"And the second line is here\n")
3865 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3866 if buffering == 0:
3867 data = b''
3868 else:
3869 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003870 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003871 while len(data) != len(expecting):
3872 part = fo.read(size)
3873 if not part:
3874 break
3875 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003876 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003877
3878 def test_default(self):
3879 self._test_readline()
3880 self._test_readline(size=100)
3881 self._test_read()
3882 self._test_read(size=100)
3883
3884 def test_with_1k_buffer(self):
3885 self._test_readline(buffering=1024)
3886 self._test_readline(size=100, buffering=1024)
3887 self._test_read(buffering=1024)
3888 self._test_read(size=100, buffering=1024)
3889
3890 def _test_readline_no_buffer(self, size=-1):
3891 mock_sock = self.MockSocket(recv_funcs=[
3892 lambda : b"a",
3893 lambda : b"\n",
3894 lambda : b"B",
3895 self._raise_eintr,
3896 lambda : b"b",
3897 lambda : b"",
3898 ])
3899 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003900 self.assertEqual(fo.readline(size), b"a\n")
3901 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003902
3903 def test_no_buffer(self):
3904 self._test_readline_no_buffer()
3905 self._test_readline_no_buffer(size=4)
3906 self._test_read(buffering=0)
3907 self._test_read(size=100, buffering=0)
3908
3909
Guido van Rossume9f66142002-08-07 15:46:19 +00003910class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3911
3912 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003913
Guido van Rossume9f66142002-08-07 15:46:19 +00003914 In this case (and in this case only), it should be possible to
3915 create a file object, read a line from it, create another file
3916 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003917 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003918 when reading multiple requests from the same socket."""
3919
3920 bufsize = 0 # Use unbuffered mode
3921
3922 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003923 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003924 line = self.read_file.readline() # first line
3925 self.assertEqual(line, b"A. " + self.write_msg) # first line
3926 self.read_file = self.cli_conn.makefile('rb', 0)
3927 line = self.read_file.readline() # second line
3928 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003929
3930 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003931 self.write_file.write(b"A. " + self.write_msg)
3932 self.write_file.write(b"B. " + self.write_msg)
3933 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003934
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003935 def testMakefileClose(self):
3936 # The file returned by makefile should keep the socket open...
3937 self.cli_conn.close()
3938 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003939 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003940 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003941 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003942 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3943
3944 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945 self.write_file.write(self.write_msg)
3946 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003947
3948 def testMakefileCloseSocketDestroy(self):
3949 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003950 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003951 refcount_after = sys.getrefcount(self.cli_conn)
3952 self.assertEqual(refcount_before - 1, refcount_after)
3953
3954 def _testMakefileCloseSocketDestroy(self):
3955 pass
3956
Antoine Pitrou98b46702010-09-18 22:59:00 +00003957 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003958 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003959 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3960
3961 def testSmallReadNonBlocking(self):
3962 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003963 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3964 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003965 self.evt1.set()
3966 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003967 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003968 if first_seg is None:
3969 # Data not arrived (can happen under Windows), wait a bit
3970 time.sleep(0.5)
3971 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003972 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003973 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003974 self.assertEqual(n, 3)
3975 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003976 self.assertEqual(msg, self.read_msg)
3977 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3978 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003979
3980 def _testSmallReadNonBlocking(self):
3981 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003982 self.write_file.write(self.write_msg)
3983 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003984 self.evt2.set()
3985 # Avoid cloding the socket before the server test has finished,
3986 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3987 self.serv_finished.wait(5.0)
3988
3989 def testWriteNonBlocking(self):
3990 self.cli_finished.wait(5.0)
3991 # The client thread can't skip directly - the SkipTest exception
3992 # would appear as a failure.
3993 if self.serv_skipped:
3994 self.skipTest(self.serv_skipped)
3995
3996 def _testWriteNonBlocking(self):
3997 self.serv_skipped = None
3998 self.serv_conn.setblocking(False)
3999 # Try to saturate the socket buffer pipe with repeated large writes.
4000 BIG = b"x" * (1024 ** 2)
4001 LIMIT = 10
4002 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004003 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004004 self.assertGreater(n, 0)
4005 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004006 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004007 if n is None:
4008 # Succeeded
4009 break
4010 self.assertGreater(n, 0)
4011 else:
4012 # Let us know that this test didn't manage to establish
4013 # the expected conditions. This is not a failure in itself but,
4014 # if it happens repeatedly, the test should be fixed.
4015 self.serv_skipped = "failed to saturate the socket buffer"
4016
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004017
Guido van Rossum8c943832002-08-08 01:00:28 +00004018class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4019
4020 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4021
4022
4023class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4024
4025 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004026
Thomas Woutersb2137042007-02-01 18:02:27 +00004027
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4029 """Tests for socket.makefile() in text mode (rather than binary)"""
4030
4031 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004032 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004033 write_mode = 'wb'
4034 write_msg = MSG
4035 newline = ''
4036
4037
4038class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4039 """Tests for socket.makefile() in text mode (rather than binary)"""
4040
4041 read_mode = 'rb'
4042 read_msg = MSG
4043 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004044 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004045 newline = ''
4046
4047
4048class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4049 """Tests for socket.makefile() in text mode (rather than binary)"""
4050
4051 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004052 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004053 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004054 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004055 newline = ''
4056
4057
Guido van Rossumd8faa362007-04-27 19:54:29 +00004058class NetworkConnectionTest(object):
4059 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004060
Guido van Rossumd8faa362007-04-27 19:54:29 +00004061 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004062 # We're inherited below by BasicTCPTest2, which also inherits
4063 # BasicTCPTest, which defines self.port referenced below.
4064 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004065 self.serv_conn = self.cli
4066
4067class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4068 """Tests that NetworkConnection does not break existing TCP functionality.
4069 """
4070
4071class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004072
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004073 class MockSocket(socket.socket):
4074 def connect(self, *args):
4075 raise socket.timeout('timed out')
4076
4077 @contextlib.contextmanager
4078 def mocked_socket_module(self):
4079 """Return a socket which times out on connect"""
4080 old_socket = socket.socket
4081 socket.socket = self.MockSocket
4082 try:
4083 yield
4084 finally:
4085 socket.socket = old_socket
4086
4087 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004088 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004089 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004090 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004091 with self.assertRaises(socket.error) as cm:
4092 cli.connect((HOST, port))
4093 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4094
4095 def test_create_connection(self):
4096 # Issue #9792: errors raised by create_connection() should have
4097 # a proper errno attribute.
4098 port = support.find_unused_port()
4099 with self.assertRaises(socket.error) as cm:
4100 socket.create_connection((HOST, port))
4101 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4102
4103 def test_create_connection_timeout(self):
4104 # Issue #9792: create_connection() should not recast timeout errors
4105 # as generic socket errors.
4106 with self.mocked_socket_module():
4107 with self.assertRaises(socket.timeout):
4108 socket.create_connection((HOST, 1234))
4109
Guido van Rossumd8faa362007-04-27 19:54:29 +00004110
Victor Stinner45df8202010-04-28 22:31:17 +00004111@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004112class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4113
4114 def __init__(self, methodName='runTest'):
4115 SocketTCPTest.__init__(self, methodName=methodName)
4116 ThreadableTest.__init__(self)
4117
4118 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004119 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004120
4121 def clientTearDown(self):
4122 self.cli.close()
4123 self.cli = None
4124 ThreadableTest.clientTearDown(self)
4125
4126 def _justAccept(self):
4127 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004128 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004129
4130 testFamily = _justAccept
4131 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004132 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004133 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004134 self.assertEqual(self.cli.family, 2)
4135
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004136 testSourceAddress = _justAccept
4137 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004138 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4139 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004140 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004141 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004142 # The port number being used is sufficient to show that the bind()
4143 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004144
Guido van Rossumd8faa362007-04-27 19:54:29 +00004145 testTimeoutDefault = _justAccept
4146 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004147 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004148 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004149 socket.setdefaulttimeout(42)
4150 try:
4151 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004152 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004153 finally:
4154 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004155 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004156
4157 testTimeoutNone = _justAccept
4158 def _testTimeoutNone(self):
4159 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004160 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004161 socket.setdefaulttimeout(30)
4162 try:
4163 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004164 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004165 finally:
4166 socket.setdefaulttimeout(None)
4167 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004168
4169 testTimeoutValueNamed = _justAccept
4170 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004171 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004172 self.assertEqual(self.cli.gettimeout(), 30)
4173
4174 testTimeoutValueNonamed = _justAccept
4175 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004176 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004177 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004178 self.assertEqual(self.cli.gettimeout(), 30)
4179
Victor Stinner45df8202010-04-28 22:31:17 +00004180@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004181class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4182
4183 def __init__(self, methodName='runTest'):
4184 SocketTCPTest.__init__(self, methodName=methodName)
4185 ThreadableTest.__init__(self)
4186
4187 def clientSetUp(self):
4188 pass
4189
4190 def clientTearDown(self):
4191 self.cli.close()
4192 self.cli = None
4193 ThreadableTest.clientTearDown(self)
4194
4195 def testInsideTimeout(self):
4196 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004197 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004198 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004199 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004200 testOutsideTimeout = testInsideTimeout
4201
4202 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004203 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004204 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004205 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004206
4207 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004208 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004209 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004210
4211
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004212class TCPTimeoutTest(SocketTCPTest):
4213
4214 def testTCPTimeout(self):
4215 def raise_timeout(*args, **kwargs):
4216 self.serv.settimeout(1.0)
4217 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004218 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004219 "Error generating a timeout exception (TCP)")
4220
4221 def testTimeoutZero(self):
4222 ok = False
4223 try:
4224 self.serv.settimeout(0.0)
4225 foo = self.serv.accept()
4226 except socket.timeout:
4227 self.fail("caught timeout instead of error (TCP)")
4228 except socket.error:
4229 ok = True
4230 except:
4231 self.fail("caught unexpected exception (TCP)")
4232 if not ok:
4233 self.fail("accept() returned success when we did not expect it")
4234
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004235 def testInterruptedTimeout(self):
4236 # XXX I don't know how to do this test on MSWindows or any other
4237 # plaform that doesn't support signal.alarm() or os.kill(), though
4238 # the bug should have existed on all platforms.
4239 if not hasattr(signal, "alarm"):
4240 return # can only test on *nix
4241 self.serv.settimeout(5.0) # must be longer than alarm
4242 class Alarm(Exception):
4243 pass
4244 def alarm_handler(signal, frame):
4245 raise Alarm
4246 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4247 try:
4248 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4249 try:
4250 foo = self.serv.accept()
4251 except socket.timeout:
4252 self.fail("caught timeout instead of Alarm")
4253 except Alarm:
4254 pass
4255 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004256 self.fail("caught other exception instead of Alarm:"
4257 " %s(%s):\n%s" %
4258 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004259 else:
4260 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004261 finally:
4262 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004263 except Alarm:
4264 self.fail("got Alarm in wrong place")
4265 finally:
4266 # no alarm can be pending. Safe to restore old handler.
4267 signal.signal(signal.SIGALRM, old_alarm)
4268
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004269class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004270
4271 def testUDPTimeout(self):
4272 def raise_timeout(*args, **kwargs):
4273 self.serv.settimeout(1.0)
4274 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004275 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004276 "Error generating a timeout exception (UDP)")
4277
4278 def testTimeoutZero(self):
4279 ok = False
4280 try:
4281 self.serv.settimeout(0.0)
4282 foo = self.serv.recv(1024)
4283 except socket.timeout:
4284 self.fail("caught timeout instead of error (UDP)")
4285 except socket.error:
4286 ok = True
4287 except:
4288 self.fail("caught unexpected exception (UDP)")
4289 if not ok:
4290 self.fail("recv() returned success when we did not expect it")
4291
4292class TestExceptions(unittest.TestCase):
4293
4294 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004295 self.assertTrue(issubclass(socket.error, Exception))
4296 self.assertTrue(issubclass(socket.herror, socket.error))
4297 self.assertTrue(issubclass(socket.gaierror, socket.error))
4298 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004299
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004300class TestLinuxAbstractNamespace(unittest.TestCase):
4301
4302 UNIX_PATH_MAX = 108
4303
4304 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004305 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004306 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4307 s1.bind(address)
4308 s1.listen(1)
4309 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4310 s2.connect(s1.getsockname())
4311 with s1.accept()[0] as s3:
4312 self.assertEqual(s1.getsockname(), address)
4313 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004314
4315 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004316 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004317 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4318 s.bind(address)
4319 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004320
4321 def testNameOverflow(self):
4322 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004323 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4324 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004325
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004326 def testStrName(self):
4327 # Check that an abstract name can be passed as a string.
4328 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4329 try:
4330 s.bind("\x00python\x00test\x00")
4331 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4332 finally:
4333 s.close()
4334
4335class TestUnixDomain(unittest.TestCase):
4336
4337 def setUp(self):
4338 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4339
4340 def tearDown(self):
4341 self.sock.close()
4342
4343 def encoded(self, path):
4344 # Return the given path encoded in the file system encoding,
4345 # or skip the test if this is not possible.
4346 try:
4347 return os.fsencode(path)
4348 except UnicodeEncodeError:
4349 self.skipTest(
4350 "Pathname {0!a} cannot be represented in file "
4351 "system encoding {1!r}".format(
4352 path, sys.getfilesystemencoding()))
4353
Antoine Pitrou16374872011-12-16 15:04:12 +01004354 def bind(self, sock, path):
4355 # Bind the socket
4356 try:
4357 sock.bind(path)
4358 except OSError as e:
4359 if str(e) == "AF_UNIX path too long":
4360 self.skipTest(
4361 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4362 .format(path))
4363 else:
4364 raise
4365
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004366 def testStrAddr(self):
4367 # Test binding to and retrieving a normal string pathname.
4368 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004369 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004370 self.addCleanup(support.unlink, path)
4371 self.assertEqual(self.sock.getsockname(), path)
4372
4373 def testBytesAddr(self):
4374 # Test binding to a bytes pathname.
4375 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004376 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004377 self.addCleanup(support.unlink, path)
4378 self.assertEqual(self.sock.getsockname(), path)
4379
4380 def testSurrogateescapeBind(self):
4381 # Test binding to a valid non-ASCII pathname, with the
4382 # non-ASCII bytes supplied using surrogateescape encoding.
4383 path = os.path.abspath(support.TESTFN_UNICODE)
4384 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004385 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004386 self.addCleanup(support.unlink, path)
4387 self.assertEqual(self.sock.getsockname(), path)
4388
4389 def testUnencodableAddr(self):
4390 # Test binding to a pathname that cannot be encoded in the
4391 # file system encoding.
4392 if support.TESTFN_UNENCODABLE is None:
4393 self.skipTest("No unencodable filename available")
4394 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004395 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004396 self.addCleanup(support.unlink, path)
4397 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004398
Victor Stinner45df8202010-04-28 22:31:17 +00004399@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004400class BufferIOTest(SocketConnectedTest):
4401 """
4402 Test the buffer versions of socket.recv() and socket.send().
4403 """
4404 def __init__(self, methodName='runTest'):
4405 SocketConnectedTest.__init__(self, methodName=methodName)
4406
Antoine Pitrou25480782010-03-17 22:50:28 +00004407 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004408 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004409 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004410 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004411 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004412 self.assertEqual(msg, MSG)
4413
Antoine Pitrou25480782010-03-17 22:50:28 +00004414 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004415 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004416 self.serv_conn.send(buf)
4417
Antoine Pitrou25480782010-03-17 22:50:28 +00004418 def testRecvIntoBytearray(self):
4419 buf = bytearray(1024)
4420 nbytes = self.cli_conn.recv_into(buf)
4421 self.assertEqual(nbytes, len(MSG))
4422 msg = buf[:len(MSG)]
4423 self.assertEqual(msg, MSG)
4424
4425 _testRecvIntoBytearray = _testRecvIntoArray
4426
4427 def testRecvIntoMemoryview(self):
4428 buf = bytearray(1024)
4429 nbytes = self.cli_conn.recv_into(memoryview(buf))
4430 self.assertEqual(nbytes, len(MSG))
4431 msg = buf[:len(MSG)]
4432 self.assertEqual(msg, MSG)
4433
4434 _testRecvIntoMemoryview = _testRecvIntoArray
4435
4436 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004437 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004438 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004439 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004440 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004441 self.assertEqual(msg, MSG)
4442
Antoine Pitrou25480782010-03-17 22:50:28 +00004443 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004444 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004445 self.serv_conn.send(buf)
4446
Antoine Pitrou25480782010-03-17 22:50:28 +00004447 def testRecvFromIntoBytearray(self):
4448 buf = bytearray(1024)
4449 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4450 self.assertEqual(nbytes, len(MSG))
4451 msg = buf[:len(MSG)]
4452 self.assertEqual(msg, MSG)
4453
4454 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4455
4456 def testRecvFromIntoMemoryview(self):
4457 buf = bytearray(1024)
4458 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4459 self.assertEqual(nbytes, len(MSG))
4460 msg = buf[:len(MSG)]
4461 self.assertEqual(msg, MSG)
4462
4463 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4464
Christian Heimes043d6f62008-01-07 17:19:16 +00004465
4466TIPC_STYPE = 2000
4467TIPC_LOWER = 200
4468TIPC_UPPER = 210
4469
4470def isTipcAvailable():
4471 """Check if the TIPC module is loaded
4472
4473 The TIPC module is not loaded automatically on Ubuntu and probably
4474 other Linux distros.
4475 """
4476 if not hasattr(socket, "AF_TIPC"):
4477 return False
4478 if not os.path.isfile("/proc/modules"):
4479 return False
4480 with open("/proc/modules") as f:
4481 for line in f:
4482 if line.startswith("tipc "):
4483 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004484 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004485 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4486 return False
4487
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004488class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004489 def testRDM(self):
4490 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4491 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004492 self.addCleanup(srv.close)
4493 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004494
4495 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4496 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4497 TIPC_LOWER, TIPC_UPPER)
4498 srv.bind(srvaddr)
4499
4500 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4501 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4502 cli.sendto(MSG, sendaddr)
4503
4504 msg, recvaddr = srv.recvfrom(1024)
4505
4506 self.assertEqual(cli.getsockname(), recvaddr)
4507 self.assertEqual(msg, MSG)
4508
4509
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004510class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004511 def __init__(self, methodName = 'runTest'):
4512 unittest.TestCase.__init__(self, methodName = methodName)
4513 ThreadableTest.__init__(self)
4514
4515 def setUp(self):
4516 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004517 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004518 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4519 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4520 TIPC_LOWER, TIPC_UPPER)
4521 self.srv.bind(srvaddr)
4522 self.srv.listen(5)
4523 self.serverExplicitReady()
4524 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004525 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004526
4527 def clientSetUp(self):
4528 # The is a hittable race between serverExplicitReady() and the
4529 # accept() call; sleep a little while to avoid it, otherwise
4530 # we could get an exception
4531 time.sleep(0.1)
4532 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004533 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004534 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4535 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4536 self.cli.connect(addr)
4537 self.cliaddr = self.cli.getsockname()
4538
4539 def testStream(self):
4540 msg = self.conn.recv(1024)
4541 self.assertEqual(msg, MSG)
4542 self.assertEqual(self.cliaddr, self.connaddr)
4543
4544 def _testStream(self):
4545 self.cli.send(MSG)
4546 self.cli.close()
4547
4548
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004549@unittest.skipUnless(thread, 'Threading required for this test.')
4550class ContextManagersTest(ThreadedTCPSocketTest):
4551
4552 def _testSocketClass(self):
4553 # base test
4554 with socket.socket() as sock:
4555 self.assertFalse(sock._closed)
4556 self.assertTrue(sock._closed)
4557 # close inside with block
4558 with socket.socket() as sock:
4559 sock.close()
4560 self.assertTrue(sock._closed)
4561 # exception inside with block
4562 with socket.socket() as sock:
4563 self.assertRaises(socket.error, sock.sendall, b'foo')
4564 self.assertTrue(sock._closed)
4565
4566 def testCreateConnectionBase(self):
4567 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004568 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004569 data = conn.recv(1024)
4570 conn.sendall(data)
4571
4572 def _testCreateConnectionBase(self):
4573 address = self.serv.getsockname()
4574 with socket.create_connection(address) as sock:
4575 self.assertFalse(sock._closed)
4576 sock.sendall(b'foo')
4577 self.assertEqual(sock.recv(1024), b'foo')
4578 self.assertTrue(sock._closed)
4579
4580 def testCreateConnectionClose(self):
4581 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004582 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004583 data = conn.recv(1024)
4584 conn.sendall(data)
4585
4586 def _testCreateConnectionClose(self):
4587 address = self.serv.getsockname()
4588 with socket.create_connection(address) as sock:
4589 sock.close()
4590 self.assertTrue(sock._closed)
4591 self.assertRaises(socket.error, sock.sendall, b'foo')
4592
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004593
Antoine Pitroub1c54962010-10-14 15:05:38 +00004594@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4595 "SOCK_CLOEXEC not defined")
4596@unittest.skipUnless(fcntl, "module fcntl not available")
4597class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004598 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004599 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004600 with socket.socket(socket.AF_INET,
4601 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4602 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4603 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004604
4605
4606@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4607 "SOCK_NONBLOCK not defined")
4608class NonblockConstantTest(unittest.TestCase):
4609 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4610 if nonblock:
4611 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4612 self.assertEqual(s.gettimeout(), timeout)
4613 else:
4614 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4615 self.assertEqual(s.gettimeout(), None)
4616
Charles-François Natali239bb962011-06-03 12:55:15 +02004617 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004618 def test_SOCK_NONBLOCK(self):
4619 # a lot of it seems silly and redundant, but I wanted to test that
4620 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004621 with socket.socket(socket.AF_INET,
4622 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4623 self.checkNonblock(s)
4624 s.setblocking(1)
4625 self.checkNonblock(s, False)
4626 s.setblocking(0)
4627 self.checkNonblock(s)
4628 s.settimeout(None)
4629 self.checkNonblock(s, False)
4630 s.settimeout(2.0)
4631 self.checkNonblock(s, timeout=2.0)
4632 s.setblocking(1)
4633 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004634 # defaulttimeout
4635 t = socket.getdefaulttimeout()
4636 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004637 with socket.socket() as s:
4638 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004639 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004640 with socket.socket() as s:
4641 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004642 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004643 with socket.socket() as s:
4644 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004645 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004646 with socket.socket() as s:
4647 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004648 socket.setdefaulttimeout(t)
4649
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004650
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004651@unittest.skipUnless(os.name == "nt", "Windows specific")
4652@unittest.skipUnless(multiprocessing, "need multiprocessing")
4653class TestSocketSharing(SocketTCPTest):
4654 # This must be classmethod and not staticmethod or multiprocessing
4655 # won't be able to bootstrap it.
4656 @classmethod
4657 def remoteProcessServer(cls, q):
4658 # Recreate socket from shared data
4659 sdata = q.get()
4660 message = q.get()
4661
4662 s = socket.fromshare(sdata)
4663 s2, c = s.accept()
4664
4665 # Send the message
4666 s2.sendall(message)
4667 s2.close()
4668 s.close()
4669
4670 def testShare(self):
4671 # Transfer the listening server socket to another process
4672 # and service it from there.
4673
4674 # Create process:
4675 q = multiprocessing.Queue()
4676 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4677 p.start()
4678
4679 # Get the shared socket data
4680 data = self.serv.share(p.pid)
4681
4682 # Pass the shared socket to the other process
4683 addr = self.serv.getsockname()
4684 self.serv.close()
4685 q.put(data)
4686
4687 # The data that the server will send us
4688 message = b"slapmahfro"
4689 q.put(message)
4690
4691 # Connect
4692 s = socket.create_connection(addr)
4693 # listen for the data
4694 m = []
4695 while True:
4696 data = s.recv(100)
4697 if not data:
4698 break
4699 m.append(data)
4700 s.close()
4701 received = b"".join(m)
4702 self.assertEqual(received, message)
4703 p.join()
4704
4705 def testShareLength(self):
4706 data = self.serv.share(os.getpid())
4707 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4708 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4709
4710 def compareSockets(self, org, other):
4711 # socket sharing is expected to work only for blocking socket
4712 # since the internal python timout value isn't transfered.
4713 self.assertEqual(org.gettimeout(), None)
4714 self.assertEqual(org.gettimeout(), other.gettimeout())
4715
4716 self.assertEqual(org.family, other.family)
4717 self.assertEqual(org.type, other.type)
4718 # If the user specified "0" for proto, then
4719 # internally windows will have picked the correct value.
4720 # Python introspection on the socket however will still return
4721 # 0. For the shared socket, the python value is recreated
4722 # from the actual value, so it may not compare correctly.
4723 if org.proto != 0:
4724 self.assertEqual(org.proto, other.proto)
4725
4726 def testShareLocal(self):
4727 data = self.serv.share(os.getpid())
4728 s = socket.fromshare(data)
4729 try:
4730 self.compareSockets(self.serv, s)
4731 finally:
4732 s.close()
4733
4734 def testTypes(self):
4735 families = [socket.AF_INET, socket.AF_INET6]
4736 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4737 for f in families:
4738 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004739 try:
4740 source = socket.socket(f, t)
4741 except OSError:
4742 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004743 try:
4744 data = source.share(os.getpid())
4745 shared = socket.fromshare(data)
4746 try:
4747 self.compareSockets(source, shared)
4748 finally:
4749 shared.close()
4750 finally:
4751 source.close()
4752
4753
Guido van Rossumb995eb72002-07-31 16:08:40 +00004754def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004755 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004756 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004757
4758 tests.extend([
4759 NonBlockingTCPTests,
4760 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004761 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004762 UnbufferedFileObjectClassTestCase,
4763 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004764 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004765 UnicodeReadFileObjectClassTestCase,
4766 UnicodeWriteFileObjectClassTestCase,
4767 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004768 NetworkConnectionNoServer,
4769 NetworkConnectionAttributesTest,
4770 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004771 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004772 CloexecConstantTest,
4773 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004774 ])
Dave Cole331708b2004-08-09 04:51:41 +00004775 if hasattr(socket, "socketpair"):
4776 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004777 if hasattr(socket, "AF_UNIX"):
4778 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004779 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004780 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004781 if isTipcAvailable():
4782 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004783 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004784 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004785 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004786 tests.extend([
4787 CmsgMacroTests,
4788 SendmsgUDPTest,
4789 RecvmsgUDPTest,
4790 RecvmsgIntoUDPTest,
4791 SendmsgUDP6Test,
4792 RecvmsgUDP6Test,
4793 RecvmsgRFC3542AncillaryUDP6Test,
4794 RecvmsgIntoRFC3542AncillaryUDP6Test,
4795 RecvmsgIntoUDP6Test,
4796 SendmsgTCPTest,
4797 RecvmsgTCPTest,
4798 RecvmsgIntoTCPTest,
4799 SendmsgSCTPStreamTest,
4800 RecvmsgSCTPStreamTest,
4801 RecvmsgIntoSCTPStreamTest,
4802 SendmsgUnixStreamTest,
4803 RecvmsgUnixStreamTest,
4804 RecvmsgIntoUnixStreamTest,
4805 RecvmsgSCMRightsStreamTest,
4806 RecvmsgIntoSCMRightsStreamTest,
4807 # These are slow when setitimer() is not available
4808 InterruptedRecvTimeoutTest,
4809 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004810 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004811 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004812
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004813 thread_info = support.threading_setup()
4814 support.run_unittest(*tests)
4815 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004816
4817if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004818 test_main()