blob: d7c9a31decdfd9c5daed53f1412065c2476001b4 [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 Pitrou1e7ee9d2012-09-14 17:28:10 +02001248 def test_unusable_closed_socketio(self):
1249 with socket.socket() as sock:
1250 fp = sock.makefile("rb", buffering=0)
1251 self.assertTrue(fp.readable())
1252 self.assertFalse(fp.writable())
1253 self.assertFalse(fp.seekable())
1254 fp.close()
1255 self.assertRaises(ValueError, fp.readable)
1256 self.assertRaises(ValueError, fp.writable)
1257 self.assertRaises(ValueError, fp.seekable)
1258
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001259 def test_pickle(self):
1260 sock = socket.socket()
1261 with sock:
1262 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1263 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1264
Antoine Pitrou3cade992011-05-10 19:19:13 +02001265 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001266 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1267 srv.bind((HOST, 0))
1268 # backlog = 0
1269 srv.listen(0)
1270 srv.close()
1271
Charles-François Natali42663332012-01-02 15:57:30 +01001272 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001273 def test_flowinfo(self):
1274 self.assertRaises(OverflowError, socket.getnameinfo,
1275 ('::1',0, 0xffffffff), 0)
1276 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1277 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1278
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001279
Charles-François Natali47413c12011-10-06 19:47:44 +02001280@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1281class BasicCANTest(unittest.TestCase):
1282
1283 def testCrucialConstants(self):
1284 socket.AF_CAN
1285 socket.PF_CAN
1286 socket.CAN_RAW
1287
1288 def testCreateSocket(self):
1289 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1290 pass
1291
1292 def testBindAny(self):
1293 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1294 s.bind(('', ))
1295
1296 def testTooLongInterfaceName(self):
1297 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1298 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001299 self.assertRaisesRegex(socket.error, 'interface name too long',
1300 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001301
1302 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1303 'socket.CAN_RAW_LOOPBACK required for this test.')
1304 def testLoopback(self):
1305 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1306 for loopback in (0, 1):
1307 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1308 loopback)
1309 self.assertEqual(loopback,
1310 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1311
1312 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1313 'socket.CAN_RAW_FILTER required for this test.')
1314 def testFilter(self):
1315 can_id, can_mask = 0x200, 0x700
1316 can_filter = struct.pack("=II", can_id, can_mask)
1317 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1318 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1319 self.assertEqual(can_filter,
1320 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1321
1322
1323@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1324@unittest.skipUnless(thread, 'Threading required for this test.')
1325class CANTest(ThreadedCANSocketTest):
1326
1327 """The CAN frame structure is defined in <linux/can.h>:
1328
1329 struct can_frame {
1330 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1331 __u8 can_dlc; /* data length code: 0 .. 8 */
1332 __u8 data[8] __attribute__((aligned(8)));
1333 };
1334 """
1335 can_frame_fmt = "=IB3x8s"
1336
1337 def __init__(self, methodName='runTest'):
1338 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1339
1340 @classmethod
1341 def build_can_frame(cls, can_id, data):
1342 """Build a CAN frame."""
1343 can_dlc = len(data)
1344 data = data.ljust(8, b'\x00')
1345 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1346
1347 @classmethod
1348 def dissect_can_frame(cls, frame):
1349 """Dissect a CAN frame."""
1350 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1351 return (can_id, can_dlc, data[:can_dlc])
1352
1353 def testSendFrame(self):
1354 cf, addr = self.s.recvfrom(self.bufsize)
1355 self.assertEqual(self.cf, cf)
1356 self.assertEqual(addr[0], self.interface)
1357 self.assertEqual(addr[1], socket.AF_CAN)
1358
1359 def _testSendFrame(self):
1360 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1361 self.cli.send(self.cf)
1362
1363 def testSendMaxFrame(self):
1364 cf, addr = self.s.recvfrom(self.bufsize)
1365 self.assertEqual(self.cf, cf)
1366
1367 def _testSendMaxFrame(self):
1368 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1369 self.cli.send(self.cf)
1370
1371 def testSendMultiFrames(self):
1372 cf, addr = self.s.recvfrom(self.bufsize)
1373 self.assertEqual(self.cf1, cf)
1374
1375 cf, addr = self.s.recvfrom(self.bufsize)
1376 self.assertEqual(self.cf2, cf)
1377
1378 def _testSendMultiFrames(self):
1379 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1380 self.cli.send(self.cf1)
1381
1382 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1383 self.cli.send(self.cf2)
1384
1385
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001386@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1387class BasicRDSTest(unittest.TestCase):
1388
1389 def testCrucialConstants(self):
1390 socket.AF_RDS
1391 socket.PF_RDS
1392
1393 def testCreateSocket(self):
1394 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1395 pass
1396
1397 def testSocketBufferSize(self):
1398 bufsize = 16384
1399 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1400 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1401 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1402
1403
1404@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1405@unittest.skipUnless(thread, 'Threading required for this test.')
1406class RDSTest(ThreadedRDSSocketTest):
1407
1408 def __init__(self, methodName='runTest'):
1409 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1410
Charles-François Natali240c55f2011-11-10 20:33:36 +01001411 def setUp(self):
1412 super().setUp()
1413 self.evt = threading.Event()
1414
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001415 def testSendAndRecv(self):
1416 data, addr = self.serv.recvfrom(self.bufsize)
1417 self.assertEqual(self.data, data)
1418 self.assertEqual(self.cli_addr, addr)
1419
1420 def _testSendAndRecv(self):
1421 self.data = b'spam'
1422 self.cli.sendto(self.data, 0, (HOST, self.port))
1423
1424 def testPeek(self):
1425 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1426 self.assertEqual(self.data, data)
1427 data, addr = self.serv.recvfrom(self.bufsize)
1428 self.assertEqual(self.data, data)
1429
1430 def _testPeek(self):
1431 self.data = b'spam'
1432 self.cli.sendto(self.data, 0, (HOST, self.port))
1433
1434 @requireAttrs(socket.socket, 'recvmsg')
1435 def testSendAndRecvMsg(self):
1436 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1437 self.assertEqual(self.data, data)
1438
1439 @requireAttrs(socket.socket, 'sendmsg')
1440 def _testSendAndRecvMsg(self):
1441 self.data = b'hello ' * 10
1442 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1443
1444 def testSendAndRecvMulti(self):
1445 data, addr = self.serv.recvfrom(self.bufsize)
1446 self.assertEqual(self.data1, data)
1447
1448 data, addr = self.serv.recvfrom(self.bufsize)
1449 self.assertEqual(self.data2, data)
1450
1451 def _testSendAndRecvMulti(self):
1452 self.data1 = b'bacon'
1453 self.cli.sendto(self.data1, 0, (HOST, self.port))
1454
1455 self.data2 = b'egg'
1456 self.cli.sendto(self.data2, 0, (HOST, self.port))
1457
1458 def testSelect(self):
1459 r, w, x = select.select([self.serv], [], [], 3.0)
1460 self.assertIn(self.serv, r)
1461 data, addr = self.serv.recvfrom(self.bufsize)
1462 self.assertEqual(self.data, data)
1463
1464 def _testSelect(self):
1465 self.data = b'select'
1466 self.cli.sendto(self.data, 0, (HOST, self.port))
1467
1468 def testCongestion(self):
1469 # wait until the sender is done
1470 self.evt.wait()
1471
1472 def _testCongestion(self):
1473 # test the behavior in case of congestion
1474 self.data = b'fill'
1475 self.cli.setblocking(False)
1476 try:
1477 # try to lower the receiver's socket buffer size
1478 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1479 except OSError:
1480 pass
1481 with self.assertRaises(OSError) as cm:
1482 try:
1483 # fill the receiver's socket buffer
1484 while True:
1485 self.cli.sendto(self.data, 0, (HOST, self.port))
1486 finally:
1487 # signal the receiver we're done
1488 self.evt.set()
1489 # sendto() should have failed with ENOBUFS
1490 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1491 # and we should have received a congestion notification through poll
1492 r, w, x = select.select([self.serv], [], [], 3.0)
1493 self.assertIn(self.serv, r)
1494
1495
Victor Stinner45df8202010-04-28 22:31:17 +00001496@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001497class BasicTCPTest(SocketConnectedTest):
1498
1499 def __init__(self, methodName='runTest'):
1500 SocketConnectedTest.__init__(self, methodName=methodName)
1501
1502 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001503 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001504 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001505 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001506
1507 def _testRecv(self):
1508 self.serv_conn.send(MSG)
1509
1510 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001511 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001512 seg1 = self.cli_conn.recv(len(MSG) - 3)
1513 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001514 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001515 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001516
1517 def _testOverFlowRecv(self):
1518 self.serv_conn.send(MSG)
1519
1520 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001521 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001522 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001523 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001524
1525 def _testRecvFrom(self):
1526 self.serv_conn.send(MSG)
1527
1528 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001529 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001530 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1531 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001532 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001533 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001534
1535 def _testOverFlowRecvFrom(self):
1536 self.serv_conn.send(MSG)
1537
1538 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001539 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001540 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001541 while 1:
1542 read = self.cli_conn.recv(1024)
1543 if not read:
1544 break
Guido van Rossume531e292002-08-08 20:28:34 +00001545 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001546 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001547
1548 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001549 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001550 self.serv_conn.sendall(big_chunk)
1551
1552 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001553 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001554 fd = self.cli_conn.fileno()
1555 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001556 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001557 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001558 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001559 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001560
1561 def _testFromFd(self):
1562 self.serv_conn.send(MSG)
1563
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001564 def testDup(self):
1565 # Testing dup()
1566 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001567 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001568 msg = sock.recv(1024)
1569 self.assertEqual(msg, MSG)
1570
1571 def _testDup(self):
1572 self.serv_conn.send(MSG)
1573
Guido van Rossum24e4af82002-06-12 19:18:08 +00001574 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001575 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001576 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001577 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001578 # wait for _testShutdown to finish: on OS X, when the server
1579 # closes the connection the client also becomes disconnected,
1580 # and the client's shutdown call will fail. (Issue #4397.)
1581 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001582
1583 def _testShutdown(self):
1584 self.serv_conn.send(MSG)
1585 self.serv_conn.shutdown(2)
1586
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001587 def testDetach(self):
1588 # Testing detach()
1589 fileno = self.cli_conn.fileno()
1590 f = self.cli_conn.detach()
1591 self.assertEqual(f, fileno)
1592 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001593 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001594 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1595 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001596 # ...but we can create another socket using the (still open)
1597 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001598 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001599 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001600 msg = sock.recv(1024)
1601 self.assertEqual(msg, MSG)
1602
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001603 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001604 self.serv_conn.send(MSG)
1605
Victor Stinner45df8202010-04-28 22:31:17 +00001606@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001607class BasicUDPTest(ThreadedUDPSocketTest):
1608
1609 def __init__(self, methodName='runTest'):
1610 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1611
1612 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001613 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001614 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001615 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001616
1617 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001618 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001619
Guido van Rossum1c938012002-06-12 21:17:20 +00001620 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001621 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001622 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001623 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001624
Guido van Rossum1c938012002-06-12 21:17:20 +00001625 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001626 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001627
Guido van Rossumd8faa362007-04-27 19:54:29 +00001628 def testRecvFromNegative(self):
1629 # Negative lengths passed to recvfrom should give ValueError.
1630 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1631
1632 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001633 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001634
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001635# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1636# same test code is used with different families and types of socket
1637# (e.g. stream, datagram), and tests using recvmsg() are repeated
1638# using recvmsg_into().
1639#
1640# The generic test classes such as SendmsgTests and
1641# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1642# supplied with sockets cli_sock and serv_sock representing the
1643# client's and the server's end of the connection respectively, and
1644# attributes cli_addr and serv_addr holding their (numeric where
1645# appropriate) addresses.
1646#
1647# The final concrete test classes combine these with subclasses of
1648# SocketTestBase which set up client and server sockets of a specific
1649# type, and with subclasses of SendrecvmsgBase such as
1650# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1651# sockets to cli_sock and serv_sock and override the methods and
1652# attributes of SendrecvmsgBase to fill in destination addresses if
1653# needed when sending, check for specific flags in msg_flags, etc.
1654#
1655# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1656# recvmsg_into().
1657
1658# XXX: like the other datagram (UDP) tests in this module, the code
1659# here assumes that datagram delivery on the local machine will be
1660# reliable.
1661
1662class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1663 # Base class for sendmsg()/recvmsg() tests.
1664
1665 # Time in seconds to wait before considering a test failed, or
1666 # None for no timeout. Not all tests actually set a timeout.
1667 fail_timeout = 3.0
1668
1669 def setUp(self):
1670 self.misc_event = threading.Event()
1671 super().setUp()
1672
1673 def sendToServer(self, msg):
1674 # Send msg to the server.
1675 return self.cli_sock.send(msg)
1676
1677 # Tuple of alternative default arguments for sendmsg() when called
1678 # via sendmsgToServer() (e.g. to include a destination address).
1679 sendmsg_to_server_defaults = ()
1680
1681 def sendmsgToServer(self, *args):
1682 # Call sendmsg() on self.cli_sock with the given arguments,
1683 # filling in any arguments which are not supplied with the
1684 # corresponding items of self.sendmsg_to_server_defaults, if
1685 # any.
1686 return self.cli_sock.sendmsg(
1687 *(args + self.sendmsg_to_server_defaults[len(args):]))
1688
1689 def doRecvmsg(self, sock, bufsize, *args):
1690 # Call recvmsg() on sock with given arguments and return its
1691 # result. Should be used for tests which can use either
1692 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1693 # this method with one which emulates it using recvmsg_into(),
1694 # thus allowing the same test to be used for both methods.
1695 result = sock.recvmsg(bufsize, *args)
1696 self.registerRecvmsgResult(result)
1697 return result
1698
1699 def registerRecvmsgResult(self, result):
1700 # Called by doRecvmsg() with the return value of recvmsg() or
1701 # recvmsg_into(). Can be overridden to arrange cleanup based
1702 # on the returned ancillary data, for instance.
1703 pass
1704
1705 def checkRecvmsgAddress(self, addr1, addr2):
1706 # Called to compare the received address with the address of
1707 # the peer.
1708 self.assertEqual(addr1, addr2)
1709
1710 # Flags that are normally unset in msg_flags
1711 msg_flags_common_unset = 0
1712 for name in ("MSG_CTRUNC", "MSG_OOB"):
1713 msg_flags_common_unset |= getattr(socket, name, 0)
1714
1715 # Flags that are normally set
1716 msg_flags_common_set = 0
1717
1718 # Flags set when a complete record has been received (e.g. MSG_EOR
1719 # for SCTP)
1720 msg_flags_eor_indicator = 0
1721
1722 # Flags set when a complete record has not been received
1723 # (e.g. MSG_TRUNC for datagram sockets)
1724 msg_flags_non_eor_indicator = 0
1725
1726 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1727 # Method to check the value of msg_flags returned by recvmsg[_into]().
1728 #
1729 # Checks that all bits in msg_flags_common_set attribute are
1730 # set in "flags" and all bits in msg_flags_common_unset are
1731 # unset.
1732 #
1733 # The "eor" argument specifies whether the flags should
1734 # indicate that a full record (or datagram) has been received.
1735 # If "eor" is None, no checks are done; otherwise, checks
1736 # that:
1737 #
1738 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1739 # set and all bits in msg_flags_non_eor_indicator are unset
1740 #
1741 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1742 # are set and all bits in msg_flags_eor_indicator are unset
1743 #
1744 # If "checkset" and/or "checkunset" are supplied, they require
1745 # the given bits to be set or unset respectively, overriding
1746 # what the attributes require for those bits.
1747 #
1748 # If any bits are set in "ignore", they will not be checked,
1749 # regardless of the other inputs.
1750 #
1751 # Will raise Exception if the inputs require a bit to be both
1752 # set and unset, and it is not ignored.
1753
1754 defaultset = self.msg_flags_common_set
1755 defaultunset = self.msg_flags_common_unset
1756
1757 if eor:
1758 defaultset |= self.msg_flags_eor_indicator
1759 defaultunset |= self.msg_flags_non_eor_indicator
1760 elif eor is not None:
1761 defaultset |= self.msg_flags_non_eor_indicator
1762 defaultunset |= self.msg_flags_eor_indicator
1763
1764 # Function arguments override defaults
1765 defaultset &= ~checkunset
1766 defaultunset &= ~checkset
1767
1768 # Merge arguments with remaining defaults, and check for conflicts
1769 checkset |= defaultset
1770 checkunset |= defaultunset
1771 inboth = checkset & checkunset & ~ignore
1772 if inboth:
1773 raise Exception("contradictory set, unset requirements for flags "
1774 "{0:#x}".format(inboth))
1775
1776 # Compare with given msg_flags value
1777 mask = (checkset | checkunset) & ~ignore
1778 self.assertEqual(flags & mask, checkset & mask)
1779
1780
1781class RecvmsgIntoMixin(SendrecvmsgBase):
1782 # Mixin to implement doRecvmsg() using recvmsg_into().
1783
1784 def doRecvmsg(self, sock, bufsize, *args):
1785 buf = bytearray(bufsize)
1786 result = sock.recvmsg_into([buf], *args)
1787 self.registerRecvmsgResult(result)
1788 self.assertGreaterEqual(result[0], 0)
1789 self.assertLessEqual(result[0], bufsize)
1790 return (bytes(buf[:result[0]]),) + result[1:]
1791
1792
1793class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1794 # Defines flags to be checked in msg_flags for datagram sockets.
1795
1796 @property
1797 def msg_flags_non_eor_indicator(self):
1798 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1799
1800
1801class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1802 # Defines flags to be checked in msg_flags for SCTP sockets.
1803
1804 @property
1805 def msg_flags_eor_indicator(self):
1806 return super().msg_flags_eor_indicator | socket.MSG_EOR
1807
1808
1809class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1810 # Base class for tests on connectionless-mode sockets. Users must
1811 # supply sockets on attributes cli and serv to be mapped to
1812 # cli_sock and serv_sock respectively.
1813
1814 @property
1815 def serv_sock(self):
1816 return self.serv
1817
1818 @property
1819 def cli_sock(self):
1820 return self.cli
1821
1822 @property
1823 def sendmsg_to_server_defaults(self):
1824 return ([], [], 0, self.serv_addr)
1825
1826 def sendToServer(self, msg):
1827 return self.cli_sock.sendto(msg, self.serv_addr)
1828
1829
1830class SendrecvmsgConnectedBase(SendrecvmsgBase):
1831 # Base class for tests on connected sockets. Users must supply
1832 # sockets on attributes serv_conn and cli_conn (representing the
1833 # connections *to* the server and the client), to be mapped to
1834 # cli_sock and serv_sock respectively.
1835
1836 @property
1837 def serv_sock(self):
1838 return self.cli_conn
1839
1840 @property
1841 def cli_sock(self):
1842 return self.serv_conn
1843
1844 def checkRecvmsgAddress(self, addr1, addr2):
1845 # Address is currently "unspecified" for a connected socket,
1846 # so we don't examine it
1847 pass
1848
1849
1850class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1851 # Base class to set a timeout on server's socket.
1852
1853 def setUp(self):
1854 super().setUp()
1855 self.serv_sock.settimeout(self.fail_timeout)
1856
1857
1858class SendmsgTests(SendrecvmsgServerTimeoutBase):
1859 # Tests for sendmsg() which can use any socket type and do not
1860 # involve recvmsg() or recvmsg_into().
1861
1862 def testSendmsg(self):
1863 # Send a simple message with sendmsg().
1864 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1865
1866 def _testSendmsg(self):
1867 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1868
1869 def testSendmsgDataGenerator(self):
1870 # Send from buffer obtained from a generator (not a sequence).
1871 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1872
1873 def _testSendmsgDataGenerator(self):
1874 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1875 len(MSG))
1876
1877 def testSendmsgAncillaryGenerator(self):
1878 # Gather (empty) ancillary data from a generator.
1879 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1880
1881 def _testSendmsgAncillaryGenerator(self):
1882 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1883 len(MSG))
1884
1885 def testSendmsgArray(self):
1886 # Send data from an array instead of the usual bytes object.
1887 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1888
1889 def _testSendmsgArray(self):
1890 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1891 len(MSG))
1892
1893 def testSendmsgGather(self):
1894 # Send message data from more than one buffer (gather write).
1895 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1896
1897 def _testSendmsgGather(self):
1898 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1899
1900 def testSendmsgBadArgs(self):
1901 # Check that sendmsg() rejects invalid arguments.
1902 self.assertEqual(self.serv_sock.recv(1000), b"done")
1903
1904 def _testSendmsgBadArgs(self):
1905 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1906 self.assertRaises(TypeError, self.sendmsgToServer,
1907 b"not in an iterable")
1908 self.assertRaises(TypeError, self.sendmsgToServer,
1909 object())
1910 self.assertRaises(TypeError, self.sendmsgToServer,
1911 [object()])
1912 self.assertRaises(TypeError, self.sendmsgToServer,
1913 [MSG, object()])
1914 self.assertRaises(TypeError, self.sendmsgToServer,
1915 [MSG], object())
1916 self.assertRaises(TypeError, self.sendmsgToServer,
1917 [MSG], [], object())
1918 self.assertRaises(TypeError, self.sendmsgToServer,
1919 [MSG], [], 0, object())
1920 self.sendToServer(b"done")
1921
1922 def testSendmsgBadCmsg(self):
1923 # Check that invalid ancillary data items are rejected.
1924 self.assertEqual(self.serv_sock.recv(1000), b"done")
1925
1926 def _testSendmsgBadCmsg(self):
1927 self.assertRaises(TypeError, self.sendmsgToServer,
1928 [MSG], [object()])
1929 self.assertRaises(TypeError, self.sendmsgToServer,
1930 [MSG], [(object(), 0, b"data")])
1931 self.assertRaises(TypeError, self.sendmsgToServer,
1932 [MSG], [(0, object(), b"data")])
1933 self.assertRaises(TypeError, self.sendmsgToServer,
1934 [MSG], [(0, 0, object())])
1935 self.assertRaises(TypeError, self.sendmsgToServer,
1936 [MSG], [(0, 0)])
1937 self.assertRaises(TypeError, self.sendmsgToServer,
1938 [MSG], [(0, 0, b"data", 42)])
1939 self.sendToServer(b"done")
1940
1941 @requireAttrs(socket, "CMSG_SPACE")
1942 def testSendmsgBadMultiCmsg(self):
1943 # Check that invalid ancillary data items are rejected when
1944 # more than one item is present.
1945 self.assertEqual(self.serv_sock.recv(1000), b"done")
1946
1947 @testSendmsgBadMultiCmsg.client_skip
1948 def _testSendmsgBadMultiCmsg(self):
1949 self.assertRaises(TypeError, self.sendmsgToServer,
1950 [MSG], [0, 0, b""])
1951 self.assertRaises(TypeError, self.sendmsgToServer,
1952 [MSG], [(0, 0, b""), object()])
1953 self.sendToServer(b"done")
1954
1955 def testSendmsgExcessCmsgReject(self):
1956 # Check that sendmsg() rejects excess ancillary data items
1957 # when the number that can be sent is limited.
1958 self.assertEqual(self.serv_sock.recv(1000), b"done")
1959
1960 def _testSendmsgExcessCmsgReject(self):
1961 if not hasattr(socket, "CMSG_SPACE"):
1962 # Can only send one item
1963 with self.assertRaises(socket.error) as cm:
1964 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1965 self.assertIsNone(cm.exception.errno)
1966 self.sendToServer(b"done")
1967
1968 def testSendmsgAfterClose(self):
1969 # Check that sendmsg() fails on a closed socket.
1970 pass
1971
1972 def _testSendmsgAfterClose(self):
1973 self.cli_sock.close()
1974 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1975
1976
1977class SendmsgStreamTests(SendmsgTests):
1978 # Tests for sendmsg() which require a stream socket and do not
1979 # involve recvmsg() or recvmsg_into().
1980
1981 def testSendmsgExplicitNoneAddr(self):
1982 # Check that peer address can be specified as None.
1983 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1984
1985 def _testSendmsgExplicitNoneAddr(self):
1986 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1987
1988 def testSendmsgTimeout(self):
1989 # Check that timeout works with sendmsg().
1990 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1991 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1992
1993 def _testSendmsgTimeout(self):
1994 try:
1995 self.cli_sock.settimeout(0.03)
1996 with self.assertRaises(socket.timeout):
1997 while True:
1998 self.sendmsgToServer([b"a"*512])
1999 finally:
2000 self.misc_event.set()
2001
2002 # XXX: would be nice to have more tests for sendmsg flags argument.
2003
2004 # Linux supports MSG_DONTWAIT when sending, but in general, it
2005 # only works when receiving. Could add other platforms if they
2006 # support it too.
2007 @skipWithClientIf(sys.platform not in {"linux2"},
2008 "MSG_DONTWAIT not known to work on this platform when "
2009 "sending")
2010 def testSendmsgDontWait(self):
2011 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2012 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2013 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2014
2015 @testSendmsgDontWait.client_skip
2016 def _testSendmsgDontWait(self):
2017 try:
2018 with self.assertRaises(socket.error) as cm:
2019 while True:
2020 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2021 self.assertIn(cm.exception.errno,
2022 (errno.EAGAIN, errno.EWOULDBLOCK))
2023 finally:
2024 self.misc_event.set()
2025
2026
2027class SendmsgConnectionlessTests(SendmsgTests):
2028 # Tests for sendmsg() which require a connectionless-mode
2029 # (e.g. datagram) socket, and do not involve recvmsg() or
2030 # recvmsg_into().
2031
2032 def testSendmsgNoDestAddr(self):
2033 # Check that sendmsg() fails when no destination address is
2034 # given for unconnected socket.
2035 pass
2036
2037 def _testSendmsgNoDestAddr(self):
2038 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2039 [MSG])
2040 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2041 [MSG], [], 0, None)
2042
2043
2044class RecvmsgGenericTests(SendrecvmsgBase):
2045 # Tests for recvmsg() which can also be emulated using
2046 # recvmsg_into(), and can use any socket type.
2047
2048 def testRecvmsg(self):
2049 # Receive a simple message with recvmsg[_into]().
2050 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2051 self.assertEqual(msg, MSG)
2052 self.checkRecvmsgAddress(addr, self.cli_addr)
2053 self.assertEqual(ancdata, [])
2054 self.checkFlags(flags, eor=True)
2055
2056 def _testRecvmsg(self):
2057 self.sendToServer(MSG)
2058
2059 def testRecvmsgExplicitDefaults(self):
2060 # Test recvmsg[_into]() with default arguments provided explicitly.
2061 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2062 len(MSG), 0, 0)
2063 self.assertEqual(msg, MSG)
2064 self.checkRecvmsgAddress(addr, self.cli_addr)
2065 self.assertEqual(ancdata, [])
2066 self.checkFlags(flags, eor=True)
2067
2068 def _testRecvmsgExplicitDefaults(self):
2069 self.sendToServer(MSG)
2070
2071 def testRecvmsgShorter(self):
2072 # Receive a message smaller than buffer.
2073 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2074 len(MSG) + 42)
2075 self.assertEqual(msg, MSG)
2076 self.checkRecvmsgAddress(addr, self.cli_addr)
2077 self.assertEqual(ancdata, [])
2078 self.checkFlags(flags, eor=True)
2079
2080 def _testRecvmsgShorter(self):
2081 self.sendToServer(MSG)
2082
Charles-François Natali8619cd72011-10-03 19:43:15 +02002083 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2084 # datagram is received (issue #13001).
2085 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002086 def testRecvmsgTrunc(self):
2087 # Receive part of message, check for truncation indicators.
2088 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2089 len(MSG) - 3)
2090 self.assertEqual(msg, MSG[:-3])
2091 self.checkRecvmsgAddress(addr, self.cli_addr)
2092 self.assertEqual(ancdata, [])
2093 self.checkFlags(flags, eor=False)
2094
Charles-François Natali8619cd72011-10-03 19:43:15 +02002095 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002096 def _testRecvmsgTrunc(self):
2097 self.sendToServer(MSG)
2098
2099 def testRecvmsgShortAncillaryBuf(self):
2100 # Test ancillary data buffer too small to hold any ancillary data.
2101 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2102 len(MSG), 1)
2103 self.assertEqual(msg, MSG)
2104 self.checkRecvmsgAddress(addr, self.cli_addr)
2105 self.assertEqual(ancdata, [])
2106 self.checkFlags(flags, eor=True)
2107
2108 def _testRecvmsgShortAncillaryBuf(self):
2109 self.sendToServer(MSG)
2110
2111 def testRecvmsgLongAncillaryBuf(self):
2112 # Test large ancillary data buffer.
2113 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2114 len(MSG), 10240)
2115 self.assertEqual(msg, MSG)
2116 self.checkRecvmsgAddress(addr, self.cli_addr)
2117 self.assertEqual(ancdata, [])
2118 self.checkFlags(flags, eor=True)
2119
2120 def _testRecvmsgLongAncillaryBuf(self):
2121 self.sendToServer(MSG)
2122
2123 def testRecvmsgAfterClose(self):
2124 # Check that recvmsg[_into]() fails on a closed socket.
2125 self.serv_sock.close()
2126 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2127
2128 def _testRecvmsgAfterClose(self):
2129 pass
2130
2131 def testRecvmsgTimeout(self):
2132 # Check that timeout works.
2133 try:
2134 self.serv_sock.settimeout(0.03)
2135 self.assertRaises(socket.timeout,
2136 self.doRecvmsg, self.serv_sock, len(MSG))
2137 finally:
2138 self.misc_event.set()
2139
2140 def _testRecvmsgTimeout(self):
2141 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2142
2143 @requireAttrs(socket, "MSG_PEEK")
2144 def testRecvmsgPeek(self):
2145 # Check that MSG_PEEK in flags enables examination of pending
2146 # data without consuming it.
2147
2148 # Receive part of data with MSG_PEEK.
2149 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2150 len(MSG) - 3, 0,
2151 socket.MSG_PEEK)
2152 self.assertEqual(msg, MSG[:-3])
2153 self.checkRecvmsgAddress(addr, self.cli_addr)
2154 self.assertEqual(ancdata, [])
2155 # Ignoring MSG_TRUNC here (so this test is the same for stream
2156 # and datagram sockets). Some wording in POSIX seems to
2157 # suggest that it needn't be set when peeking, but that may
2158 # just be a slip.
2159 self.checkFlags(flags, eor=False,
2160 ignore=getattr(socket, "MSG_TRUNC", 0))
2161
2162 # Receive all data with MSG_PEEK.
2163 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2164 len(MSG), 0,
2165 socket.MSG_PEEK)
2166 self.assertEqual(msg, MSG)
2167 self.checkRecvmsgAddress(addr, self.cli_addr)
2168 self.assertEqual(ancdata, [])
2169 self.checkFlags(flags, eor=True)
2170
2171 # Check that the same data can still be received normally.
2172 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2173 self.assertEqual(msg, MSG)
2174 self.checkRecvmsgAddress(addr, self.cli_addr)
2175 self.assertEqual(ancdata, [])
2176 self.checkFlags(flags, eor=True)
2177
2178 @testRecvmsgPeek.client_skip
2179 def _testRecvmsgPeek(self):
2180 self.sendToServer(MSG)
2181
2182 @requireAttrs(socket.socket, "sendmsg")
2183 def testRecvmsgFromSendmsg(self):
2184 # Test receiving with recvmsg[_into]() when message is sent
2185 # using sendmsg().
2186 self.serv_sock.settimeout(self.fail_timeout)
2187 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2188 self.assertEqual(msg, MSG)
2189 self.checkRecvmsgAddress(addr, self.cli_addr)
2190 self.assertEqual(ancdata, [])
2191 self.checkFlags(flags, eor=True)
2192
2193 @testRecvmsgFromSendmsg.client_skip
2194 def _testRecvmsgFromSendmsg(self):
2195 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2196
2197
2198class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2199 # Tests which require a stream socket and can use either recvmsg()
2200 # or recvmsg_into().
2201
2202 def testRecvmsgEOF(self):
2203 # Receive end-of-stream indicator (b"", peer socket closed).
2204 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2205 self.assertEqual(msg, b"")
2206 self.checkRecvmsgAddress(addr, self.cli_addr)
2207 self.assertEqual(ancdata, [])
2208 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2209
2210 def _testRecvmsgEOF(self):
2211 self.cli_sock.close()
2212
2213 def testRecvmsgOverflow(self):
2214 # Receive a message in more than one chunk.
2215 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2216 len(MSG) - 3)
2217 self.checkRecvmsgAddress(addr, self.cli_addr)
2218 self.assertEqual(ancdata, [])
2219 self.checkFlags(flags, eor=False)
2220
2221 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2222 self.checkRecvmsgAddress(addr, self.cli_addr)
2223 self.assertEqual(ancdata, [])
2224 self.checkFlags(flags, eor=True)
2225
2226 msg = seg1 + seg2
2227 self.assertEqual(msg, MSG)
2228
2229 def _testRecvmsgOverflow(self):
2230 self.sendToServer(MSG)
2231
2232
2233class RecvmsgTests(RecvmsgGenericTests):
2234 # Tests for recvmsg() which can use any socket type.
2235
2236 def testRecvmsgBadArgs(self):
2237 # Check that recvmsg() rejects invalid arguments.
2238 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2239 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2240 -1, 0, 0)
2241 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2242 len(MSG), -1, 0)
2243 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2244 [bytearray(10)], 0, 0)
2245 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2246 object(), 0, 0)
2247 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2248 len(MSG), object(), 0)
2249 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2250 len(MSG), 0, object())
2251
2252 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2253 self.assertEqual(msg, MSG)
2254 self.checkRecvmsgAddress(addr, self.cli_addr)
2255 self.assertEqual(ancdata, [])
2256 self.checkFlags(flags, eor=True)
2257
2258 def _testRecvmsgBadArgs(self):
2259 self.sendToServer(MSG)
2260
2261
2262class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2263 # Tests for recvmsg_into() which can use any socket type.
2264
2265 def testRecvmsgIntoBadArgs(self):
2266 # Check that recvmsg_into() rejects invalid arguments.
2267 buf = bytearray(len(MSG))
2268 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2269 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2270 len(MSG), 0, 0)
2271 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2272 buf, 0, 0)
2273 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2274 [object()], 0, 0)
2275 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2276 [b"I'm not writable"], 0, 0)
2277 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2278 [buf, object()], 0, 0)
2279 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2280 [buf], -1, 0)
2281 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2282 [buf], object(), 0)
2283 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2284 [buf], 0, object())
2285
2286 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2287 self.assertEqual(nbytes, len(MSG))
2288 self.assertEqual(buf, bytearray(MSG))
2289 self.checkRecvmsgAddress(addr, self.cli_addr)
2290 self.assertEqual(ancdata, [])
2291 self.checkFlags(flags, eor=True)
2292
2293 def _testRecvmsgIntoBadArgs(self):
2294 self.sendToServer(MSG)
2295
2296 def testRecvmsgIntoGenerator(self):
2297 # Receive into buffer obtained from a generator (not a sequence).
2298 buf = bytearray(len(MSG))
2299 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2300 (o for o in [buf]))
2301 self.assertEqual(nbytes, len(MSG))
2302 self.assertEqual(buf, bytearray(MSG))
2303 self.checkRecvmsgAddress(addr, self.cli_addr)
2304 self.assertEqual(ancdata, [])
2305 self.checkFlags(flags, eor=True)
2306
2307 def _testRecvmsgIntoGenerator(self):
2308 self.sendToServer(MSG)
2309
2310 def testRecvmsgIntoArray(self):
2311 # Receive into an array rather than the usual bytearray.
2312 buf = array.array("B", [0] * len(MSG))
2313 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2314 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002315 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002316 self.checkRecvmsgAddress(addr, self.cli_addr)
2317 self.assertEqual(ancdata, [])
2318 self.checkFlags(flags, eor=True)
2319
2320 def _testRecvmsgIntoArray(self):
2321 self.sendToServer(MSG)
2322
2323 def testRecvmsgIntoScatter(self):
2324 # Receive into multiple buffers (scatter write).
2325 b1 = bytearray(b"----")
2326 b2 = bytearray(b"0123456789")
2327 b3 = bytearray(b"--------------")
2328 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2329 [b1, memoryview(b2)[2:9], b3])
2330 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2331 self.assertEqual(b1, bytearray(b"Mary"))
2332 self.assertEqual(b2, bytearray(b"01 had a 9"))
2333 self.assertEqual(b3, bytearray(b"little lamb---"))
2334 self.checkRecvmsgAddress(addr, self.cli_addr)
2335 self.assertEqual(ancdata, [])
2336 self.checkFlags(flags, eor=True)
2337
2338 def _testRecvmsgIntoScatter(self):
2339 self.sendToServer(b"Mary had a little lamb")
2340
2341
2342class CmsgMacroTests(unittest.TestCase):
2343 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2344 # assumptions used by sendmsg() and recvmsg[_into](), which share
2345 # code with these functions.
2346
2347 # Match the definition in socketmodule.c
2348 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2349
2350 @requireAttrs(socket, "CMSG_LEN")
2351 def testCMSG_LEN(self):
2352 # Test CMSG_LEN() with various valid and invalid values,
2353 # checking the assumptions used by recvmsg() and sendmsg().
2354 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2355 values = list(range(257)) + list(range(toobig - 257, toobig))
2356
2357 # struct cmsghdr has at least three members, two of which are ints
2358 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2359 for n in values:
2360 ret = socket.CMSG_LEN(n)
2361 # This is how recvmsg() calculates the data size
2362 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2363 self.assertLessEqual(ret, self.socklen_t_limit)
2364
2365 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2366 # sendmsg() shares code with these functions, and requires
2367 # that it reject values over the limit.
2368 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2369 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2370
2371 @requireAttrs(socket, "CMSG_SPACE")
2372 def testCMSG_SPACE(self):
2373 # Test CMSG_SPACE() with various valid and invalid values,
2374 # checking the assumptions used by sendmsg().
2375 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2376 values = list(range(257)) + list(range(toobig - 257, toobig))
2377
2378 last = socket.CMSG_SPACE(0)
2379 # struct cmsghdr has at least three members, two of which are ints
2380 self.assertGreater(last, array.array("i").itemsize * 2)
2381 for n in values:
2382 ret = socket.CMSG_SPACE(n)
2383 self.assertGreaterEqual(ret, last)
2384 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2385 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2386 self.assertLessEqual(ret, self.socklen_t_limit)
2387 last = ret
2388
2389 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2390 # sendmsg() shares code with these functions, and requires
2391 # that it reject values over the limit.
2392 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2393 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2394
2395
2396class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2397 # Tests for file descriptor passing on Unix-domain sockets.
2398
2399 # Invalid file descriptor value that's unlikely to evaluate to a
2400 # real FD even if one of its bytes is replaced with a different
2401 # value (which shouldn't actually happen).
2402 badfd = -0x5555
2403
2404 def newFDs(self, n):
2405 # Return a list of n file descriptors for newly-created files
2406 # containing their list indices as ASCII numbers.
2407 fds = []
2408 for i in range(n):
2409 fd, path = tempfile.mkstemp()
2410 self.addCleanup(os.unlink, path)
2411 self.addCleanup(os.close, fd)
2412 os.write(fd, str(i).encode())
2413 fds.append(fd)
2414 return fds
2415
2416 def checkFDs(self, fds):
2417 # Check that the file descriptors in the given list contain
2418 # their correct list indices as ASCII numbers.
2419 for n, fd in enumerate(fds):
2420 os.lseek(fd, 0, os.SEEK_SET)
2421 self.assertEqual(os.read(fd, 1024), str(n).encode())
2422
2423 def registerRecvmsgResult(self, result):
2424 self.addCleanup(self.closeRecvmsgFDs, result)
2425
2426 def closeRecvmsgFDs(self, recvmsg_result):
2427 # Close all file descriptors specified in the ancillary data
2428 # of the given return value from recvmsg() or recvmsg_into().
2429 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2430 if (cmsg_level == socket.SOL_SOCKET and
2431 cmsg_type == socket.SCM_RIGHTS):
2432 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002433 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002434 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2435 for fd in fds:
2436 os.close(fd)
2437
2438 def createAndSendFDs(self, n):
2439 # Send n new file descriptors created by newFDs() to the
2440 # server, with the constant MSG as the non-ancillary data.
2441 self.assertEqual(
2442 self.sendmsgToServer([MSG],
2443 [(socket.SOL_SOCKET,
2444 socket.SCM_RIGHTS,
2445 array.array("i", self.newFDs(n)))]),
2446 len(MSG))
2447
2448 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2449 # Check that constant MSG was received with numfds file
2450 # descriptors in a maximum of maxcmsgs control messages (which
2451 # must contain only complete integers). By default, check
2452 # that MSG_CTRUNC is unset, but ignore any flags in
2453 # ignoreflags.
2454 msg, ancdata, flags, addr = result
2455 self.assertEqual(msg, MSG)
2456 self.checkRecvmsgAddress(addr, self.cli_addr)
2457 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2458 ignore=ignoreflags)
2459
2460 self.assertIsInstance(ancdata, list)
2461 self.assertLessEqual(len(ancdata), maxcmsgs)
2462 fds = array.array("i")
2463 for item in ancdata:
2464 self.assertIsInstance(item, tuple)
2465 cmsg_level, cmsg_type, cmsg_data = item
2466 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2467 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2468 self.assertIsInstance(cmsg_data, bytes)
2469 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002470 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002471
2472 self.assertEqual(len(fds), numfds)
2473 self.checkFDs(fds)
2474
2475 def testFDPassSimple(self):
2476 # Pass a single FD (array read from bytes object).
2477 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2478 len(MSG), 10240))
2479
2480 def _testFDPassSimple(self):
2481 self.assertEqual(
2482 self.sendmsgToServer(
2483 [MSG],
2484 [(socket.SOL_SOCKET,
2485 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002486 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002487 len(MSG))
2488
2489 def testMultipleFDPass(self):
2490 # Pass multiple FDs in a single array.
2491 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2492 len(MSG), 10240))
2493
2494 def _testMultipleFDPass(self):
2495 self.createAndSendFDs(4)
2496
2497 @requireAttrs(socket, "CMSG_SPACE")
2498 def testFDPassCMSG_SPACE(self):
2499 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2500 self.checkRecvmsgFDs(
2501 4, self.doRecvmsg(self.serv_sock, len(MSG),
2502 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2503
2504 @testFDPassCMSG_SPACE.client_skip
2505 def _testFDPassCMSG_SPACE(self):
2506 self.createAndSendFDs(4)
2507
2508 def testFDPassCMSG_LEN(self):
2509 # Test using CMSG_LEN() to calculate ancillary buffer size.
2510 self.checkRecvmsgFDs(1,
2511 self.doRecvmsg(self.serv_sock, len(MSG),
2512 socket.CMSG_LEN(4 * SIZEOF_INT)),
2513 # RFC 3542 says implementations may set
2514 # MSG_CTRUNC if there isn't enough space
2515 # for trailing padding.
2516 ignoreflags=socket.MSG_CTRUNC)
2517
2518 def _testFDPassCMSG_LEN(self):
2519 self.createAndSendFDs(1)
2520
Nick Coghlan2496f332011-09-19 20:26:31 +10002521 # Issue #12958: The following test has problems on Mac OS X
2522 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002523 @requireAttrs(socket, "CMSG_SPACE")
2524 def testFDPassSeparate(self):
2525 # Pass two FDs in two separate arrays. Arrays may be combined
2526 # into a single control message by the OS.
2527 self.checkRecvmsgFDs(2,
2528 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2529 maxcmsgs=2)
2530
2531 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002532 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002533 def _testFDPassSeparate(self):
2534 fd0, fd1 = self.newFDs(2)
2535 self.assertEqual(
2536 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2537 socket.SCM_RIGHTS,
2538 array.array("i", [fd0])),
2539 (socket.SOL_SOCKET,
2540 socket.SCM_RIGHTS,
2541 array.array("i", [fd1]))]),
2542 len(MSG))
2543
Nick Coghlan2496f332011-09-19 20:26:31 +10002544 # Issue #12958: The following test has problems on Mac OS X
2545 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002546 @requireAttrs(socket, "CMSG_SPACE")
2547 def testFDPassSeparateMinSpace(self):
2548 # Pass two FDs in two separate arrays, receiving them into the
2549 # minimum space for two arrays.
2550 self.checkRecvmsgFDs(2,
2551 self.doRecvmsg(self.serv_sock, len(MSG),
2552 socket.CMSG_SPACE(SIZEOF_INT) +
2553 socket.CMSG_LEN(SIZEOF_INT)),
2554 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2555
2556 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002557 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002558 def _testFDPassSeparateMinSpace(self):
2559 fd0, fd1 = self.newFDs(2)
2560 self.assertEqual(
2561 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2562 socket.SCM_RIGHTS,
2563 array.array("i", [fd0])),
2564 (socket.SOL_SOCKET,
2565 socket.SCM_RIGHTS,
2566 array.array("i", [fd1]))]),
2567 len(MSG))
2568
2569 def sendAncillaryIfPossible(self, msg, ancdata):
2570 # Try to send msg and ancdata to server, but if the system
2571 # call fails, just send msg with no ancillary data.
2572 try:
2573 nbytes = self.sendmsgToServer([msg], ancdata)
2574 except socket.error as e:
2575 # Check that it was the system call that failed
2576 self.assertIsInstance(e.errno, int)
2577 nbytes = self.sendmsgToServer([msg])
2578 self.assertEqual(nbytes, len(msg))
2579
2580 def testFDPassEmpty(self):
2581 # Try to pass an empty FD array. Can receive either no array
2582 # or an empty array.
2583 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2584 len(MSG), 10240),
2585 ignoreflags=socket.MSG_CTRUNC)
2586
2587 def _testFDPassEmpty(self):
2588 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2589 socket.SCM_RIGHTS,
2590 b"")])
2591
2592 def testFDPassPartialInt(self):
2593 # Try to pass a truncated FD array.
2594 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2595 len(MSG), 10240)
2596 self.assertEqual(msg, MSG)
2597 self.checkRecvmsgAddress(addr, self.cli_addr)
2598 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2599 self.assertLessEqual(len(ancdata), 1)
2600 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2601 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2602 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2603 self.assertLess(len(cmsg_data), SIZEOF_INT)
2604
2605 def _testFDPassPartialInt(self):
2606 self.sendAncillaryIfPossible(
2607 MSG,
2608 [(socket.SOL_SOCKET,
2609 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002610 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002611
2612 @requireAttrs(socket, "CMSG_SPACE")
2613 def testFDPassPartialIntInMiddle(self):
2614 # Try to pass two FD arrays, the first of which is truncated.
2615 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2616 len(MSG), 10240)
2617 self.assertEqual(msg, MSG)
2618 self.checkRecvmsgAddress(addr, self.cli_addr)
2619 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2620 self.assertLessEqual(len(ancdata), 2)
2621 fds = array.array("i")
2622 # Arrays may have been combined in a single control message
2623 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2624 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2625 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002626 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002627 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2628 self.assertLessEqual(len(fds), 2)
2629 self.checkFDs(fds)
2630
2631 @testFDPassPartialIntInMiddle.client_skip
2632 def _testFDPassPartialIntInMiddle(self):
2633 fd0, fd1 = self.newFDs(2)
2634 self.sendAncillaryIfPossible(
2635 MSG,
2636 [(socket.SOL_SOCKET,
2637 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002638 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002639 (socket.SOL_SOCKET,
2640 socket.SCM_RIGHTS,
2641 array.array("i", [fd1]))])
2642
2643 def checkTruncatedHeader(self, result, ignoreflags=0):
2644 # Check that no ancillary data items are returned when data is
2645 # truncated inside the cmsghdr structure.
2646 msg, ancdata, flags, addr = result
2647 self.assertEqual(msg, MSG)
2648 self.checkRecvmsgAddress(addr, self.cli_addr)
2649 self.assertEqual(ancdata, [])
2650 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2651 ignore=ignoreflags)
2652
2653 def testCmsgTruncNoBufSize(self):
2654 # Check that no ancillary data is received when no buffer size
2655 # is specified.
2656 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2657 # BSD seems to set MSG_CTRUNC only
2658 # if an item has been partially
2659 # received.
2660 ignoreflags=socket.MSG_CTRUNC)
2661
2662 def _testCmsgTruncNoBufSize(self):
2663 self.createAndSendFDs(1)
2664
2665 def testCmsgTrunc0(self):
2666 # Check that no ancillary data is received when buffer size is 0.
2667 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2668 ignoreflags=socket.MSG_CTRUNC)
2669
2670 def _testCmsgTrunc0(self):
2671 self.createAndSendFDs(1)
2672
2673 # Check that no ancillary data is returned for various non-zero
2674 # (but still too small) buffer sizes.
2675
2676 def testCmsgTrunc1(self):
2677 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2678
2679 def _testCmsgTrunc1(self):
2680 self.createAndSendFDs(1)
2681
2682 def testCmsgTrunc2Int(self):
2683 # The cmsghdr structure has at least three members, two of
2684 # which are ints, so we still shouldn't see any ancillary
2685 # data.
2686 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2687 SIZEOF_INT * 2))
2688
2689 def _testCmsgTrunc2Int(self):
2690 self.createAndSendFDs(1)
2691
2692 def testCmsgTruncLen0Minus1(self):
2693 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2694 socket.CMSG_LEN(0) - 1))
2695
2696 def _testCmsgTruncLen0Minus1(self):
2697 self.createAndSendFDs(1)
2698
2699 # The following tests try to truncate the control message in the
2700 # middle of the FD array.
2701
2702 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2703 # Check that file descriptor data is truncated to between
2704 # mindata and maxdata bytes when received with buffer size
2705 # ancbuf, and that any complete file descriptor numbers are
2706 # valid.
2707 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2708 len(MSG), ancbuf)
2709 self.assertEqual(msg, MSG)
2710 self.checkRecvmsgAddress(addr, self.cli_addr)
2711 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2712
2713 if mindata == 0 and ancdata == []:
2714 return
2715 self.assertEqual(len(ancdata), 1)
2716 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2717 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2718 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2719 self.assertGreaterEqual(len(cmsg_data), mindata)
2720 self.assertLessEqual(len(cmsg_data), maxdata)
2721 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002722 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002723 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2724 self.checkFDs(fds)
2725
2726 def testCmsgTruncLen0(self):
2727 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2728
2729 def _testCmsgTruncLen0(self):
2730 self.createAndSendFDs(1)
2731
2732 def testCmsgTruncLen0Plus1(self):
2733 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2734
2735 def _testCmsgTruncLen0Plus1(self):
2736 self.createAndSendFDs(2)
2737
2738 def testCmsgTruncLen1(self):
2739 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2740 maxdata=SIZEOF_INT)
2741
2742 def _testCmsgTruncLen1(self):
2743 self.createAndSendFDs(2)
2744
2745 def testCmsgTruncLen2Minus1(self):
2746 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2747 maxdata=(2 * SIZEOF_INT) - 1)
2748
2749 def _testCmsgTruncLen2Minus1(self):
2750 self.createAndSendFDs(2)
2751
2752
2753class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2754 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2755 # features of the RFC 3542 Advanced Sockets API for IPv6.
2756 # Currently we can only handle certain data items (e.g. traffic
2757 # class, hop limit, MTU discovery and fragmentation settings)
2758 # without resorting to unportable means such as the struct module,
2759 # but the tests here are aimed at testing the ancillary data
2760 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2761 # itself.
2762
2763 # Test value to use when setting hop limit of packet
2764 hop_limit = 2
2765
2766 # Test value to use when setting traffic class of packet.
2767 # -1 means "use kernel default".
2768 traffic_class = -1
2769
2770 def ancillaryMapping(self, ancdata):
2771 # Given ancillary data list ancdata, return a mapping from
2772 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2773 # Check that no (level, type) pair appears more than once.
2774 d = {}
2775 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2776 self.assertNotIn((cmsg_level, cmsg_type), d)
2777 d[(cmsg_level, cmsg_type)] = cmsg_data
2778 return d
2779
2780 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2781 # Receive hop limit into ancbufsize bytes of ancillary data
2782 # space. Check that data is MSG, ancillary data is not
2783 # truncated (but ignore any flags in ignoreflags), and hop
2784 # limit is between 0 and maxhop inclusive.
2785 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2786 socket.IPV6_RECVHOPLIMIT, 1)
2787 self.misc_event.set()
2788 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2789 len(MSG), ancbufsize)
2790
2791 self.assertEqual(msg, MSG)
2792 self.checkRecvmsgAddress(addr, self.cli_addr)
2793 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2794 ignore=ignoreflags)
2795
2796 self.assertEqual(len(ancdata), 1)
2797 self.assertIsInstance(ancdata[0], tuple)
2798 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2799 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2800 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2801 self.assertIsInstance(cmsg_data, bytes)
2802 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2803 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002804 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002805 self.assertGreaterEqual(a[0], 0)
2806 self.assertLessEqual(a[0], maxhop)
2807
2808 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2809 def testRecvHopLimit(self):
2810 # Test receiving the packet hop limit as ancillary data.
2811 self.checkHopLimit(ancbufsize=10240)
2812
2813 @testRecvHopLimit.client_skip
2814 def _testRecvHopLimit(self):
2815 # Need to wait until server has asked to receive ancillary
2816 # data, as implementations are not required to buffer it
2817 # otherwise.
2818 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2819 self.sendToServer(MSG)
2820
2821 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2822 def testRecvHopLimitCMSG_SPACE(self):
2823 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2824 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2825
2826 @testRecvHopLimitCMSG_SPACE.client_skip
2827 def _testRecvHopLimitCMSG_SPACE(self):
2828 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2829 self.sendToServer(MSG)
2830
2831 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2832 # 3542 says portable applications must provide space for trailing
2833 # padding. Implementations may set MSG_CTRUNC if there isn't
2834 # enough space for the padding.
2835
2836 @requireAttrs(socket.socket, "sendmsg")
2837 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2838 def testSetHopLimit(self):
2839 # Test setting hop limit on outgoing packet and receiving it
2840 # at the other end.
2841 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2842
2843 @testSetHopLimit.client_skip
2844 def _testSetHopLimit(self):
2845 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2846 self.assertEqual(
2847 self.sendmsgToServer([MSG],
2848 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2849 array.array("i", [self.hop_limit]))]),
2850 len(MSG))
2851
2852 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2853 ignoreflags=0):
2854 # Receive traffic class and hop limit into ancbufsize bytes of
2855 # ancillary data space. Check that data is MSG, ancillary
2856 # data is not truncated (but ignore any flags in ignoreflags),
2857 # and traffic class and hop limit are in range (hop limit no
2858 # more than maxhop).
2859 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2860 socket.IPV6_RECVHOPLIMIT, 1)
2861 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2862 socket.IPV6_RECVTCLASS, 1)
2863 self.misc_event.set()
2864 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2865 len(MSG), ancbufsize)
2866
2867 self.assertEqual(msg, MSG)
2868 self.checkRecvmsgAddress(addr, self.cli_addr)
2869 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2870 ignore=ignoreflags)
2871 self.assertEqual(len(ancdata), 2)
2872 ancmap = self.ancillaryMapping(ancdata)
2873
2874 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2875 self.assertEqual(len(tcdata), SIZEOF_INT)
2876 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002877 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002878 self.assertGreaterEqual(a[0], 0)
2879 self.assertLessEqual(a[0], 255)
2880
2881 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2882 self.assertEqual(len(hldata), SIZEOF_INT)
2883 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002884 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002885 self.assertGreaterEqual(a[0], 0)
2886 self.assertLessEqual(a[0], maxhop)
2887
2888 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2889 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2890 def testRecvTrafficClassAndHopLimit(self):
2891 # Test receiving traffic class and hop limit as ancillary data.
2892 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2893
2894 @testRecvTrafficClassAndHopLimit.client_skip
2895 def _testRecvTrafficClassAndHopLimit(self):
2896 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2897 self.sendToServer(MSG)
2898
2899 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2900 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2901 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2902 # Test receiving traffic class and hop limit, using
2903 # CMSG_SPACE() to calculate buffer size.
2904 self.checkTrafficClassAndHopLimit(
2905 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2906
2907 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2908 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2909 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2910 self.sendToServer(MSG)
2911
2912 @requireAttrs(socket.socket, "sendmsg")
2913 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2914 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2915 def testSetTrafficClassAndHopLimit(self):
2916 # Test setting traffic class and hop limit on outgoing packet,
2917 # and receiving them at the other end.
2918 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2919 maxhop=self.hop_limit)
2920
2921 @testSetTrafficClassAndHopLimit.client_skip
2922 def _testSetTrafficClassAndHopLimit(self):
2923 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2924 self.assertEqual(
2925 self.sendmsgToServer([MSG],
2926 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2927 array.array("i", [self.traffic_class])),
2928 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2929 array.array("i", [self.hop_limit]))]),
2930 len(MSG))
2931
2932 @requireAttrs(socket.socket, "sendmsg")
2933 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2934 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2935 def testOddCmsgSize(self):
2936 # Try to send ancillary data with first item one byte too
2937 # long. Fall back to sending with correct size if this fails,
2938 # and check that second item was handled correctly.
2939 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2940 maxhop=self.hop_limit)
2941
2942 @testOddCmsgSize.client_skip
2943 def _testOddCmsgSize(self):
2944 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2945 try:
2946 nbytes = self.sendmsgToServer(
2947 [MSG],
2948 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002949 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002950 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2951 array.array("i", [self.hop_limit]))])
2952 except socket.error as e:
2953 self.assertIsInstance(e.errno, int)
2954 nbytes = self.sendmsgToServer(
2955 [MSG],
2956 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2957 array.array("i", [self.traffic_class])),
2958 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2959 array.array("i", [self.hop_limit]))])
2960 self.assertEqual(nbytes, len(MSG))
2961
2962 # Tests for proper handling of truncated ancillary data
2963
2964 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2965 # Receive hop limit into ancbufsize bytes of ancillary data
2966 # space, which should be too small to contain the ancillary
2967 # data header (if ancbufsize is None, pass no second argument
2968 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2969 # (unless included in ignoreflags), and no ancillary data is
2970 # returned.
2971 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2972 socket.IPV6_RECVHOPLIMIT, 1)
2973 self.misc_event.set()
2974 args = () if ancbufsize is None else (ancbufsize,)
2975 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2976 len(MSG), *args)
2977
2978 self.assertEqual(msg, MSG)
2979 self.checkRecvmsgAddress(addr, self.cli_addr)
2980 self.assertEqual(ancdata, [])
2981 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2982 ignore=ignoreflags)
2983
2984 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2985 def testCmsgTruncNoBufSize(self):
2986 # Check that no ancillary data is received when no ancillary
2987 # buffer size is provided.
2988 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2989 # BSD seems to set
2990 # MSG_CTRUNC only if an item
2991 # has been partially
2992 # received.
2993 ignoreflags=socket.MSG_CTRUNC)
2994
2995 @testCmsgTruncNoBufSize.client_skip
2996 def _testCmsgTruncNoBufSize(self):
2997 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2998 self.sendToServer(MSG)
2999
3000 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3001 def testSingleCmsgTrunc0(self):
3002 # Check that no ancillary data is received when ancillary
3003 # buffer size is zero.
3004 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3005 ignoreflags=socket.MSG_CTRUNC)
3006
3007 @testSingleCmsgTrunc0.client_skip
3008 def _testSingleCmsgTrunc0(self):
3009 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3010 self.sendToServer(MSG)
3011
3012 # Check that no ancillary data is returned for various non-zero
3013 # (but still too small) buffer sizes.
3014
3015 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3016 def testSingleCmsgTrunc1(self):
3017 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3018
3019 @testSingleCmsgTrunc1.client_skip
3020 def _testSingleCmsgTrunc1(self):
3021 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3022 self.sendToServer(MSG)
3023
3024 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3025 def testSingleCmsgTrunc2Int(self):
3026 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3027
3028 @testSingleCmsgTrunc2Int.client_skip
3029 def _testSingleCmsgTrunc2Int(self):
3030 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3031 self.sendToServer(MSG)
3032
3033 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3034 def testSingleCmsgTruncLen0Minus1(self):
3035 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3036
3037 @testSingleCmsgTruncLen0Minus1.client_skip
3038 def _testSingleCmsgTruncLen0Minus1(self):
3039 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3040 self.sendToServer(MSG)
3041
3042 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3043 def testSingleCmsgTruncInData(self):
3044 # Test truncation of a control message inside its associated
3045 # data. The message may be returned with its data truncated,
3046 # or not returned at all.
3047 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3048 socket.IPV6_RECVHOPLIMIT, 1)
3049 self.misc_event.set()
3050 msg, ancdata, flags, addr = self.doRecvmsg(
3051 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3052
3053 self.assertEqual(msg, MSG)
3054 self.checkRecvmsgAddress(addr, self.cli_addr)
3055 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3056
3057 self.assertLessEqual(len(ancdata), 1)
3058 if ancdata:
3059 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3060 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3061 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3062 self.assertLess(len(cmsg_data), SIZEOF_INT)
3063
3064 @testSingleCmsgTruncInData.client_skip
3065 def _testSingleCmsgTruncInData(self):
3066 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3067 self.sendToServer(MSG)
3068
3069 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3070 # Receive traffic class and hop limit into ancbufsize bytes of
3071 # ancillary data space, which should be large enough to
3072 # contain the first item, but too small to contain the header
3073 # of the second. Check that data is MSG, MSG_CTRUNC is set
3074 # (unless included in ignoreflags), and only one ancillary
3075 # data item is returned.
3076 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3077 socket.IPV6_RECVHOPLIMIT, 1)
3078 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3079 socket.IPV6_RECVTCLASS, 1)
3080 self.misc_event.set()
3081 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3082 len(MSG), ancbufsize)
3083
3084 self.assertEqual(msg, MSG)
3085 self.checkRecvmsgAddress(addr, self.cli_addr)
3086 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3087 ignore=ignoreflags)
3088
3089 self.assertEqual(len(ancdata), 1)
3090 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3091 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3092 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3093 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3094 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003095 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003096 self.assertGreaterEqual(a[0], 0)
3097 self.assertLessEqual(a[0], 255)
3098
3099 # Try the above test with various buffer sizes.
3100
3101 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3102 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3103 def testSecondCmsgTrunc0(self):
3104 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3105 ignoreflags=socket.MSG_CTRUNC)
3106
3107 @testSecondCmsgTrunc0.client_skip
3108 def _testSecondCmsgTrunc0(self):
3109 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3110 self.sendToServer(MSG)
3111
3112 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3113 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3114 def testSecondCmsgTrunc1(self):
3115 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3116
3117 @testSecondCmsgTrunc1.client_skip
3118 def _testSecondCmsgTrunc1(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 testSecondCmsgTrunc2Int(self):
3125 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3126 2 * SIZEOF_INT)
3127
3128 @testSecondCmsgTrunc2Int.client_skip
3129 def _testSecondCmsgTrunc2Int(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 testSecondCmsgTruncLen0Minus1(self):
3136 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3137 socket.CMSG_LEN(0) - 1)
3138
3139 @testSecondCmsgTruncLen0Minus1.client_skip
3140 def _testSecondCmsgTruncLen0Minus1(self):
3141 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3142 self.sendToServer(MSG)
3143
3144 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3145 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3146 def testSecomdCmsgTruncInData(self):
3147 # Test truncation of the second of two control messages inside
3148 # its associated data.
3149 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3150 socket.IPV6_RECVHOPLIMIT, 1)
3151 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3152 socket.IPV6_RECVTCLASS, 1)
3153 self.misc_event.set()
3154 msg, ancdata, flags, addr = self.doRecvmsg(
3155 self.serv_sock, len(MSG),
3156 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3157
3158 self.assertEqual(msg, MSG)
3159 self.checkRecvmsgAddress(addr, self.cli_addr)
3160 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3161
3162 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3163
3164 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3165 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3166 cmsg_types.remove(cmsg_type)
3167 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3168 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003169 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003170 self.assertGreaterEqual(a[0], 0)
3171 self.assertLessEqual(a[0], 255)
3172
3173 if ancdata:
3174 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3175 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3176 cmsg_types.remove(cmsg_type)
3177 self.assertLess(len(cmsg_data), SIZEOF_INT)
3178
3179 self.assertEqual(ancdata, [])
3180
3181 @testSecomdCmsgTruncInData.client_skip
3182 def _testSecomdCmsgTruncInData(self):
3183 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3184 self.sendToServer(MSG)
3185
3186
3187# Derive concrete test classes for different socket types.
3188
3189class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3190 SendrecvmsgConnectionlessBase,
3191 ThreadedSocketTestMixin, UDPTestBase):
3192 pass
3193
3194@requireAttrs(socket.socket, "sendmsg")
3195@unittest.skipUnless(thread, 'Threading required for this test.')
3196class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3197 pass
3198
3199@requireAttrs(socket.socket, "recvmsg")
3200@unittest.skipUnless(thread, 'Threading required for this test.')
3201class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3202 pass
3203
3204@requireAttrs(socket.socket, "recvmsg_into")
3205@unittest.skipUnless(thread, 'Threading required for this test.')
3206class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3207 pass
3208
3209
3210class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3211 SendrecvmsgConnectionlessBase,
3212 ThreadedSocketTestMixin, UDP6TestBase):
3213 pass
3214
3215@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003216@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003217@requireSocket("AF_INET6", "SOCK_DGRAM")
3218@unittest.skipUnless(thread, 'Threading required for this test.')
3219class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3220 pass
3221
3222@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003223@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003224@requireSocket("AF_INET6", "SOCK_DGRAM")
3225@unittest.skipUnless(thread, 'Threading required for this test.')
3226class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3227 pass
3228
3229@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003230@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003231@requireSocket("AF_INET6", "SOCK_DGRAM")
3232@unittest.skipUnless(thread, 'Threading required for this test.')
3233class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3234 pass
3235
3236@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003237@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003238@requireAttrs(socket, "IPPROTO_IPV6")
3239@requireSocket("AF_INET6", "SOCK_DGRAM")
3240@unittest.skipUnless(thread, 'Threading required for this test.')
3241class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3242 SendrecvmsgUDP6TestBase):
3243 pass
3244
3245@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003246@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003247@requireAttrs(socket, "IPPROTO_IPV6")
3248@requireSocket("AF_INET6", "SOCK_DGRAM")
3249@unittest.skipUnless(thread, 'Threading required for this test.')
3250class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3251 RFC3542AncillaryTest,
3252 SendrecvmsgUDP6TestBase):
3253 pass
3254
3255
3256class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3257 ConnectedStreamTestMixin, TCPTestBase):
3258 pass
3259
3260@requireAttrs(socket.socket, "sendmsg")
3261@unittest.skipUnless(thread, 'Threading required for this test.')
3262class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3263 pass
3264
3265@requireAttrs(socket.socket, "recvmsg")
3266@unittest.skipUnless(thread, 'Threading required for this test.')
3267class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3268 SendrecvmsgTCPTestBase):
3269 pass
3270
3271@requireAttrs(socket.socket, "recvmsg_into")
3272@unittest.skipUnless(thread, 'Threading required for this test.')
3273class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3274 SendrecvmsgTCPTestBase):
3275 pass
3276
3277
3278class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3279 SendrecvmsgConnectedBase,
3280 ConnectedStreamTestMixin, SCTPStreamBase):
3281 pass
3282
3283@requireAttrs(socket.socket, "sendmsg")
3284@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3285@unittest.skipUnless(thread, 'Threading required for this test.')
3286class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3287 pass
3288
3289@requireAttrs(socket.socket, "recvmsg")
3290@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3291@unittest.skipUnless(thread, 'Threading required for this test.')
3292class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3293 SendrecvmsgSCTPStreamTestBase):
3294 pass
3295
3296@requireAttrs(socket.socket, "recvmsg_into")
3297@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3298@unittest.skipUnless(thread, 'Threading required for this test.')
3299class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3300 SendrecvmsgSCTPStreamTestBase):
3301 pass
3302
3303
3304class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3305 ConnectedStreamTestMixin, UnixStreamBase):
3306 pass
3307
3308@requireAttrs(socket.socket, "sendmsg")
3309@requireAttrs(socket, "AF_UNIX")
3310@unittest.skipUnless(thread, 'Threading required for this test.')
3311class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3312 pass
3313
3314@requireAttrs(socket.socket, "recvmsg")
3315@requireAttrs(socket, "AF_UNIX")
3316@unittest.skipUnless(thread, 'Threading required for this test.')
3317class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3318 SendrecvmsgUnixStreamTestBase):
3319 pass
3320
3321@requireAttrs(socket.socket, "recvmsg_into")
3322@requireAttrs(socket, "AF_UNIX")
3323@unittest.skipUnless(thread, 'Threading required for this test.')
3324class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3325 SendrecvmsgUnixStreamTestBase):
3326 pass
3327
3328@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3329@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3330@unittest.skipUnless(thread, 'Threading required for this test.')
3331class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3332 pass
3333
3334@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3335@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3336@unittest.skipUnless(thread, 'Threading required for this test.')
3337class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3338 SendrecvmsgUnixStreamTestBase):
3339 pass
3340
3341
3342# Test interrupting the interruptible send/receive methods with a
3343# signal when a timeout is set. These tests avoid having multiple
3344# threads alive during the test so that the OS cannot deliver the
3345# signal to the wrong one.
3346
3347class InterruptedTimeoutBase(unittest.TestCase):
3348 # Base class for interrupted send/receive tests. Installs an
3349 # empty handler for SIGALRM and removes it on teardown, along with
3350 # any scheduled alarms.
3351
3352 def setUp(self):
3353 super().setUp()
3354 orig_alrm_handler = signal.signal(signal.SIGALRM,
3355 lambda signum, frame: None)
3356 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3357 self.addCleanup(self.setAlarm, 0)
3358
3359 # Timeout for socket operations
3360 timeout = 4.0
3361
3362 # Provide setAlarm() method to schedule delivery of SIGALRM after
3363 # given number of seconds, or cancel it if zero, and an
3364 # appropriate time value to use. Use setitimer() if available.
3365 if hasattr(signal, "setitimer"):
3366 alarm_time = 0.05
3367
3368 def setAlarm(self, seconds):
3369 signal.setitimer(signal.ITIMER_REAL, seconds)
3370 else:
3371 # Old systems may deliver the alarm up to one second early
3372 alarm_time = 2
3373
3374 def setAlarm(self, seconds):
3375 signal.alarm(seconds)
3376
3377
3378# Require siginterrupt() in order to ensure that system calls are
3379# interrupted by default.
3380@requireAttrs(signal, "siginterrupt")
3381@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3382 "Don't have signal.alarm or signal.setitimer")
3383class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3384 # Test interrupting the recv*() methods with signals when a
3385 # timeout is set.
3386
3387 def setUp(self):
3388 super().setUp()
3389 self.serv.settimeout(self.timeout)
3390
3391 def checkInterruptedRecv(self, func, *args, **kwargs):
3392 # Check that func(*args, **kwargs) raises socket.error with an
3393 # errno of EINTR when interrupted by a signal.
3394 self.setAlarm(self.alarm_time)
3395 with self.assertRaises(socket.error) as cm:
3396 func(*args, **kwargs)
3397 self.assertNotIsInstance(cm.exception, socket.timeout)
3398 self.assertEqual(cm.exception.errno, errno.EINTR)
3399
3400 def testInterruptedRecvTimeout(self):
3401 self.checkInterruptedRecv(self.serv.recv, 1024)
3402
3403 def testInterruptedRecvIntoTimeout(self):
3404 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3405
3406 def testInterruptedRecvfromTimeout(self):
3407 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3408
3409 def testInterruptedRecvfromIntoTimeout(self):
3410 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3411
3412 @requireAttrs(socket.socket, "recvmsg")
3413 def testInterruptedRecvmsgTimeout(self):
3414 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3415
3416 @requireAttrs(socket.socket, "recvmsg_into")
3417 def testInterruptedRecvmsgIntoTimeout(self):
3418 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3419
3420
3421# Require siginterrupt() in order to ensure that system calls are
3422# interrupted by default.
3423@requireAttrs(signal, "siginterrupt")
3424@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3425 "Don't have signal.alarm or signal.setitimer")
3426@unittest.skipUnless(thread, 'Threading required for this test.')
3427class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3428 ThreadSafeCleanupTestCase,
3429 SocketListeningTestMixin, TCPTestBase):
3430 # Test interrupting the interruptible send*() methods with signals
3431 # when a timeout is set.
3432
3433 def setUp(self):
3434 super().setUp()
3435 self.serv_conn = self.newSocket()
3436 self.addCleanup(self.serv_conn.close)
3437 # Use a thread to complete the connection, but wait for it to
3438 # terminate before running the test, so that there is only one
3439 # thread to accept the signal.
3440 cli_thread = threading.Thread(target=self.doConnect)
3441 cli_thread.start()
3442 self.cli_conn, addr = self.serv.accept()
3443 self.addCleanup(self.cli_conn.close)
3444 cli_thread.join()
3445 self.serv_conn.settimeout(self.timeout)
3446
3447 def doConnect(self):
3448 self.serv_conn.connect(self.serv_addr)
3449
3450 def checkInterruptedSend(self, func, *args, **kwargs):
3451 # Check that func(*args, **kwargs), run in a loop, raises
3452 # socket.error with an errno of EINTR when interrupted by a
3453 # signal.
3454 with self.assertRaises(socket.error) as cm:
3455 while True:
3456 self.setAlarm(self.alarm_time)
3457 func(*args, **kwargs)
3458 self.assertNotIsInstance(cm.exception, socket.timeout)
3459 self.assertEqual(cm.exception.errno, errno.EINTR)
3460
Nick Coghlan2496f332011-09-19 20:26:31 +10003461 # Issue #12958: The following tests have problems on Mac OS X
3462 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003463 def testInterruptedSendTimeout(self):
3464 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3465
Nick Coghlan2496f332011-09-19 20:26:31 +10003466 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003467 def testInterruptedSendtoTimeout(self):
3468 # Passing an actual address here as Python's wrapper for
3469 # sendto() doesn't allow passing a zero-length one; POSIX
3470 # requires that the address is ignored since the socket is
3471 # connection-mode, however.
3472 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3473 self.serv_addr)
3474
Nick Coghlan2496f332011-09-19 20:26:31 +10003475 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003476 @requireAttrs(socket.socket, "sendmsg")
3477 def testInterruptedSendmsgTimeout(self):
3478 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3479
3480
Victor Stinner45df8202010-04-28 22:31:17 +00003481@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003482class TCPCloserTest(ThreadedTCPSocketTest):
3483
3484 def testClose(self):
3485 conn, addr = self.serv.accept()
3486 conn.close()
3487
3488 sd = self.cli
3489 read, write, err = select.select([sd], [], [], 1.0)
3490 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003491 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003492
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003493 # Calling close() many times should be safe.
3494 conn.close()
3495 conn.close()
3496
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003497 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003498 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003499 time.sleep(1.0)
3500
Victor Stinner45df8202010-04-28 22:31:17 +00003501@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003502class BasicSocketPairTest(SocketPairTest):
3503
3504 def __init__(self, methodName='runTest'):
3505 SocketPairTest.__init__(self, methodName=methodName)
3506
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003507 def _check_defaults(self, sock):
3508 self.assertIsInstance(sock, socket.socket)
3509 if hasattr(socket, 'AF_UNIX'):
3510 self.assertEqual(sock.family, socket.AF_UNIX)
3511 else:
3512 self.assertEqual(sock.family, socket.AF_INET)
3513 self.assertEqual(sock.type, socket.SOCK_STREAM)
3514 self.assertEqual(sock.proto, 0)
3515
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003516 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003517 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003518
3519 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003520 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003521
Dave Cole331708b2004-08-09 04:51:41 +00003522 def testRecv(self):
3523 msg = self.serv.recv(1024)
3524 self.assertEqual(msg, MSG)
3525
3526 def _testRecv(self):
3527 self.cli.send(MSG)
3528
3529 def testSend(self):
3530 self.serv.send(MSG)
3531
3532 def _testSend(self):
3533 msg = self.cli.recv(1024)
3534 self.assertEqual(msg, MSG)
3535
Victor Stinner45df8202010-04-28 22:31:17 +00003536@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003537class NonBlockingTCPTests(ThreadedTCPSocketTest):
3538
3539 def __init__(self, methodName='runTest'):
3540 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3541
3542 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003543 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003544 self.serv.setblocking(0)
3545 start = time.time()
3546 try:
3547 self.serv.accept()
3548 except socket.error:
3549 pass
3550 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003551 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003552
3553 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003554 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003555
Antoine Pitroub1c54962010-10-14 15:05:38 +00003556 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003557 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003558 def testInitNonBlocking(self):
3559 # reinit server socket
3560 self.serv.close()
3561 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003562 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003563 self.port = support.bind_port(self.serv)
3564 self.serv.listen(1)
3565 # actual testing
3566 start = time.time()
3567 try:
3568 self.serv.accept()
3569 except socket.error:
3570 pass
3571 end = time.time()
3572 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3573
3574 def _testInitNonBlocking(self):
3575 pass
3576
Antoine Pitrou600232b2011-01-05 21:03:42 +00003577 def testInheritFlags(self):
3578 # Issue #7995: when calling accept() on a listening socket with a
3579 # timeout, the resulting socket should not be non-blocking.
3580 self.serv.settimeout(10)
3581 try:
3582 conn, addr = self.serv.accept()
3583 message = conn.recv(len(MSG))
3584 finally:
3585 conn.close()
3586 self.serv.settimeout(None)
3587
3588 def _testInheritFlags(self):
3589 time.sleep(0.1)
3590 self.cli.connect((HOST, self.port))
3591 time.sleep(0.5)
3592 self.cli.send(MSG)
3593
Guido van Rossum24e4af82002-06-12 19:18:08 +00003594 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003595 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003596 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003597 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003598 conn, addr = self.serv.accept()
3599 except socket.error:
3600 pass
3601 else:
3602 self.fail("Error trying to do non-blocking accept.")
3603 read, write, err = select.select([self.serv], [], [])
3604 if self.serv in read:
3605 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003606 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003607 else:
3608 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003609
Guido van Rossum24e4af82002-06-12 19:18:08 +00003610 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003611 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003612 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003613
3614 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003615 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003616 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003617 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003618
3619 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003620 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003621 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003622
3623 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003624 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003625 conn, addr = self.serv.accept()
3626 conn.setblocking(0)
3627 try:
3628 msg = conn.recv(len(MSG))
3629 except socket.error:
3630 pass
3631 else:
3632 self.fail("Error trying to do non-blocking recv.")
3633 read, write, err = select.select([conn], [], [])
3634 if conn in read:
3635 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003636 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003637 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003638 else:
3639 self.fail("Error during select call to non-blocking socket.")
3640
3641 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003642 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003643 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003644 self.cli.send(MSG)
3645
Victor Stinner45df8202010-04-28 22:31:17 +00003646@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003647class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003648 """Unit tests for the object returned by socket.makefile()
3649
Antoine Pitrou834bd812010-10-13 16:17:14 +00003650 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003651 the client connection. You can read from this file to
3652 get output from the server.
3653
Antoine Pitrou834bd812010-10-13 16:17:14 +00003654 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003655 server connection. You can write to this file to send output
3656 to the client.
3657 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003658
Guido van Rossume9f66142002-08-07 15:46:19 +00003659 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003660 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003661 errors = 'strict'
3662 newline = None
3663
3664 read_mode = 'rb'
3665 read_msg = MSG
3666 write_mode = 'wb'
3667 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003668
Guido van Rossum24e4af82002-06-12 19:18:08 +00003669 def __init__(self, methodName='runTest'):
3670 SocketConnectedTest.__init__(self, methodName=methodName)
3671
3672 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003673 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3674 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003675 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003676 self.read_file = self.cli_conn.makefile(
3677 self.read_mode, self.bufsize,
3678 encoding = self.encoding,
3679 errors = self.errors,
3680 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003681
3682 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003683 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003684 self.read_file.close()
3685 self.assertTrue(self.read_file.closed)
3686 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003687 SocketConnectedTest.tearDown(self)
3688
3689 def clientSetUp(self):
3690 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003691 self.write_file = self.serv_conn.makefile(
3692 self.write_mode, self.bufsize,
3693 encoding = self.encoding,
3694 errors = self.errors,
3695 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003696
3697 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003698 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003699 self.write_file.close()
3700 self.assertTrue(self.write_file.closed)
3701 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003702 SocketConnectedTest.clientTearDown(self)
3703
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003704 def testReadAfterTimeout(self):
3705 # Issue #7322: A file object must disallow further reads
3706 # after a timeout has occurred.
3707 self.cli_conn.settimeout(1)
3708 self.read_file.read(3)
3709 # First read raises a timeout
3710 self.assertRaises(socket.timeout, self.read_file.read, 1)
3711 # Second read is disallowed
3712 with self.assertRaises(IOError) as ctx:
3713 self.read_file.read(1)
3714 self.assertIn("cannot read from timed out object", str(ctx.exception))
3715
3716 def _testReadAfterTimeout(self):
3717 self.write_file.write(self.write_msg[0:3])
3718 self.write_file.flush()
3719 self.serv_finished.wait()
3720
Guido van Rossum24e4af82002-06-12 19:18:08 +00003721 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003722 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003723 first_seg = self.read_file.read(len(self.read_msg)-3)
3724 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003725 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003726 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003727
3728 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003729 self.write_file.write(self.write_msg)
3730 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003731
Guido van Rossum8c943832002-08-08 01:00:28 +00003732 def testFullRead(self):
3733 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003734 msg = self.read_file.read()
3735 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003736
3737 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003738 self.write_file.write(self.write_msg)
3739 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003740
Guido van Rossum24e4af82002-06-12 19:18:08 +00003741 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003742 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003743 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003744 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003745 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003746 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003747 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003748 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003749 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003750
3751 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003752 self.write_file.write(self.write_msg)
3753 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003754
3755 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003756 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003757 line = self.read_file.readline()
3758 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003759
3760 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003761 self.write_file.write(self.write_msg)
3762 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003763
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003764 def testCloseAfterMakefile(self):
3765 # The file returned by makefile should keep the socket open.
3766 self.cli_conn.close()
3767 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003768 msg = self.read_file.read()
3769 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003770
3771 def _testCloseAfterMakefile(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
3775 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003776 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003777 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003778 if isinstance(self.read_msg, str):
3779 msg = msg.decode()
3780 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003781
3782 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003783 self.write_file.write(self.write_msg)
3784 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003785
Tim Peters116d83c2004-03-28 02:20:45 +00003786 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003787 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003788
3789 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003790 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003791
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003792 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003793 self.assertEqual(self.read_file.mode, self.read_mode)
3794 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003795
3796 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003797 self.assertEqual(self.write_file.mode, self.write_mode)
3798 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003799
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003800 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003801 self.read_file.close()
3802 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003803 self.cli_conn.close()
3804 self.assertRaises(socket.error, self.cli_conn.getsockname)
3805
3806 def _testRealClose(self):
3807 pass
3808
3809
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003810class FileObjectInterruptedTestCase(unittest.TestCase):
3811 """Test that the file object correctly handles EINTR internally."""
3812
3813 class MockSocket(object):
3814 def __init__(self, recv_funcs=()):
3815 # A generator that returns callables that we'll call for each
3816 # call to recv().
3817 self._recv_step = iter(recv_funcs)
3818
3819 def recv_into(self, buffer):
3820 data = next(self._recv_step)()
3821 assert len(buffer) >= len(data)
3822 buffer[:len(data)] = data
3823 return len(data)
3824
3825 def _decref_socketios(self):
3826 pass
3827
3828 def _textiowrap_for_test(self, buffering=-1):
3829 raw = socket.SocketIO(self, "r")
3830 if buffering < 0:
3831 buffering = io.DEFAULT_BUFFER_SIZE
3832 if buffering == 0:
3833 return raw
3834 buffer = io.BufferedReader(raw, buffering)
3835 text = io.TextIOWrapper(buffer, None, None)
3836 text.mode = "rb"
3837 return text
3838
3839 @staticmethod
3840 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003841 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003842
3843 def _textiowrap_mock_socket(self, mock, buffering=-1):
3844 raw = socket.SocketIO(mock, "r")
3845 if buffering < 0:
3846 buffering = io.DEFAULT_BUFFER_SIZE
3847 if buffering == 0:
3848 return raw
3849 buffer = io.BufferedReader(raw, buffering)
3850 text = io.TextIOWrapper(buffer, None, None)
3851 text.mode = "rb"
3852 return text
3853
3854 def _test_readline(self, size=-1, buffering=-1):
3855 mock_sock = self.MockSocket(recv_funcs=[
3856 lambda : b"This is the first line\nAnd the sec",
3857 self._raise_eintr,
3858 lambda : b"ond line is here\n",
3859 lambda : b"",
3860 lambda : b"", # XXX(gps): io library does an extra EOF read
3861 ])
3862 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003863 self.assertEqual(fo.readline(size), "This is the first line\n")
3864 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003865
3866 def _test_read(self, size=-1, buffering=-1):
3867 mock_sock = self.MockSocket(recv_funcs=[
3868 lambda : b"This is the first line\nAnd the sec",
3869 self._raise_eintr,
3870 lambda : b"ond line is here\n",
3871 lambda : b"",
3872 lambda : b"", # XXX(gps): io library does an extra EOF read
3873 ])
3874 expecting = (b"This is the first line\n"
3875 b"And the second line is here\n")
3876 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3877 if buffering == 0:
3878 data = b''
3879 else:
3880 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003881 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003882 while len(data) != len(expecting):
3883 part = fo.read(size)
3884 if not part:
3885 break
3886 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003887 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003888
3889 def test_default(self):
3890 self._test_readline()
3891 self._test_readline(size=100)
3892 self._test_read()
3893 self._test_read(size=100)
3894
3895 def test_with_1k_buffer(self):
3896 self._test_readline(buffering=1024)
3897 self._test_readline(size=100, buffering=1024)
3898 self._test_read(buffering=1024)
3899 self._test_read(size=100, buffering=1024)
3900
3901 def _test_readline_no_buffer(self, size=-1):
3902 mock_sock = self.MockSocket(recv_funcs=[
3903 lambda : b"a",
3904 lambda : b"\n",
3905 lambda : b"B",
3906 self._raise_eintr,
3907 lambda : b"b",
3908 lambda : b"",
3909 ])
3910 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003911 self.assertEqual(fo.readline(size), b"a\n")
3912 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003913
3914 def test_no_buffer(self):
3915 self._test_readline_no_buffer()
3916 self._test_readline_no_buffer(size=4)
3917 self._test_read(buffering=0)
3918 self._test_read(size=100, buffering=0)
3919
3920
Guido van Rossume9f66142002-08-07 15:46:19 +00003921class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3922
3923 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003924
Guido van Rossume9f66142002-08-07 15:46:19 +00003925 In this case (and in this case only), it should be possible to
3926 create a file object, read a line from it, create another file
3927 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003928 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003929 when reading multiple requests from the same socket."""
3930
3931 bufsize = 0 # Use unbuffered mode
3932
3933 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003934 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003935 line = self.read_file.readline() # first line
3936 self.assertEqual(line, b"A. " + self.write_msg) # first line
3937 self.read_file = self.cli_conn.makefile('rb', 0)
3938 line = self.read_file.readline() # second line
3939 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003940
3941 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003942 self.write_file.write(b"A. " + self.write_msg)
3943 self.write_file.write(b"B. " + self.write_msg)
3944 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003945
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003946 def testMakefileClose(self):
3947 # The file returned by makefile should keep the socket open...
3948 self.cli_conn.close()
3949 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003950 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003951 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003952 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003953 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3954
3955 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003956 self.write_file.write(self.write_msg)
3957 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003958
3959 def testMakefileCloseSocketDestroy(self):
3960 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003961 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003962 refcount_after = sys.getrefcount(self.cli_conn)
3963 self.assertEqual(refcount_before - 1, refcount_after)
3964
3965 def _testMakefileCloseSocketDestroy(self):
3966 pass
3967
Antoine Pitrou98b46702010-09-18 22:59:00 +00003968 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003969 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003970 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3971
3972 def testSmallReadNonBlocking(self):
3973 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003974 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3975 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003976 self.evt1.set()
3977 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003978 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003979 if first_seg is None:
3980 # Data not arrived (can happen under Windows), wait a bit
3981 time.sleep(0.5)
3982 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003983 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003984 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003985 self.assertEqual(n, 3)
3986 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003987 self.assertEqual(msg, self.read_msg)
3988 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3989 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003990
3991 def _testSmallReadNonBlocking(self):
3992 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003993 self.write_file.write(self.write_msg)
3994 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003995 self.evt2.set()
3996 # Avoid cloding the socket before the server test has finished,
3997 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3998 self.serv_finished.wait(5.0)
3999
4000 def testWriteNonBlocking(self):
4001 self.cli_finished.wait(5.0)
4002 # The client thread can't skip directly - the SkipTest exception
4003 # would appear as a failure.
4004 if self.serv_skipped:
4005 self.skipTest(self.serv_skipped)
4006
4007 def _testWriteNonBlocking(self):
4008 self.serv_skipped = None
4009 self.serv_conn.setblocking(False)
4010 # Try to saturate the socket buffer pipe with repeated large writes.
4011 BIG = b"x" * (1024 ** 2)
4012 LIMIT = 10
4013 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004014 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004015 self.assertGreater(n, 0)
4016 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004017 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004018 if n is None:
4019 # Succeeded
4020 break
4021 self.assertGreater(n, 0)
4022 else:
4023 # Let us know that this test didn't manage to establish
4024 # the expected conditions. This is not a failure in itself but,
4025 # if it happens repeatedly, the test should be fixed.
4026 self.serv_skipped = "failed to saturate the socket buffer"
4027
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004028
Guido van Rossum8c943832002-08-08 01:00:28 +00004029class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4030
4031 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4032
4033
4034class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4035
4036 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004037
Thomas Woutersb2137042007-02-01 18:02:27 +00004038
Antoine Pitrou834bd812010-10-13 16:17:14 +00004039class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4040 """Tests for socket.makefile() in text mode (rather than binary)"""
4041
4042 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004043 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004044 write_mode = 'wb'
4045 write_msg = MSG
4046 newline = ''
4047
4048
4049class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4050 """Tests for socket.makefile() in text mode (rather than binary)"""
4051
4052 read_mode = 'rb'
4053 read_msg = MSG
4054 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004055 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004056 newline = ''
4057
4058
4059class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4060 """Tests for socket.makefile() in text mode (rather than binary)"""
4061
4062 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004063 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004064 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004065 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004066 newline = ''
4067
4068
Guido van Rossumd8faa362007-04-27 19:54:29 +00004069class NetworkConnectionTest(object):
4070 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004071
Guido van Rossumd8faa362007-04-27 19:54:29 +00004072 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004073 # We're inherited below by BasicTCPTest2, which also inherits
4074 # BasicTCPTest, which defines self.port referenced below.
4075 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004076 self.serv_conn = self.cli
4077
4078class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4079 """Tests that NetworkConnection does not break existing TCP functionality.
4080 """
4081
4082class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004083
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004084 class MockSocket(socket.socket):
4085 def connect(self, *args):
4086 raise socket.timeout('timed out')
4087
4088 @contextlib.contextmanager
4089 def mocked_socket_module(self):
4090 """Return a socket which times out on connect"""
4091 old_socket = socket.socket
4092 socket.socket = self.MockSocket
4093 try:
4094 yield
4095 finally:
4096 socket.socket = old_socket
4097
4098 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004099 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004100 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004101 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004102 with self.assertRaises(socket.error) as cm:
4103 cli.connect((HOST, port))
4104 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4105
4106 def test_create_connection(self):
4107 # Issue #9792: errors raised by create_connection() should have
4108 # a proper errno attribute.
4109 port = support.find_unused_port()
4110 with self.assertRaises(socket.error) as cm:
4111 socket.create_connection((HOST, port))
4112 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4113
4114 def test_create_connection_timeout(self):
4115 # Issue #9792: create_connection() should not recast timeout errors
4116 # as generic socket errors.
4117 with self.mocked_socket_module():
4118 with self.assertRaises(socket.timeout):
4119 socket.create_connection((HOST, 1234))
4120
Guido van Rossumd8faa362007-04-27 19:54:29 +00004121
Victor Stinner45df8202010-04-28 22:31:17 +00004122@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004123class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4124
4125 def __init__(self, methodName='runTest'):
4126 SocketTCPTest.__init__(self, methodName=methodName)
4127 ThreadableTest.__init__(self)
4128
4129 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004130 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004131
4132 def clientTearDown(self):
4133 self.cli.close()
4134 self.cli = None
4135 ThreadableTest.clientTearDown(self)
4136
4137 def _justAccept(self):
4138 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004139 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004140
4141 testFamily = _justAccept
4142 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004143 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004144 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004145 self.assertEqual(self.cli.family, 2)
4146
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004147 testSourceAddress = _justAccept
4148 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004149 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4150 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004151 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004152 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004153 # The port number being used is sufficient to show that the bind()
4154 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004155
Guido van Rossumd8faa362007-04-27 19:54:29 +00004156 testTimeoutDefault = _justAccept
4157 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004158 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004159 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004160 socket.setdefaulttimeout(42)
4161 try:
4162 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004163 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004164 finally:
4165 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004166 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004167
4168 testTimeoutNone = _justAccept
4169 def _testTimeoutNone(self):
4170 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004171 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004172 socket.setdefaulttimeout(30)
4173 try:
4174 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004175 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004176 finally:
4177 socket.setdefaulttimeout(None)
4178 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004179
4180 testTimeoutValueNamed = _justAccept
4181 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004182 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004183 self.assertEqual(self.cli.gettimeout(), 30)
4184
4185 testTimeoutValueNonamed = _justAccept
4186 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004187 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004188 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004189 self.assertEqual(self.cli.gettimeout(), 30)
4190
Victor Stinner45df8202010-04-28 22:31:17 +00004191@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004192class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4193
4194 def __init__(self, methodName='runTest'):
4195 SocketTCPTest.__init__(self, methodName=methodName)
4196 ThreadableTest.__init__(self)
4197
4198 def clientSetUp(self):
4199 pass
4200
4201 def clientTearDown(self):
4202 self.cli.close()
4203 self.cli = None
4204 ThreadableTest.clientTearDown(self)
4205
4206 def testInsideTimeout(self):
4207 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004208 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004209 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004210 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004211 testOutsideTimeout = testInsideTimeout
4212
4213 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004214 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004215 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004216 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004217
4218 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004219 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004220 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004221
4222
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004223class TCPTimeoutTest(SocketTCPTest):
4224
4225 def testTCPTimeout(self):
4226 def raise_timeout(*args, **kwargs):
4227 self.serv.settimeout(1.0)
4228 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004229 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004230 "Error generating a timeout exception (TCP)")
4231
4232 def testTimeoutZero(self):
4233 ok = False
4234 try:
4235 self.serv.settimeout(0.0)
4236 foo = self.serv.accept()
4237 except socket.timeout:
4238 self.fail("caught timeout instead of error (TCP)")
4239 except socket.error:
4240 ok = True
4241 except:
4242 self.fail("caught unexpected exception (TCP)")
4243 if not ok:
4244 self.fail("accept() returned success when we did not expect it")
4245
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004246 def testInterruptedTimeout(self):
4247 # XXX I don't know how to do this test on MSWindows or any other
4248 # plaform that doesn't support signal.alarm() or os.kill(), though
4249 # the bug should have existed on all platforms.
4250 if not hasattr(signal, "alarm"):
4251 return # can only test on *nix
4252 self.serv.settimeout(5.0) # must be longer than alarm
4253 class Alarm(Exception):
4254 pass
4255 def alarm_handler(signal, frame):
4256 raise Alarm
4257 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4258 try:
4259 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4260 try:
4261 foo = self.serv.accept()
4262 except socket.timeout:
4263 self.fail("caught timeout instead of Alarm")
4264 except Alarm:
4265 pass
4266 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004267 self.fail("caught other exception instead of Alarm:"
4268 " %s(%s):\n%s" %
4269 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004270 else:
4271 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004272 finally:
4273 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004274 except Alarm:
4275 self.fail("got Alarm in wrong place")
4276 finally:
4277 # no alarm can be pending. Safe to restore old handler.
4278 signal.signal(signal.SIGALRM, old_alarm)
4279
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004280class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004281
4282 def testUDPTimeout(self):
4283 def raise_timeout(*args, **kwargs):
4284 self.serv.settimeout(1.0)
4285 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004286 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004287 "Error generating a timeout exception (UDP)")
4288
4289 def testTimeoutZero(self):
4290 ok = False
4291 try:
4292 self.serv.settimeout(0.0)
4293 foo = self.serv.recv(1024)
4294 except socket.timeout:
4295 self.fail("caught timeout instead of error (UDP)")
4296 except socket.error:
4297 ok = True
4298 except:
4299 self.fail("caught unexpected exception (UDP)")
4300 if not ok:
4301 self.fail("recv() returned success when we did not expect it")
4302
4303class TestExceptions(unittest.TestCase):
4304
4305 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004306 self.assertTrue(issubclass(socket.error, Exception))
4307 self.assertTrue(issubclass(socket.herror, socket.error))
4308 self.assertTrue(issubclass(socket.gaierror, socket.error))
4309 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004310
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004311class TestLinuxAbstractNamespace(unittest.TestCase):
4312
4313 UNIX_PATH_MAX = 108
4314
4315 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004316 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004317 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4318 s1.bind(address)
4319 s1.listen(1)
4320 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4321 s2.connect(s1.getsockname())
4322 with s1.accept()[0] as s3:
4323 self.assertEqual(s1.getsockname(), address)
4324 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004325
4326 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004327 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004328 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4329 s.bind(address)
4330 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004331
4332 def testNameOverflow(self):
4333 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004334 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4335 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004336
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004337 def testStrName(self):
4338 # Check that an abstract name can be passed as a string.
4339 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4340 try:
4341 s.bind("\x00python\x00test\x00")
4342 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4343 finally:
4344 s.close()
4345
4346class TestUnixDomain(unittest.TestCase):
4347
4348 def setUp(self):
4349 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4350
4351 def tearDown(self):
4352 self.sock.close()
4353
4354 def encoded(self, path):
4355 # Return the given path encoded in the file system encoding,
4356 # or skip the test if this is not possible.
4357 try:
4358 return os.fsencode(path)
4359 except UnicodeEncodeError:
4360 self.skipTest(
4361 "Pathname {0!a} cannot be represented in file "
4362 "system encoding {1!r}".format(
4363 path, sys.getfilesystemencoding()))
4364
Antoine Pitrou16374872011-12-16 15:04:12 +01004365 def bind(self, sock, path):
4366 # Bind the socket
4367 try:
4368 sock.bind(path)
4369 except OSError as e:
4370 if str(e) == "AF_UNIX path too long":
4371 self.skipTest(
4372 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4373 .format(path))
4374 else:
4375 raise
4376
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004377 def testStrAddr(self):
4378 # Test binding to and retrieving a normal string pathname.
4379 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004380 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004381 self.addCleanup(support.unlink, path)
4382 self.assertEqual(self.sock.getsockname(), path)
4383
4384 def testBytesAddr(self):
4385 # Test binding to a bytes pathname.
4386 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004387 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004388 self.addCleanup(support.unlink, path)
4389 self.assertEqual(self.sock.getsockname(), path)
4390
4391 def testSurrogateescapeBind(self):
4392 # Test binding to a valid non-ASCII pathname, with the
4393 # non-ASCII bytes supplied using surrogateescape encoding.
4394 path = os.path.abspath(support.TESTFN_UNICODE)
4395 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004396 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004397 self.addCleanup(support.unlink, path)
4398 self.assertEqual(self.sock.getsockname(), path)
4399
4400 def testUnencodableAddr(self):
4401 # Test binding to a pathname that cannot be encoded in the
4402 # file system encoding.
4403 if support.TESTFN_UNENCODABLE is None:
4404 self.skipTest("No unencodable filename available")
4405 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004406 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004407 self.addCleanup(support.unlink, path)
4408 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004409
Victor Stinner45df8202010-04-28 22:31:17 +00004410@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004411class BufferIOTest(SocketConnectedTest):
4412 """
4413 Test the buffer versions of socket.recv() and socket.send().
4414 """
4415 def __init__(self, methodName='runTest'):
4416 SocketConnectedTest.__init__(self, methodName=methodName)
4417
Antoine Pitrou25480782010-03-17 22:50:28 +00004418 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004419 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004420 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004421 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004422 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004423 self.assertEqual(msg, MSG)
4424
Antoine Pitrou25480782010-03-17 22:50:28 +00004425 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004426 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004427 self.serv_conn.send(buf)
4428
Antoine Pitrou25480782010-03-17 22:50:28 +00004429 def testRecvIntoBytearray(self):
4430 buf = bytearray(1024)
4431 nbytes = self.cli_conn.recv_into(buf)
4432 self.assertEqual(nbytes, len(MSG))
4433 msg = buf[:len(MSG)]
4434 self.assertEqual(msg, MSG)
4435
4436 _testRecvIntoBytearray = _testRecvIntoArray
4437
4438 def testRecvIntoMemoryview(self):
4439 buf = bytearray(1024)
4440 nbytes = self.cli_conn.recv_into(memoryview(buf))
4441 self.assertEqual(nbytes, len(MSG))
4442 msg = buf[:len(MSG)]
4443 self.assertEqual(msg, MSG)
4444
4445 _testRecvIntoMemoryview = _testRecvIntoArray
4446
4447 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004448 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004449 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004450 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004451 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004452 self.assertEqual(msg, MSG)
4453
Antoine Pitrou25480782010-03-17 22:50:28 +00004454 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004455 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004456 self.serv_conn.send(buf)
4457
Antoine Pitrou25480782010-03-17 22:50:28 +00004458 def testRecvFromIntoBytearray(self):
4459 buf = bytearray(1024)
4460 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4461 self.assertEqual(nbytes, len(MSG))
4462 msg = buf[:len(MSG)]
4463 self.assertEqual(msg, MSG)
4464
4465 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4466
4467 def testRecvFromIntoMemoryview(self):
4468 buf = bytearray(1024)
4469 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4470 self.assertEqual(nbytes, len(MSG))
4471 msg = buf[:len(MSG)]
4472 self.assertEqual(msg, MSG)
4473
4474 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4475
Christian Heimes043d6f62008-01-07 17:19:16 +00004476
4477TIPC_STYPE = 2000
4478TIPC_LOWER = 200
4479TIPC_UPPER = 210
4480
4481def isTipcAvailable():
4482 """Check if the TIPC module is loaded
4483
4484 The TIPC module is not loaded automatically on Ubuntu and probably
4485 other Linux distros.
4486 """
4487 if not hasattr(socket, "AF_TIPC"):
4488 return False
4489 if not os.path.isfile("/proc/modules"):
4490 return False
4491 with open("/proc/modules") as f:
4492 for line in f:
4493 if line.startswith("tipc "):
4494 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004495 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004496 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4497 return False
4498
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004499class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004500 def testRDM(self):
4501 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4502 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004503 self.addCleanup(srv.close)
4504 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004505
4506 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4507 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4508 TIPC_LOWER, TIPC_UPPER)
4509 srv.bind(srvaddr)
4510
4511 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4512 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4513 cli.sendto(MSG, sendaddr)
4514
4515 msg, recvaddr = srv.recvfrom(1024)
4516
4517 self.assertEqual(cli.getsockname(), recvaddr)
4518 self.assertEqual(msg, MSG)
4519
4520
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004521class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004522 def __init__(self, methodName = 'runTest'):
4523 unittest.TestCase.__init__(self, methodName = methodName)
4524 ThreadableTest.__init__(self)
4525
4526 def setUp(self):
4527 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004528 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004529 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4530 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4531 TIPC_LOWER, TIPC_UPPER)
4532 self.srv.bind(srvaddr)
4533 self.srv.listen(5)
4534 self.serverExplicitReady()
4535 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004536 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004537
4538 def clientSetUp(self):
4539 # The is a hittable race between serverExplicitReady() and the
4540 # accept() call; sleep a little while to avoid it, otherwise
4541 # we could get an exception
4542 time.sleep(0.1)
4543 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004544 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004545 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4546 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4547 self.cli.connect(addr)
4548 self.cliaddr = self.cli.getsockname()
4549
4550 def testStream(self):
4551 msg = self.conn.recv(1024)
4552 self.assertEqual(msg, MSG)
4553 self.assertEqual(self.cliaddr, self.connaddr)
4554
4555 def _testStream(self):
4556 self.cli.send(MSG)
4557 self.cli.close()
4558
4559
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004560@unittest.skipUnless(thread, 'Threading required for this test.')
4561class ContextManagersTest(ThreadedTCPSocketTest):
4562
4563 def _testSocketClass(self):
4564 # base test
4565 with socket.socket() as sock:
4566 self.assertFalse(sock._closed)
4567 self.assertTrue(sock._closed)
4568 # close inside with block
4569 with socket.socket() as sock:
4570 sock.close()
4571 self.assertTrue(sock._closed)
4572 # exception inside with block
4573 with socket.socket() as sock:
4574 self.assertRaises(socket.error, sock.sendall, b'foo')
4575 self.assertTrue(sock._closed)
4576
4577 def testCreateConnectionBase(self):
4578 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004579 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004580 data = conn.recv(1024)
4581 conn.sendall(data)
4582
4583 def _testCreateConnectionBase(self):
4584 address = self.serv.getsockname()
4585 with socket.create_connection(address) as sock:
4586 self.assertFalse(sock._closed)
4587 sock.sendall(b'foo')
4588 self.assertEqual(sock.recv(1024), b'foo')
4589 self.assertTrue(sock._closed)
4590
4591 def testCreateConnectionClose(self):
4592 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004593 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004594 data = conn.recv(1024)
4595 conn.sendall(data)
4596
4597 def _testCreateConnectionClose(self):
4598 address = self.serv.getsockname()
4599 with socket.create_connection(address) as sock:
4600 sock.close()
4601 self.assertTrue(sock._closed)
4602 self.assertRaises(socket.error, sock.sendall, b'foo')
4603
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004604
Antoine Pitroub1c54962010-10-14 15:05:38 +00004605@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4606 "SOCK_CLOEXEC not defined")
4607@unittest.skipUnless(fcntl, "module fcntl not available")
4608class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004609 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004610 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004611 with socket.socket(socket.AF_INET,
4612 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4613 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4614 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004615
4616
4617@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4618 "SOCK_NONBLOCK not defined")
4619class NonblockConstantTest(unittest.TestCase):
4620 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4621 if nonblock:
4622 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4623 self.assertEqual(s.gettimeout(), timeout)
4624 else:
4625 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4626 self.assertEqual(s.gettimeout(), None)
4627
Charles-François Natali239bb962011-06-03 12:55:15 +02004628 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004629 def test_SOCK_NONBLOCK(self):
4630 # a lot of it seems silly and redundant, but I wanted to test that
4631 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004632 with socket.socket(socket.AF_INET,
4633 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4634 self.checkNonblock(s)
4635 s.setblocking(1)
4636 self.checkNonblock(s, False)
4637 s.setblocking(0)
4638 self.checkNonblock(s)
4639 s.settimeout(None)
4640 self.checkNonblock(s, False)
4641 s.settimeout(2.0)
4642 self.checkNonblock(s, timeout=2.0)
4643 s.setblocking(1)
4644 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004645 # defaulttimeout
4646 t = socket.getdefaulttimeout()
4647 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004648 with socket.socket() as s:
4649 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004650 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004651 with socket.socket() as s:
4652 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004653 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004654 with socket.socket() as s:
4655 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004656 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004657 with socket.socket() as s:
4658 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004659 socket.setdefaulttimeout(t)
4660
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004661
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004662@unittest.skipUnless(os.name == "nt", "Windows specific")
4663@unittest.skipUnless(multiprocessing, "need multiprocessing")
4664class TestSocketSharing(SocketTCPTest):
4665 # This must be classmethod and not staticmethod or multiprocessing
4666 # won't be able to bootstrap it.
4667 @classmethod
4668 def remoteProcessServer(cls, q):
4669 # Recreate socket from shared data
4670 sdata = q.get()
4671 message = q.get()
4672
4673 s = socket.fromshare(sdata)
4674 s2, c = s.accept()
4675
4676 # Send the message
4677 s2.sendall(message)
4678 s2.close()
4679 s.close()
4680
4681 def testShare(self):
4682 # Transfer the listening server socket to another process
4683 # and service it from there.
4684
4685 # Create process:
4686 q = multiprocessing.Queue()
4687 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4688 p.start()
4689
4690 # Get the shared socket data
4691 data = self.serv.share(p.pid)
4692
4693 # Pass the shared socket to the other process
4694 addr = self.serv.getsockname()
4695 self.serv.close()
4696 q.put(data)
4697
4698 # The data that the server will send us
4699 message = b"slapmahfro"
4700 q.put(message)
4701
4702 # Connect
4703 s = socket.create_connection(addr)
4704 # listen for the data
4705 m = []
4706 while True:
4707 data = s.recv(100)
4708 if not data:
4709 break
4710 m.append(data)
4711 s.close()
4712 received = b"".join(m)
4713 self.assertEqual(received, message)
4714 p.join()
4715
4716 def testShareLength(self):
4717 data = self.serv.share(os.getpid())
4718 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4719 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4720
4721 def compareSockets(self, org, other):
4722 # socket sharing is expected to work only for blocking socket
4723 # since the internal python timout value isn't transfered.
4724 self.assertEqual(org.gettimeout(), None)
4725 self.assertEqual(org.gettimeout(), other.gettimeout())
4726
4727 self.assertEqual(org.family, other.family)
4728 self.assertEqual(org.type, other.type)
4729 # If the user specified "0" for proto, then
4730 # internally windows will have picked the correct value.
4731 # Python introspection on the socket however will still return
4732 # 0. For the shared socket, the python value is recreated
4733 # from the actual value, so it may not compare correctly.
4734 if org.proto != 0:
4735 self.assertEqual(org.proto, other.proto)
4736
4737 def testShareLocal(self):
4738 data = self.serv.share(os.getpid())
4739 s = socket.fromshare(data)
4740 try:
4741 self.compareSockets(self.serv, s)
4742 finally:
4743 s.close()
4744
4745 def testTypes(self):
4746 families = [socket.AF_INET, socket.AF_INET6]
4747 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
4748 for f in families:
4749 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00004750 try:
4751 source = socket.socket(f, t)
4752 except OSError:
4753 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004754 try:
4755 data = source.share(os.getpid())
4756 shared = socket.fromshare(data)
4757 try:
4758 self.compareSockets(source, shared)
4759 finally:
4760 shared.close()
4761 finally:
4762 source.close()
4763
4764
Guido van Rossumb995eb72002-07-31 16:08:40 +00004765def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004766 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004767 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004768
4769 tests.extend([
4770 NonBlockingTCPTests,
4771 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004772 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004773 UnbufferedFileObjectClassTestCase,
4774 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004775 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004776 UnicodeReadFileObjectClassTestCase,
4777 UnicodeWriteFileObjectClassTestCase,
4778 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004779 NetworkConnectionNoServer,
4780 NetworkConnectionAttributesTest,
4781 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004782 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004783 CloexecConstantTest,
4784 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004785 ])
Dave Cole331708b2004-08-09 04:51:41 +00004786 if hasattr(socket, "socketpair"):
4787 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004788 if hasattr(socket, "AF_UNIX"):
4789 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004790 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004791 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004792 if isTipcAvailable():
4793 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004794 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004795 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004796 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004797 tests.extend([
4798 CmsgMacroTests,
4799 SendmsgUDPTest,
4800 RecvmsgUDPTest,
4801 RecvmsgIntoUDPTest,
4802 SendmsgUDP6Test,
4803 RecvmsgUDP6Test,
4804 RecvmsgRFC3542AncillaryUDP6Test,
4805 RecvmsgIntoRFC3542AncillaryUDP6Test,
4806 RecvmsgIntoUDP6Test,
4807 SendmsgTCPTest,
4808 RecvmsgTCPTest,
4809 RecvmsgIntoTCPTest,
4810 SendmsgSCTPStreamTest,
4811 RecvmsgSCTPStreamTest,
4812 RecvmsgIntoSCTPStreamTest,
4813 SendmsgUnixStreamTest,
4814 RecvmsgUnixStreamTest,
4815 RecvmsgIntoUnixStreamTest,
4816 RecvmsgSCMRightsStreamTest,
4817 RecvmsgIntoSCMRightsStreamTest,
4818 # These are slow when setitimer() is not available
4819 InterruptedRecvTimeoutTest,
4820 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004821 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004822 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004823
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004824 thread_info = support.threading_setup()
4825 support.run_unittest(*tests)
4826 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004827
4828if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004829 test_main()