blob: 7aef8e947d7e07464607b2d9774c597f434b7c0f [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100010import tempfile
11import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000012import time
13import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000014import queue
Jack Jansen522e7692002-09-06 21:57:50 +000015import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import os
17import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000018import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000019import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000020from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000021import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000022import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010023import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020024import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
26 import fcntl
27except ImportError:
28 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Benjamin Petersonee8712c2008-05-20 21:35:26 +000030HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000031MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Victor Stinner45df8202010-04-28 22:31:17 +000033try:
34 import _thread as thread
35 import threading
36except ImportError:
37 thread = None
38 threading = None
39
Charles-François Natali47413c12011-10-06 19:47:44 +020040def _have_socket_can():
41 """Check whether CAN sockets are supported on this host."""
42 try:
43 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
44 except (AttributeError, socket.error, OSError):
45 return False
46 else:
47 s.close()
48 return True
49
Charles-François Natali10b8cf42011-11-10 19:21:37 +010050def _have_socket_rds():
51 """Check whether RDS sockets are supported on this host."""
52 try:
53 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
54 except (AttributeError, OSError):
55 return False
56 else:
57 s.close()
58 return True
59
Charles-François Natali47413c12011-10-06 19:47:44 +020060HAVE_SOCKET_CAN = _have_socket_can()
61
Charles-François Natali10b8cf42011-11-10 19:21:37 +010062HAVE_SOCKET_RDS = _have_socket_rds()
63
Nick Coghlan96fe56a2011-08-22 11:55:57 +100064# Size in bytes of the int type
65SIZEOF_INT = array.array("i").itemsize
66
Guido van Rossum24e4af82002-06-12 19:18:08 +000067class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000068
Guido van Rossum24e4af82002-06-12 19:18:08 +000069 def setUp(self):
70 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000071 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000072 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000073
Guido van Rossum24e4af82002-06-12 19:18:08 +000074 def tearDown(self):
75 self.serv.close()
76 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078class SocketUDPTest(unittest.TestCase):
79
80 def setUp(self):
81 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000082 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000083
84 def tearDown(self):
85 self.serv.close()
86 self.serv = None
87
Nick Coghlan96fe56a2011-08-22 11:55:57 +100088class ThreadSafeCleanupTestCase(unittest.TestCase):
89 """Subclass of unittest.TestCase with thread-safe cleanup methods.
90
91 This subclass protects the addCleanup() and doCleanups() methods
92 with a recursive lock.
93 """
94
95 if threading:
96 def __init__(self, *args, **kwargs):
97 super().__init__(*args, **kwargs)
98 self._cleanup_lock = threading.RLock()
99
100 def addCleanup(self, *args, **kwargs):
101 with self._cleanup_lock:
102 return super().addCleanup(*args, **kwargs)
103
104 def doCleanups(self, *args, **kwargs):
105 with self._cleanup_lock:
106 return super().doCleanups(*args, **kwargs)
107
Charles-François Natali47413c12011-10-06 19:47:44 +0200108class SocketCANTest(unittest.TestCase):
109
110 """To be able to run this test, a `vcan0` CAN interface can be created with
111 the following commands:
112 # modprobe vcan
113 # ip link add dev vcan0 type vcan
114 # ifconfig vcan0 up
115 """
116 interface = 'vcan0'
117 bufsize = 128
118
119 def setUp(self):
120 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200121 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200122 try:
123 self.s.bind((self.interface,))
124 except socket.error:
125 self.skipTest('network interface `%s` does not exist' %
126 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200127
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100128
129class SocketRDSTest(unittest.TestCase):
130
131 """To be able to run this test, the `rds` kernel module must be loaded:
132 # modprobe rds
133 """
134 bufsize = 8192
135
136 def setUp(self):
137 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
138 self.addCleanup(self.serv.close)
139 try:
140 self.port = support.bind_port(self.serv)
141 except OSError:
142 self.skipTest('unable to bind RDS socket')
143
144
Guido van Rossum24e4af82002-06-12 19:18:08 +0000145class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 """Threadable Test class
147
148 The ThreadableTest class makes it easy to create a threaded
149 client/server pair from an existing unit test. To create a
150 new threaded class from an existing unit test, use multiple
151 inheritance:
152
153 class NewClass (OldClass, ThreadableTest):
154 pass
155
156 This class defines two new fixture functions with obvious
157 purposes for overriding:
158
159 clientSetUp ()
160 clientTearDown ()
161
162 Any new test functions within the class must then define
163 tests in pairs, where the test name is preceeded with a
164 '_' to indicate the client portion of the test. Ex:
165
166 def testFoo(self):
167 # Server portion
168
169 def _testFoo(self):
170 # Client portion
171
172 Any exceptions raised by the clients during their tests
173 are caught and transferred to the main thread to alert
174 the testing framework.
175
176 Note, the server setup function cannot call any blocking
177 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000178 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000179 the blocking call (such as in setting up a client/server
180 connection and performing the accept() in setUp().
181 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000182
183 def __init__(self):
184 # Swap the true setup function
185 self.__setUp = self.setUp
186 self.__tearDown = self.tearDown
187 self.setUp = self._setUp
188 self.tearDown = self._tearDown
189
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000190 def serverExplicitReady(self):
191 """This method allows the server to explicitly indicate that
192 it wants the client thread to proceed. This is useful if the
193 server is about to execute a blocking routine that is
194 dependent upon the client thread during its setup routine."""
195 self.server_ready.set()
196
Guido van Rossum24e4af82002-06-12 19:18:08 +0000197 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000198 self.server_ready = threading.Event()
199 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000200 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000201 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200202 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000203
204 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000205 methodname = self.id()
206 i = methodname.rfind('.')
207 methodname = methodname[i+1:]
208 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000209 self.client_thread = thread.start_new_thread(
210 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200212 try:
213 self.__setUp()
214 except:
215 self.server_crashed = True
216 raise
217 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000218 self.server_ready.set()
219 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000220
221 def _tearDown(self):
222 self.__tearDown()
223 self.done.wait()
224
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000225 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000226 exc = self.queue.get()
227 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000228
229 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000230 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200232 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200233 if self.server_crashed:
234 self.clientTearDown()
235 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000236 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000237 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000238 try:
239 test_func()
Nick Coghlan2496f332011-09-19 20:26:31 +1000240 except unittest._ExpectedFailure:
241 # We deliberately ignore expected failures
242 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000243 except BaseException as e:
244 self.queue.put(e)
245 finally:
246 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247
248 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000249 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250
251 def clientTearDown(self):
252 self.done.set()
253 thread.exit()
254
255class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
256
257 def __init__(self, methodName='runTest'):
258 SocketTCPTest.__init__(self, methodName=methodName)
259 ThreadableTest.__init__(self)
260
261 def clientSetUp(self):
262 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
263
264 def clientTearDown(self):
265 self.cli.close()
266 self.cli = None
267 ThreadableTest.clientTearDown(self)
268
269class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
270
271 def __init__(self, methodName='runTest'):
272 SocketUDPTest.__init__(self, methodName=methodName)
273 ThreadableTest.__init__(self)
274
275 def clientSetUp(self):
276 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
277
Brian Curtin3beb38f2010-11-04 03:41:43 +0000278 def clientTearDown(self):
279 self.cli.close()
280 self.cli = None
281 ThreadableTest.clientTearDown(self)
282
Charles-François Natali47413c12011-10-06 19:47:44 +0200283class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
284
285 def __init__(self, methodName='runTest'):
286 SocketCANTest.__init__(self, methodName=methodName)
287 ThreadableTest.__init__(self)
288
289 def clientSetUp(self):
290 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
291 try:
292 self.cli.bind((self.interface,))
293 except socket.error:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200294 # skipTest should not be called here, and will be called in the
295 # server instead
296 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200297
298 def clientTearDown(self):
299 self.cli.close()
300 self.cli = None
301 ThreadableTest.clientTearDown(self)
302
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100303class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
304
305 def __init__(self, methodName='runTest'):
306 SocketRDSTest.__init__(self, methodName=methodName)
307 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100308
309 def clientSetUp(self):
310 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
311 try:
312 # RDS sockets must be bound explicitly to send or receive data
313 self.cli.bind((HOST, 0))
314 self.cli_addr = self.cli.getsockname()
315 except OSError:
316 # skipTest should not be called here, and will be called in the
317 # server instead
318 pass
319
320 def clientTearDown(self):
321 self.cli.close()
322 self.cli = None
323 ThreadableTest.clientTearDown(self)
324
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000326 """Socket tests for client-server connection.
327
328 self.cli_conn is a client socket connected to the server. The
329 setUp() method guarantees that it is connected to the server.
330 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331
332 def __init__(self, methodName='runTest'):
333 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
334
335 def setUp(self):
336 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000337 # Indicate explicitly we're ready for the client thread to
338 # proceed and then perform the blocking call to accept
339 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340 conn, addr = self.serv.accept()
341 self.cli_conn = conn
342
343 def tearDown(self):
344 self.cli_conn.close()
345 self.cli_conn = None
346 ThreadedTCPSocketTest.tearDown(self)
347
348 def clientSetUp(self):
349 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000350 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000351 self.serv_conn = self.cli
352
353 def clientTearDown(self):
354 self.serv_conn.close()
355 self.serv_conn = None
356 ThreadedTCPSocketTest.clientTearDown(self)
357
Dave Cole331708b2004-08-09 04:51:41 +0000358class SocketPairTest(unittest.TestCase, ThreadableTest):
359
360 def __init__(self, methodName='runTest'):
361 unittest.TestCase.__init__(self, methodName=methodName)
362 ThreadableTest.__init__(self)
363
364 def setUp(self):
365 self.serv, self.cli = socket.socketpair()
366
367 def tearDown(self):
368 self.serv.close()
369 self.serv = None
370
371 def clientSetUp(self):
372 pass
373
374 def clientTearDown(self):
375 self.cli.close()
376 self.cli = None
377 ThreadableTest.clientTearDown(self)
378
Tim Peters494aaee2004-08-09 18:54:11 +0000379
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000380# The following classes are used by the sendmsg()/recvmsg() tests.
381# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
382# gives a drop-in replacement for SocketConnectedTest, but different
383# address families can be used, and the attributes serv_addr and
384# cli_addr will be set to the addresses of the endpoints.
385
386class SocketTestBase(unittest.TestCase):
387 """A base class for socket tests.
388
389 Subclasses must provide methods newSocket() to return a new socket
390 and bindSock(sock) to bind it to an unused address.
391
392 Creates a socket self.serv and sets self.serv_addr to its address.
393 """
394
395 def setUp(self):
396 self.serv = self.newSocket()
397 self.bindServer()
398
399 def bindServer(self):
400 """Bind server socket and set self.serv_addr to its address."""
401 self.bindSock(self.serv)
402 self.serv_addr = self.serv.getsockname()
403
404 def tearDown(self):
405 self.serv.close()
406 self.serv = None
407
408
409class SocketListeningTestMixin(SocketTestBase):
410 """Mixin to listen on the server socket."""
411
412 def setUp(self):
413 super().setUp()
414 self.serv.listen(1)
415
416
417class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
418 ThreadableTest):
419 """Mixin to add client socket and allow client/server tests.
420
421 Client socket is self.cli and its address is self.cli_addr. See
422 ThreadableTest for usage information.
423 """
424
425 def __init__(self, *args, **kwargs):
426 super().__init__(*args, **kwargs)
427 ThreadableTest.__init__(self)
428
429 def clientSetUp(self):
430 self.cli = self.newClientSocket()
431 self.bindClient()
432
433 def newClientSocket(self):
434 """Return a new socket for use as client."""
435 return self.newSocket()
436
437 def bindClient(self):
438 """Bind client socket and set self.cli_addr to its address."""
439 self.bindSock(self.cli)
440 self.cli_addr = self.cli.getsockname()
441
442 def clientTearDown(self):
443 self.cli.close()
444 self.cli = None
445 ThreadableTest.clientTearDown(self)
446
447
448class ConnectedStreamTestMixin(SocketListeningTestMixin,
449 ThreadedSocketTestMixin):
450 """Mixin to allow client/server stream tests with connected client.
451
452 Server's socket representing connection to client is self.cli_conn
453 and client's connection to server is self.serv_conn. (Based on
454 SocketConnectedTest.)
455 """
456
457 def setUp(self):
458 super().setUp()
459 # Indicate explicitly we're ready for the client thread to
460 # proceed and then perform the blocking call to accept
461 self.serverExplicitReady()
462 conn, addr = self.serv.accept()
463 self.cli_conn = conn
464
465 def tearDown(self):
466 self.cli_conn.close()
467 self.cli_conn = None
468 super().tearDown()
469
470 def clientSetUp(self):
471 super().clientSetUp()
472 self.cli.connect(self.serv_addr)
473 self.serv_conn = self.cli
474
475 def clientTearDown(self):
476 self.serv_conn.close()
477 self.serv_conn = None
478 super().clientTearDown()
479
480
481class UnixSocketTestBase(SocketTestBase):
482 """Base class for Unix-domain socket tests."""
483
484 # This class is used for file descriptor passing tests, so we
485 # create the sockets in a private directory so that other users
486 # can't send anything that might be problematic for a privileged
487 # user running the tests.
488
489 def setUp(self):
490 self.dir_path = tempfile.mkdtemp()
491 self.addCleanup(os.rmdir, self.dir_path)
492 super().setUp()
493
494 def bindSock(self, sock):
495 path = tempfile.mktemp(dir=self.dir_path)
496 sock.bind(path)
497 self.addCleanup(support.unlink, path)
498
499class UnixStreamBase(UnixSocketTestBase):
500 """Base class for Unix-domain SOCK_STREAM tests."""
501
502 def newSocket(self):
503 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
504
505
506class InetTestBase(SocketTestBase):
507 """Base class for IPv4 socket tests."""
508
509 host = HOST
510
511 def setUp(self):
512 super().setUp()
513 self.port = self.serv_addr[1]
514
515 def bindSock(self, sock):
516 support.bind_port(sock, host=self.host)
517
518class TCPTestBase(InetTestBase):
519 """Base class for TCP-over-IPv4 tests."""
520
521 def newSocket(self):
522 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
523
524class UDPTestBase(InetTestBase):
525 """Base class for UDP-over-IPv4 tests."""
526
527 def newSocket(self):
528 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
529
530class SCTPStreamBase(InetTestBase):
531 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
532
533 def newSocket(self):
534 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
535 socket.IPPROTO_SCTP)
536
537
538class Inet6TestBase(InetTestBase):
539 """Base class for IPv6 socket tests."""
540
541 # Don't use "localhost" here - it may not have an IPv6 address
542 # assigned to it by default (e.g. in /etc/hosts), and if someone
543 # has assigned it an IPv4-mapped address, then it's unlikely to
544 # work with the full IPv6 API.
545 host = "::1"
546
547class UDP6TestBase(Inet6TestBase):
548 """Base class for UDP-over-IPv6 tests."""
549
550 def newSocket(self):
551 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
552
553
554# Test-skipping decorators for use with ThreadableTest.
555
556def skipWithClientIf(condition, reason):
557 """Skip decorated test if condition is true, add client_skip decorator.
558
559 If the decorated object is not a class, sets its attribute
560 "client_skip" to a decorator which will return an empty function
561 if the test is to be skipped, or the original function if it is
562 not. This can be used to avoid running the client part of a
563 skipped test when using ThreadableTest.
564 """
565 def client_pass(*args, **kwargs):
566 pass
567 def skipdec(obj):
568 retval = unittest.skip(reason)(obj)
569 if not isinstance(obj, type):
570 retval.client_skip = lambda f: client_pass
571 return retval
572 def noskipdec(obj):
573 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
574 obj.client_skip = lambda f: f
575 return obj
576 return skipdec if condition else noskipdec
577
578
579def requireAttrs(obj, *attributes):
580 """Skip decorated test if obj is missing any of the given attributes.
581
582 Sets client_skip attribute as skipWithClientIf() does.
583 """
584 missing = [name for name in attributes if not hasattr(obj, name)]
585 return skipWithClientIf(
586 missing, "don't have " + ", ".join(name for name in missing))
587
588
589def requireSocket(*args):
590 """Skip decorated test if a socket cannot be created with given arguments.
591
592 When an argument is given as a string, will use the value of that
593 attribute of the socket module, or skip the test if it doesn't
594 exist. Sets client_skip attribute as skipWithClientIf() does.
595 """
596 err = None
597 missing = [obj for obj in args if
598 isinstance(obj, str) and not hasattr(socket, obj)]
599 if missing:
600 err = "don't have " + ", ".join(name for name in missing)
601 else:
602 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
603 for obj in args]
604 try:
605 s = socket.socket(*callargs)
606 except socket.error as e:
607 # XXX: check errno?
608 err = str(e)
609 else:
610 s.close()
611 return skipWithClientIf(
612 err is not None,
613 "can't create socket({0}): {1}".format(
614 ", ".join(str(o) for o in args), err))
615
616
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617#######################################################################
618## Begin Tests
619
620class GeneralModuleTests(unittest.TestCase):
621
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000622 def test_repr(self):
623 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000624 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000625 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000626
Raymond Hettinger027bb632004-05-31 03:09:25 +0000627 def test_weakref(self):
628 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
629 p = proxy(s)
630 self.assertEqual(p.fileno(), s.fileno())
631 s.close()
632 s = None
633 try:
634 p.fileno()
635 except ReferenceError:
636 pass
637 else:
638 self.fail('Socket proxy still exists')
639
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000641 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300642 msg = "Error raising socket exception (%s)."
643 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000644 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300645 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000646 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300647 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649
Ezio Melotti63e42302011-05-07 19:47:48 +0300650 def testSendtoErrors(self):
651 # Testing that sendto doens't masks failures. See #10169.
652 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
653 self.addCleanup(s.close)
654 s.bind(('', 0))
655 sockname = s.getsockname()
656 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300657 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300658 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300659 self.assertEqual(str(cm.exception),
660 "'str' does not support the buffer interface")
661 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300662 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300663 self.assertEqual(str(cm.exception),
664 "'complex' does not support the buffer interface")
665 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300666 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300667 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300668 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300669 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300670 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300671 self.assertEqual(str(cm.exception),
672 "'str' does not support the buffer interface")
673 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300674 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300675 self.assertEqual(str(cm.exception),
676 "'complex' does not support the buffer interface")
677 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300678 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300679 self.assertIn('not NoneType', str(cm.exception))
680 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300681 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300682 self.assertIn('an integer is required', str(cm.exception))
683 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300684 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300685 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300686 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300687 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300688 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300689 self.assertIn('(1 given)', str(cm.exception))
690 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300691 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300692 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300693
Guido van Rossum24e4af82002-06-12 19:18:08 +0000694 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000695 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696 socket.AF_INET
697 socket.SOCK_STREAM
698 socket.SOCK_DGRAM
699 socket.SOCK_RAW
700 socket.SOCK_RDM
701 socket.SOCK_SEQPACKET
702 socket.SOL_SOCKET
703 socket.SO_REUSEADDR
704
Guido van Rossum654c11e2002-06-13 20:24:17 +0000705 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000706 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000707 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000708 try:
709 ip = socket.gethostbyname(hostname)
710 except socket.error:
711 # Probably name lookup wasn't set up right; skip this test
712 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000713 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000714 try:
715 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
716 except socket.error:
717 # Probably a similar problem as above; skip this test
718 return
Brett Cannon01668a12005-03-11 00:04:17 +0000719 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000720 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000721 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000722 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000723
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000724 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
725 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
726 def test_sethostname(self):
727 oldhn = socket.gethostname()
728 try:
729 socket.sethostname('new')
730 except socket.error as e:
731 if e.errno == errno.EPERM:
732 self.skipTest("test should be run as root")
733 else:
734 raise
735 try:
736 # running test as root!
737 self.assertEqual(socket.gethostname(), 'new')
738 # Should work with bytes objects too
739 socket.sethostname(b'bar')
740 self.assertEqual(socket.gethostname(), 'bar')
741 finally:
742 socket.sethostname(oldhn)
743
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700744 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
745 'socket.if_nameindex() not available.')
746 def testInterfaceNameIndex(self):
747 interfaces = socket.if_nameindex()
748 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200749 self.assertIsInstance(index, int)
750 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700751 # interface indices are non-zero integers
752 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200753 _index = socket.if_nametoindex(name)
754 self.assertIsInstance(_index, int)
755 self.assertEqual(index, _index)
756 _name = socket.if_indextoname(index)
757 self.assertIsInstance(_name, str)
758 self.assertEqual(name, _name)
759
760 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
761 'socket.if_nameindex() not available.')
762 def testInvalidInterfaceNameIndex(self):
763 # test nonexistent interface index/name
764 self.assertRaises(socket.error, socket.if_indextoname, 0)
765 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
766 # test with invalid values
767 self.assertRaises(TypeError, socket.if_nametoindex, 0)
768 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700769
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000770 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000771 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000772 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773 try:
774 # On some versions, this loses a reference
775 orig = sys.getrefcount(__name__)
776 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000777 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000778 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000780
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000782 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783 try:
784 # On some versions, this crashes the interpreter.
785 socket.getnameinfo(('x', 0, 0, 0), 0)
786 except socket.error:
787 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000788
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000789 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000790 # This just checks that htons etc. are their own inverse,
791 # when looking at the lower 16 or 32 bits.
792 sizes = {socket.htonl: 32, socket.ntohl: 32,
793 socket.htons: 16, socket.ntohs: 16}
794 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000795 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000796 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
797 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000798
Guido van Rossuma2627af2002-09-14 00:58:46 +0000799 swapped = func(mask)
800 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000801 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000802
Guido van Rossum018919a2007-01-15 00:07:32 +0000803 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000804 good_values = [ 1, 2, 3, 1, 2, 3 ]
805 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000806 for k in good_values:
807 socket.ntohl(k)
808 socket.ntohs(k)
809 socket.htonl(k)
810 socket.htons(k)
811 for k in bad_values:
812 self.assertRaises(OverflowError, socket.ntohl, k)
813 self.assertRaises(OverflowError, socket.ntohs, k)
814 self.assertRaises(OverflowError, socket.htonl, k)
815 self.assertRaises(OverflowError, socket.htons, k)
816
Barry Warsaw11b91a02004-06-28 00:50:43 +0000817 def testGetServBy(self):
818 eq = self.assertEqual
819 # Find one service that exists, then check all the related interfaces.
820 # I've ordered this by protocols that have both a tcp and udp
821 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200822 if (sys.platform.startswith(('freebsd', 'netbsd'))
823 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000824 # avoid the 'echo' service on this platform, as there is an
825 # assumption breaking non-standard port/protocol entry
826 services = ('daytime', 'qotd', 'domain')
827 else:
828 services = ('echo', 'daytime', 'domain')
829 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000830 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000831 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000832 break
833 except socket.error:
834 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000835 else:
836 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000837 # Try same call with optional protocol omitted
838 port2 = socket.getservbyname(service)
839 eq(port, port2)
840 # Try udp, but don't barf it it doesn't exist
841 try:
842 udpport = socket.getservbyname(service, 'udp')
843 except socket.error:
844 udpport = None
845 else:
846 eq(udpport, port)
847 # Now make sure the lookup by port returns the same service name
848 eq(socket.getservbyport(port2), service)
849 eq(socket.getservbyport(port, 'tcp'), service)
850 if udpport is not None:
851 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000852 # Make sure getservbyport does not accept out of range ports.
853 self.assertRaises(OverflowError, socket.getservbyport, -1)
854 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000856 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000857 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000858 # The default timeout should initially be None
859 self.assertEqual(socket.getdefaulttimeout(), None)
860 s = socket.socket()
861 self.assertEqual(s.gettimeout(), None)
862 s.close()
863
864 # Set the default timeout to 10, and see if it propagates
865 socket.setdefaulttimeout(10)
866 self.assertEqual(socket.getdefaulttimeout(), 10)
867 s = socket.socket()
868 self.assertEqual(s.gettimeout(), 10)
869 s.close()
870
871 # Reset the default timeout to None, and see if it propagates
872 socket.setdefaulttimeout(None)
873 self.assertEqual(socket.getdefaulttimeout(), None)
874 s = socket.socket()
875 self.assertEqual(s.gettimeout(), None)
876 s.close()
877
878 # Check that setting it to an invalid value raises ValueError
879 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
880
881 # Check that setting it to an invalid type raises TypeError
882 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
883
Benjamin Petersonf91df042009-02-13 02:50:59 +0000884 def testIPv4_inet_aton_fourbytes(self):
885 if not hasattr(socket, 'inet_aton'):
886 return # No inet_aton, nothing to check
887 # Test that issue1008086 and issue767150 are fixed.
888 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000889 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
890 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000891
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000892 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000893 if not hasattr(socket, 'inet_pton'):
894 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000895 from socket import inet_aton as f, inet_pton, AF_INET
896 g = lambda a: inet_pton(AF_INET, a)
897
Ezio Melottib3aedd42010-11-20 19:04:17 +0000898 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
899 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
900 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
901 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
902 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000903
Ezio Melottib3aedd42010-11-20 19:04:17 +0000904 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
905 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
906 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
907 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000908
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000909 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000910 if not hasattr(socket, 'inet_pton'):
911 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000912 try:
913 from socket import inet_pton, AF_INET6, has_ipv6
914 if not has_ipv6:
915 return
916 except ImportError:
917 return
918 f = lambda a: inet_pton(AF_INET6, a)
919
Ezio Melottib3aedd42010-11-20 19:04:17 +0000920 self.assertEqual(b'\x00' * 16, f('::'))
921 self.assertEqual(b'\x00' * 16, f('0::0'))
922 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
923 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000924 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 +0000925 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
926 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000927
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000928 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000929 if not hasattr(socket, 'inet_ntop'):
930 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000931 from socket import inet_ntoa as f, inet_ntop, AF_INET
932 g = lambda a: inet_ntop(AF_INET, a)
933
Ezio Melottib3aedd42010-11-20 19:04:17 +0000934 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
935 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
936 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
937 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000938
Ezio Melottib3aedd42010-11-20 19:04:17 +0000939 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
940 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
941 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000942
943 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000944 if not hasattr(socket, 'inet_ntop'):
945 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000946 try:
947 from socket import inet_ntop, AF_INET6, has_ipv6
948 if not has_ipv6:
949 return
950 except ImportError:
951 return
952 f = lambda a: inet_ntop(AF_INET6, a)
953
Ezio Melottib3aedd42010-11-20 19:04:17 +0000954 self.assertEqual('::', f(b'\x00' * 16))
955 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
956 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000957 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000958 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 +0000959 )
960
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000961 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000962
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000963 def testSockName(self):
964 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200965 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000966 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000967 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000968 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000969 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000970 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
971 # it reasonable to get the host's addr in addition to 0.0.0.0.
972 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000973 try:
974 my_ip_addr = socket.gethostbyname(socket.gethostname())
975 except socket.error:
976 # Probably name lookup wasn't set up right; skip this test
977 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000978 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000979 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000980
981 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000982 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000983 # We know a socket should start without reuse==0
984 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000985 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000987 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000988
989 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000990 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000991 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000992 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000993 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
994 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000995 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000996
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000997 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000998 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000999 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1000 sock.settimeout(1)
1001 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001002 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001003
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001004 def testNewAttributes(self):
1005 # testing .family, .type and .protocol
1006 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1007 self.assertEqual(sock.family, socket.AF_INET)
1008 self.assertEqual(sock.type, socket.SOCK_STREAM)
1009 self.assertEqual(sock.proto, 0)
1010 sock.close()
1011
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001012 def test_getsockaddrarg(self):
1013 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001014 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001015 big_port = port + 65536
1016 neg_port = port - 65536
1017 sock = socket.socket()
1018 try:
1019 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1020 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1021 sock.bind((host, port))
1022 finally:
1023 sock.close()
1024
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001025 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001026 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001027 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1028 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1029 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1030 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001031 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1032 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001033 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001034 self.assertRaises(ValueError, s.ioctl, -1, None)
1035 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001036
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001037 def testGetaddrinfo(self):
1038 try:
1039 socket.getaddrinfo('localhost', 80)
1040 except socket.gaierror as err:
1041 if err.errno == socket.EAI_SERVICE:
1042 # see http://bugs.python.org/issue1282647
1043 self.skipTest("buggy libc version")
1044 raise
1045 # len of every sequence is supposed to be == 5
1046 for info in socket.getaddrinfo(HOST, None):
1047 self.assertEqual(len(info), 5)
1048 # host can be a domain name, a string representation of an
1049 # IPv4/v6 address or None
1050 socket.getaddrinfo('localhost', 80)
1051 socket.getaddrinfo('127.0.0.1', 80)
1052 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001053 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001054 socket.getaddrinfo('::1', 80)
1055 # port can be a string service name such as "http", a numeric
1056 # port number or None
1057 socket.getaddrinfo(HOST, "http")
1058 socket.getaddrinfo(HOST, 80)
1059 socket.getaddrinfo(HOST, None)
1060 # test family and socktype filters
1061 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1062 for family, _, _, _, _ in infos:
1063 self.assertEqual(family, socket.AF_INET)
1064 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1065 for _, socktype, _, _, _ in infos:
1066 self.assertEqual(socktype, socket.SOCK_STREAM)
1067 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001068 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001069 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1070 # a server willing to support both IPv4 and IPv6 will
1071 # usually do this
1072 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1073 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001074 # test keyword arguments
1075 a = socket.getaddrinfo(HOST, None)
1076 b = socket.getaddrinfo(host=HOST, port=None)
1077 self.assertEqual(a, b)
1078 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1079 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1080 self.assertEqual(a, b)
1081 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1082 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1083 self.assertEqual(a, b)
1084 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1085 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1086 self.assertEqual(a, b)
1087 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1088 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1089 self.assertEqual(a, b)
1090 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1091 socket.AI_PASSIVE)
1092 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1093 type=socket.SOCK_STREAM, proto=0,
1094 flags=socket.AI_PASSIVE)
1095 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001096 # Issue #6697.
1097 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001098
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001099 def test_getnameinfo(self):
1100 # only IP addresses are allowed
1101 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1102
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001103 @unittest.skipUnless(support.is_resource_enabled('network'),
1104 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001105 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +00001106 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001107 # these should all be successful
1108 socket.gethostbyname('испытание.python.org')
1109 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001110 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1111 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1112 # have a reverse entry yet
1113 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001114
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001115 def check_sendall_interrupted(self, with_timeout):
1116 # socketpair() is not stricly required, but it makes things easier.
1117 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1118 self.skipTest("signal.alarm and socket.socketpair required for this test")
1119 # Our signal handlers clobber the C errno by calling a math function
1120 # with an invalid domain value.
1121 def ok_handler(*args):
1122 self.assertRaises(ValueError, math.acosh, 0)
1123 def raising_handler(*args):
1124 self.assertRaises(ValueError, math.acosh, 0)
1125 1 // 0
1126 c, s = socket.socketpair()
1127 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1128 try:
1129 if with_timeout:
1130 # Just above the one second minimum for signal.alarm
1131 c.settimeout(1.5)
1132 with self.assertRaises(ZeroDivisionError):
1133 signal.alarm(1)
1134 c.sendall(b"x" * (1024**2))
1135 if with_timeout:
1136 signal.signal(signal.SIGALRM, ok_handler)
1137 signal.alarm(1)
1138 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1139 finally:
1140 signal.signal(signal.SIGALRM, old_alarm)
1141 c.close()
1142 s.close()
1143
1144 def test_sendall_interrupted(self):
1145 self.check_sendall_interrupted(False)
1146
1147 def test_sendall_interrupted_with_timeout(self):
1148 self.check_sendall_interrupted(True)
1149
Antoine Pitroue033e062010-10-29 10:38:18 +00001150 def test_dealloc_warn(self):
1151 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1152 r = repr(sock)
1153 with self.assertWarns(ResourceWarning) as cm:
1154 sock = None
1155 support.gc_collect()
1156 self.assertIn(r, str(cm.warning.args[0]))
1157 # An open socket file object gets dereferenced after the socket
1158 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1159 f = sock.makefile('rb')
1160 r = repr(sock)
1161 sock = None
1162 support.gc_collect()
1163 with self.assertWarns(ResourceWarning):
1164 f = None
1165 support.gc_collect()
1166
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001167 def test_name_closed_socketio(self):
1168 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1169 fp = sock.makefile("rb")
1170 fp.close()
1171 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1172
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001173 def test_pickle(self):
1174 sock = socket.socket()
1175 with sock:
1176 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1177 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1178
Antoine Pitrou3cade992011-05-10 19:19:13 +02001179 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001180 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1181 srv.bind((HOST, 0))
1182 # backlog = 0
1183 srv.listen(0)
1184 srv.close()
1185
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001186
Charles-François Natali47413c12011-10-06 19:47:44 +02001187@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1188class BasicCANTest(unittest.TestCase):
1189
1190 def testCrucialConstants(self):
1191 socket.AF_CAN
1192 socket.PF_CAN
1193 socket.CAN_RAW
1194
1195 def testCreateSocket(self):
1196 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1197 pass
1198
1199 def testBindAny(self):
1200 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1201 s.bind(('', ))
1202
1203 def testTooLongInterfaceName(self):
1204 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1205 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001206 self.assertRaisesRegex(socket.error, 'interface name too long',
1207 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001208
1209 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1210 'socket.CAN_RAW_LOOPBACK required for this test.')
1211 def testLoopback(self):
1212 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1213 for loopback in (0, 1):
1214 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1215 loopback)
1216 self.assertEqual(loopback,
1217 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1218
1219 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1220 'socket.CAN_RAW_FILTER required for this test.')
1221 def testFilter(self):
1222 can_id, can_mask = 0x200, 0x700
1223 can_filter = struct.pack("=II", can_id, can_mask)
1224 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1225 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1226 self.assertEqual(can_filter,
1227 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1228
1229
1230@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1231@unittest.skipUnless(thread, 'Threading required for this test.')
1232class CANTest(ThreadedCANSocketTest):
1233
1234 """The CAN frame structure is defined in <linux/can.h>:
1235
1236 struct can_frame {
1237 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1238 __u8 can_dlc; /* data length code: 0 .. 8 */
1239 __u8 data[8] __attribute__((aligned(8)));
1240 };
1241 """
1242 can_frame_fmt = "=IB3x8s"
1243
1244 def __init__(self, methodName='runTest'):
1245 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1246
1247 @classmethod
1248 def build_can_frame(cls, can_id, data):
1249 """Build a CAN frame."""
1250 can_dlc = len(data)
1251 data = data.ljust(8, b'\x00')
1252 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1253
1254 @classmethod
1255 def dissect_can_frame(cls, frame):
1256 """Dissect a CAN frame."""
1257 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1258 return (can_id, can_dlc, data[:can_dlc])
1259
1260 def testSendFrame(self):
1261 cf, addr = self.s.recvfrom(self.bufsize)
1262 self.assertEqual(self.cf, cf)
1263 self.assertEqual(addr[0], self.interface)
1264 self.assertEqual(addr[1], socket.AF_CAN)
1265
1266 def _testSendFrame(self):
1267 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1268 self.cli.send(self.cf)
1269
1270 def testSendMaxFrame(self):
1271 cf, addr = self.s.recvfrom(self.bufsize)
1272 self.assertEqual(self.cf, cf)
1273
1274 def _testSendMaxFrame(self):
1275 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1276 self.cli.send(self.cf)
1277
1278 def testSendMultiFrames(self):
1279 cf, addr = self.s.recvfrom(self.bufsize)
1280 self.assertEqual(self.cf1, cf)
1281
1282 cf, addr = self.s.recvfrom(self.bufsize)
1283 self.assertEqual(self.cf2, cf)
1284
1285 def _testSendMultiFrames(self):
1286 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1287 self.cli.send(self.cf1)
1288
1289 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1290 self.cli.send(self.cf2)
1291
1292
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001293@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1294class BasicRDSTest(unittest.TestCase):
1295
1296 def testCrucialConstants(self):
1297 socket.AF_RDS
1298 socket.PF_RDS
1299
1300 def testCreateSocket(self):
1301 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1302 pass
1303
1304 def testSocketBufferSize(self):
1305 bufsize = 16384
1306 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1307 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1308 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1309
1310
1311@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1312@unittest.skipUnless(thread, 'Threading required for this test.')
1313class RDSTest(ThreadedRDSSocketTest):
1314
1315 def __init__(self, methodName='runTest'):
1316 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1317
Charles-François Natali240c55f2011-11-10 20:33:36 +01001318 def setUp(self):
1319 super().setUp()
1320 self.evt = threading.Event()
1321
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001322 def testSendAndRecv(self):
1323 data, addr = self.serv.recvfrom(self.bufsize)
1324 self.assertEqual(self.data, data)
1325 self.assertEqual(self.cli_addr, addr)
1326
1327 def _testSendAndRecv(self):
1328 self.data = b'spam'
1329 self.cli.sendto(self.data, 0, (HOST, self.port))
1330
1331 def testPeek(self):
1332 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1333 self.assertEqual(self.data, data)
1334 data, addr = self.serv.recvfrom(self.bufsize)
1335 self.assertEqual(self.data, data)
1336
1337 def _testPeek(self):
1338 self.data = b'spam'
1339 self.cli.sendto(self.data, 0, (HOST, self.port))
1340
1341 @requireAttrs(socket.socket, 'recvmsg')
1342 def testSendAndRecvMsg(self):
1343 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1344 self.assertEqual(self.data, data)
1345
1346 @requireAttrs(socket.socket, 'sendmsg')
1347 def _testSendAndRecvMsg(self):
1348 self.data = b'hello ' * 10
1349 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1350
1351 def testSendAndRecvMulti(self):
1352 data, addr = self.serv.recvfrom(self.bufsize)
1353 self.assertEqual(self.data1, data)
1354
1355 data, addr = self.serv.recvfrom(self.bufsize)
1356 self.assertEqual(self.data2, data)
1357
1358 def _testSendAndRecvMulti(self):
1359 self.data1 = b'bacon'
1360 self.cli.sendto(self.data1, 0, (HOST, self.port))
1361
1362 self.data2 = b'egg'
1363 self.cli.sendto(self.data2, 0, (HOST, self.port))
1364
1365 def testSelect(self):
1366 r, w, x = select.select([self.serv], [], [], 3.0)
1367 self.assertIn(self.serv, r)
1368 data, addr = self.serv.recvfrom(self.bufsize)
1369 self.assertEqual(self.data, data)
1370
1371 def _testSelect(self):
1372 self.data = b'select'
1373 self.cli.sendto(self.data, 0, (HOST, self.port))
1374
1375 def testCongestion(self):
1376 # wait until the sender is done
1377 self.evt.wait()
1378
1379 def _testCongestion(self):
1380 # test the behavior in case of congestion
1381 self.data = b'fill'
1382 self.cli.setblocking(False)
1383 try:
1384 # try to lower the receiver's socket buffer size
1385 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1386 except OSError:
1387 pass
1388 with self.assertRaises(OSError) as cm:
1389 try:
1390 # fill the receiver's socket buffer
1391 while True:
1392 self.cli.sendto(self.data, 0, (HOST, self.port))
1393 finally:
1394 # signal the receiver we're done
1395 self.evt.set()
1396 # sendto() should have failed with ENOBUFS
1397 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1398 # and we should have received a congestion notification through poll
1399 r, w, x = select.select([self.serv], [], [], 3.0)
1400 self.assertIn(self.serv, r)
1401
1402
Victor Stinner45df8202010-04-28 22:31:17 +00001403@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001404class BasicTCPTest(SocketConnectedTest):
1405
1406 def __init__(self, methodName='runTest'):
1407 SocketConnectedTest.__init__(self, methodName=methodName)
1408
1409 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001410 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001411 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001412 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001413
1414 def _testRecv(self):
1415 self.serv_conn.send(MSG)
1416
1417 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001418 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001419 seg1 = self.cli_conn.recv(len(MSG) - 3)
1420 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001421 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001422 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001423
1424 def _testOverFlowRecv(self):
1425 self.serv_conn.send(MSG)
1426
1427 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001428 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001429 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001430 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001431
1432 def _testRecvFrom(self):
1433 self.serv_conn.send(MSG)
1434
1435 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001436 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001437 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1438 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001439 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001440 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001441
1442 def _testOverFlowRecvFrom(self):
1443 self.serv_conn.send(MSG)
1444
1445 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001446 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001447 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001448 while 1:
1449 read = self.cli_conn.recv(1024)
1450 if not read:
1451 break
Guido van Rossume531e292002-08-08 20:28:34 +00001452 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001453 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001454
1455 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001456 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001457 self.serv_conn.sendall(big_chunk)
1458
1459 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001460 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001461 fd = self.cli_conn.fileno()
1462 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001463 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001464 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001465 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001466 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001467
1468 def _testFromFd(self):
1469 self.serv_conn.send(MSG)
1470
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001471 def testDup(self):
1472 # Testing dup()
1473 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001474 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001475 msg = sock.recv(1024)
1476 self.assertEqual(msg, MSG)
1477
1478 def _testDup(self):
1479 self.serv_conn.send(MSG)
1480
Guido van Rossum24e4af82002-06-12 19:18:08 +00001481 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001482 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001483 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001484 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001485 # wait for _testShutdown to finish: on OS X, when the server
1486 # closes the connection the client also becomes disconnected,
1487 # and the client's shutdown call will fail. (Issue #4397.)
1488 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001489
1490 def _testShutdown(self):
1491 self.serv_conn.send(MSG)
1492 self.serv_conn.shutdown(2)
1493
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001494 def testDetach(self):
1495 # Testing detach()
1496 fileno = self.cli_conn.fileno()
1497 f = self.cli_conn.detach()
1498 self.assertEqual(f, fileno)
1499 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001500 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1501 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001502 # ...but we can create another socket using the (still open)
1503 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001504 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001505 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001506 msg = sock.recv(1024)
1507 self.assertEqual(msg, MSG)
1508
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001509 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001510 self.serv_conn.send(MSG)
1511
Victor Stinner45df8202010-04-28 22:31:17 +00001512@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001513class BasicUDPTest(ThreadedUDPSocketTest):
1514
1515 def __init__(self, methodName='runTest'):
1516 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1517
1518 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001519 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001520 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001521 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001522
1523 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001524 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001525
Guido van Rossum1c938012002-06-12 21:17:20 +00001526 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001527 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001528 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001529 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001530
Guido van Rossum1c938012002-06-12 21:17:20 +00001531 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001532 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001533
Guido van Rossumd8faa362007-04-27 19:54:29 +00001534 def testRecvFromNegative(self):
1535 # Negative lengths passed to recvfrom should give ValueError.
1536 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1537
1538 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001539 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001540
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001541
1542# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1543# same test code is used with different families and types of socket
1544# (e.g. stream, datagram), and tests using recvmsg() are repeated
1545# using recvmsg_into().
1546#
1547# The generic test classes such as SendmsgTests and
1548# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1549# supplied with sockets cli_sock and serv_sock representing the
1550# client's and the server's end of the connection respectively, and
1551# attributes cli_addr and serv_addr holding their (numeric where
1552# appropriate) addresses.
1553#
1554# The final concrete test classes combine these with subclasses of
1555# SocketTestBase which set up client and server sockets of a specific
1556# type, and with subclasses of SendrecvmsgBase such as
1557# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1558# sockets to cli_sock and serv_sock and override the methods and
1559# attributes of SendrecvmsgBase to fill in destination addresses if
1560# needed when sending, check for specific flags in msg_flags, etc.
1561#
1562# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1563# recvmsg_into().
1564
1565# XXX: like the other datagram (UDP) tests in this module, the code
1566# here assumes that datagram delivery on the local machine will be
1567# reliable.
1568
1569class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1570 # Base class for sendmsg()/recvmsg() tests.
1571
1572 # Time in seconds to wait before considering a test failed, or
1573 # None for no timeout. Not all tests actually set a timeout.
1574 fail_timeout = 3.0
1575
1576 def setUp(self):
1577 self.misc_event = threading.Event()
1578 super().setUp()
1579
1580 def sendToServer(self, msg):
1581 # Send msg to the server.
1582 return self.cli_sock.send(msg)
1583
1584 # Tuple of alternative default arguments for sendmsg() when called
1585 # via sendmsgToServer() (e.g. to include a destination address).
1586 sendmsg_to_server_defaults = ()
1587
1588 def sendmsgToServer(self, *args):
1589 # Call sendmsg() on self.cli_sock with the given arguments,
1590 # filling in any arguments which are not supplied with the
1591 # corresponding items of self.sendmsg_to_server_defaults, if
1592 # any.
1593 return self.cli_sock.sendmsg(
1594 *(args + self.sendmsg_to_server_defaults[len(args):]))
1595
1596 def doRecvmsg(self, sock, bufsize, *args):
1597 # Call recvmsg() on sock with given arguments and return its
1598 # result. Should be used for tests which can use either
1599 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1600 # this method with one which emulates it using recvmsg_into(),
1601 # thus allowing the same test to be used for both methods.
1602 result = sock.recvmsg(bufsize, *args)
1603 self.registerRecvmsgResult(result)
1604 return result
1605
1606 def registerRecvmsgResult(self, result):
1607 # Called by doRecvmsg() with the return value of recvmsg() or
1608 # recvmsg_into(). Can be overridden to arrange cleanup based
1609 # on the returned ancillary data, for instance.
1610 pass
1611
1612 def checkRecvmsgAddress(self, addr1, addr2):
1613 # Called to compare the received address with the address of
1614 # the peer.
1615 self.assertEqual(addr1, addr2)
1616
1617 # Flags that are normally unset in msg_flags
1618 msg_flags_common_unset = 0
1619 for name in ("MSG_CTRUNC", "MSG_OOB"):
1620 msg_flags_common_unset |= getattr(socket, name, 0)
1621
1622 # Flags that are normally set
1623 msg_flags_common_set = 0
1624
1625 # Flags set when a complete record has been received (e.g. MSG_EOR
1626 # for SCTP)
1627 msg_flags_eor_indicator = 0
1628
1629 # Flags set when a complete record has not been received
1630 # (e.g. MSG_TRUNC for datagram sockets)
1631 msg_flags_non_eor_indicator = 0
1632
1633 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1634 # Method to check the value of msg_flags returned by recvmsg[_into]().
1635 #
1636 # Checks that all bits in msg_flags_common_set attribute are
1637 # set in "flags" and all bits in msg_flags_common_unset are
1638 # unset.
1639 #
1640 # The "eor" argument specifies whether the flags should
1641 # indicate that a full record (or datagram) has been received.
1642 # If "eor" is None, no checks are done; otherwise, checks
1643 # that:
1644 #
1645 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1646 # set and all bits in msg_flags_non_eor_indicator are unset
1647 #
1648 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1649 # are set and all bits in msg_flags_eor_indicator are unset
1650 #
1651 # If "checkset" and/or "checkunset" are supplied, they require
1652 # the given bits to be set or unset respectively, overriding
1653 # what the attributes require for those bits.
1654 #
1655 # If any bits are set in "ignore", they will not be checked,
1656 # regardless of the other inputs.
1657 #
1658 # Will raise Exception if the inputs require a bit to be both
1659 # set and unset, and it is not ignored.
1660
1661 defaultset = self.msg_flags_common_set
1662 defaultunset = self.msg_flags_common_unset
1663
1664 if eor:
1665 defaultset |= self.msg_flags_eor_indicator
1666 defaultunset |= self.msg_flags_non_eor_indicator
1667 elif eor is not None:
1668 defaultset |= self.msg_flags_non_eor_indicator
1669 defaultunset |= self.msg_flags_eor_indicator
1670
1671 # Function arguments override defaults
1672 defaultset &= ~checkunset
1673 defaultunset &= ~checkset
1674
1675 # Merge arguments with remaining defaults, and check for conflicts
1676 checkset |= defaultset
1677 checkunset |= defaultunset
1678 inboth = checkset & checkunset & ~ignore
1679 if inboth:
1680 raise Exception("contradictory set, unset requirements for flags "
1681 "{0:#x}".format(inboth))
1682
1683 # Compare with given msg_flags value
1684 mask = (checkset | checkunset) & ~ignore
1685 self.assertEqual(flags & mask, checkset & mask)
1686
1687
1688class RecvmsgIntoMixin(SendrecvmsgBase):
1689 # Mixin to implement doRecvmsg() using recvmsg_into().
1690
1691 def doRecvmsg(self, sock, bufsize, *args):
1692 buf = bytearray(bufsize)
1693 result = sock.recvmsg_into([buf], *args)
1694 self.registerRecvmsgResult(result)
1695 self.assertGreaterEqual(result[0], 0)
1696 self.assertLessEqual(result[0], bufsize)
1697 return (bytes(buf[:result[0]]),) + result[1:]
1698
1699
1700class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1701 # Defines flags to be checked in msg_flags for datagram sockets.
1702
1703 @property
1704 def msg_flags_non_eor_indicator(self):
1705 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1706
1707
1708class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1709 # Defines flags to be checked in msg_flags for SCTP sockets.
1710
1711 @property
1712 def msg_flags_eor_indicator(self):
1713 return super().msg_flags_eor_indicator | socket.MSG_EOR
1714
1715
1716class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1717 # Base class for tests on connectionless-mode sockets. Users must
1718 # supply sockets on attributes cli and serv to be mapped to
1719 # cli_sock and serv_sock respectively.
1720
1721 @property
1722 def serv_sock(self):
1723 return self.serv
1724
1725 @property
1726 def cli_sock(self):
1727 return self.cli
1728
1729 @property
1730 def sendmsg_to_server_defaults(self):
1731 return ([], [], 0, self.serv_addr)
1732
1733 def sendToServer(self, msg):
1734 return self.cli_sock.sendto(msg, self.serv_addr)
1735
1736
1737class SendrecvmsgConnectedBase(SendrecvmsgBase):
1738 # Base class for tests on connected sockets. Users must supply
1739 # sockets on attributes serv_conn and cli_conn (representing the
1740 # connections *to* the server and the client), to be mapped to
1741 # cli_sock and serv_sock respectively.
1742
1743 @property
1744 def serv_sock(self):
1745 return self.cli_conn
1746
1747 @property
1748 def cli_sock(self):
1749 return self.serv_conn
1750
1751 def checkRecvmsgAddress(self, addr1, addr2):
1752 # Address is currently "unspecified" for a connected socket,
1753 # so we don't examine it
1754 pass
1755
1756
1757class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1758 # Base class to set a timeout on server's socket.
1759
1760 def setUp(self):
1761 super().setUp()
1762 self.serv_sock.settimeout(self.fail_timeout)
1763
1764
1765class SendmsgTests(SendrecvmsgServerTimeoutBase):
1766 # Tests for sendmsg() which can use any socket type and do not
1767 # involve recvmsg() or recvmsg_into().
1768
1769 def testSendmsg(self):
1770 # Send a simple message with sendmsg().
1771 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1772
1773 def _testSendmsg(self):
1774 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1775
1776 def testSendmsgDataGenerator(self):
1777 # Send from buffer obtained from a generator (not a sequence).
1778 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1779
1780 def _testSendmsgDataGenerator(self):
1781 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1782 len(MSG))
1783
1784 def testSendmsgAncillaryGenerator(self):
1785 # Gather (empty) ancillary data from a generator.
1786 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1787
1788 def _testSendmsgAncillaryGenerator(self):
1789 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1790 len(MSG))
1791
1792 def testSendmsgArray(self):
1793 # Send data from an array instead of the usual bytes object.
1794 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1795
1796 def _testSendmsgArray(self):
1797 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1798 len(MSG))
1799
1800 def testSendmsgGather(self):
1801 # Send message data from more than one buffer (gather write).
1802 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1803
1804 def _testSendmsgGather(self):
1805 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1806
1807 def testSendmsgBadArgs(self):
1808 # Check that sendmsg() rejects invalid arguments.
1809 self.assertEqual(self.serv_sock.recv(1000), b"done")
1810
1811 def _testSendmsgBadArgs(self):
1812 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1813 self.assertRaises(TypeError, self.sendmsgToServer,
1814 b"not in an iterable")
1815 self.assertRaises(TypeError, self.sendmsgToServer,
1816 object())
1817 self.assertRaises(TypeError, self.sendmsgToServer,
1818 [object()])
1819 self.assertRaises(TypeError, self.sendmsgToServer,
1820 [MSG, object()])
1821 self.assertRaises(TypeError, self.sendmsgToServer,
1822 [MSG], object())
1823 self.assertRaises(TypeError, self.sendmsgToServer,
1824 [MSG], [], object())
1825 self.assertRaises(TypeError, self.sendmsgToServer,
1826 [MSG], [], 0, object())
1827 self.sendToServer(b"done")
1828
1829 def testSendmsgBadCmsg(self):
1830 # Check that invalid ancillary data items are rejected.
1831 self.assertEqual(self.serv_sock.recv(1000), b"done")
1832
1833 def _testSendmsgBadCmsg(self):
1834 self.assertRaises(TypeError, self.sendmsgToServer,
1835 [MSG], [object()])
1836 self.assertRaises(TypeError, self.sendmsgToServer,
1837 [MSG], [(object(), 0, b"data")])
1838 self.assertRaises(TypeError, self.sendmsgToServer,
1839 [MSG], [(0, object(), b"data")])
1840 self.assertRaises(TypeError, self.sendmsgToServer,
1841 [MSG], [(0, 0, object())])
1842 self.assertRaises(TypeError, self.sendmsgToServer,
1843 [MSG], [(0, 0)])
1844 self.assertRaises(TypeError, self.sendmsgToServer,
1845 [MSG], [(0, 0, b"data", 42)])
1846 self.sendToServer(b"done")
1847
1848 @requireAttrs(socket, "CMSG_SPACE")
1849 def testSendmsgBadMultiCmsg(self):
1850 # Check that invalid ancillary data items are rejected when
1851 # more than one item is present.
1852 self.assertEqual(self.serv_sock.recv(1000), b"done")
1853
1854 @testSendmsgBadMultiCmsg.client_skip
1855 def _testSendmsgBadMultiCmsg(self):
1856 self.assertRaises(TypeError, self.sendmsgToServer,
1857 [MSG], [0, 0, b""])
1858 self.assertRaises(TypeError, self.sendmsgToServer,
1859 [MSG], [(0, 0, b""), object()])
1860 self.sendToServer(b"done")
1861
1862 def testSendmsgExcessCmsgReject(self):
1863 # Check that sendmsg() rejects excess ancillary data items
1864 # when the number that can be sent is limited.
1865 self.assertEqual(self.serv_sock.recv(1000), b"done")
1866
1867 def _testSendmsgExcessCmsgReject(self):
1868 if not hasattr(socket, "CMSG_SPACE"):
1869 # Can only send one item
1870 with self.assertRaises(socket.error) as cm:
1871 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1872 self.assertIsNone(cm.exception.errno)
1873 self.sendToServer(b"done")
1874
1875 def testSendmsgAfterClose(self):
1876 # Check that sendmsg() fails on a closed socket.
1877 pass
1878
1879 def _testSendmsgAfterClose(self):
1880 self.cli_sock.close()
1881 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1882
1883
1884class SendmsgStreamTests(SendmsgTests):
1885 # Tests for sendmsg() which require a stream socket and do not
1886 # involve recvmsg() or recvmsg_into().
1887
1888 def testSendmsgExplicitNoneAddr(self):
1889 # Check that peer address can be specified as None.
1890 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1891
1892 def _testSendmsgExplicitNoneAddr(self):
1893 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1894
1895 def testSendmsgTimeout(self):
1896 # Check that timeout works with sendmsg().
1897 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1898 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1899
1900 def _testSendmsgTimeout(self):
1901 try:
1902 self.cli_sock.settimeout(0.03)
1903 with self.assertRaises(socket.timeout):
1904 while True:
1905 self.sendmsgToServer([b"a"*512])
1906 finally:
1907 self.misc_event.set()
1908
1909 # XXX: would be nice to have more tests for sendmsg flags argument.
1910
1911 # Linux supports MSG_DONTWAIT when sending, but in general, it
1912 # only works when receiving. Could add other platforms if they
1913 # support it too.
1914 @skipWithClientIf(sys.platform not in {"linux2"},
1915 "MSG_DONTWAIT not known to work on this platform when "
1916 "sending")
1917 def testSendmsgDontWait(self):
1918 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1919 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1920 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1921
1922 @testSendmsgDontWait.client_skip
1923 def _testSendmsgDontWait(self):
1924 try:
1925 with self.assertRaises(socket.error) as cm:
1926 while True:
1927 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1928 self.assertIn(cm.exception.errno,
1929 (errno.EAGAIN, errno.EWOULDBLOCK))
1930 finally:
1931 self.misc_event.set()
1932
1933
1934class SendmsgConnectionlessTests(SendmsgTests):
1935 # Tests for sendmsg() which require a connectionless-mode
1936 # (e.g. datagram) socket, and do not involve recvmsg() or
1937 # recvmsg_into().
1938
1939 def testSendmsgNoDestAddr(self):
1940 # Check that sendmsg() fails when no destination address is
1941 # given for unconnected socket.
1942 pass
1943
1944 def _testSendmsgNoDestAddr(self):
1945 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1946 [MSG])
1947 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1948 [MSG], [], 0, None)
1949
1950
1951class RecvmsgGenericTests(SendrecvmsgBase):
1952 # Tests for recvmsg() which can also be emulated using
1953 # recvmsg_into(), and can use any socket type.
1954
1955 def testRecvmsg(self):
1956 # Receive a simple message with recvmsg[_into]().
1957 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1958 self.assertEqual(msg, MSG)
1959 self.checkRecvmsgAddress(addr, self.cli_addr)
1960 self.assertEqual(ancdata, [])
1961 self.checkFlags(flags, eor=True)
1962
1963 def _testRecvmsg(self):
1964 self.sendToServer(MSG)
1965
1966 def testRecvmsgExplicitDefaults(self):
1967 # Test recvmsg[_into]() with default arguments provided explicitly.
1968 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1969 len(MSG), 0, 0)
1970 self.assertEqual(msg, MSG)
1971 self.checkRecvmsgAddress(addr, self.cli_addr)
1972 self.assertEqual(ancdata, [])
1973 self.checkFlags(flags, eor=True)
1974
1975 def _testRecvmsgExplicitDefaults(self):
1976 self.sendToServer(MSG)
1977
1978 def testRecvmsgShorter(self):
1979 # Receive a message smaller than buffer.
1980 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1981 len(MSG) + 42)
1982 self.assertEqual(msg, MSG)
1983 self.checkRecvmsgAddress(addr, self.cli_addr)
1984 self.assertEqual(ancdata, [])
1985 self.checkFlags(flags, eor=True)
1986
1987 def _testRecvmsgShorter(self):
1988 self.sendToServer(MSG)
1989
Charles-François Natali8619cd72011-10-03 19:43:15 +02001990 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
1991 # datagram is received (issue #13001).
1992 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001993 def testRecvmsgTrunc(self):
1994 # Receive part of message, check for truncation indicators.
1995 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1996 len(MSG) - 3)
1997 self.assertEqual(msg, MSG[:-3])
1998 self.checkRecvmsgAddress(addr, self.cli_addr)
1999 self.assertEqual(ancdata, [])
2000 self.checkFlags(flags, eor=False)
2001
Charles-François Natali8619cd72011-10-03 19:43:15 +02002002 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002003 def _testRecvmsgTrunc(self):
2004 self.sendToServer(MSG)
2005
2006 def testRecvmsgShortAncillaryBuf(self):
2007 # Test ancillary data buffer too small to hold any ancillary data.
2008 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2009 len(MSG), 1)
2010 self.assertEqual(msg, MSG)
2011 self.checkRecvmsgAddress(addr, self.cli_addr)
2012 self.assertEqual(ancdata, [])
2013 self.checkFlags(flags, eor=True)
2014
2015 def _testRecvmsgShortAncillaryBuf(self):
2016 self.sendToServer(MSG)
2017
2018 def testRecvmsgLongAncillaryBuf(self):
2019 # Test large ancillary data buffer.
2020 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2021 len(MSG), 10240)
2022 self.assertEqual(msg, MSG)
2023 self.checkRecvmsgAddress(addr, self.cli_addr)
2024 self.assertEqual(ancdata, [])
2025 self.checkFlags(flags, eor=True)
2026
2027 def _testRecvmsgLongAncillaryBuf(self):
2028 self.sendToServer(MSG)
2029
2030 def testRecvmsgAfterClose(self):
2031 # Check that recvmsg[_into]() fails on a closed socket.
2032 self.serv_sock.close()
2033 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2034
2035 def _testRecvmsgAfterClose(self):
2036 pass
2037
2038 def testRecvmsgTimeout(self):
2039 # Check that timeout works.
2040 try:
2041 self.serv_sock.settimeout(0.03)
2042 self.assertRaises(socket.timeout,
2043 self.doRecvmsg, self.serv_sock, len(MSG))
2044 finally:
2045 self.misc_event.set()
2046
2047 def _testRecvmsgTimeout(self):
2048 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2049
2050 @requireAttrs(socket, "MSG_PEEK")
2051 def testRecvmsgPeek(self):
2052 # Check that MSG_PEEK in flags enables examination of pending
2053 # data without consuming it.
2054
2055 # Receive part of data with MSG_PEEK.
2056 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2057 len(MSG) - 3, 0,
2058 socket.MSG_PEEK)
2059 self.assertEqual(msg, MSG[:-3])
2060 self.checkRecvmsgAddress(addr, self.cli_addr)
2061 self.assertEqual(ancdata, [])
2062 # Ignoring MSG_TRUNC here (so this test is the same for stream
2063 # and datagram sockets). Some wording in POSIX seems to
2064 # suggest that it needn't be set when peeking, but that may
2065 # just be a slip.
2066 self.checkFlags(flags, eor=False,
2067 ignore=getattr(socket, "MSG_TRUNC", 0))
2068
2069 # Receive all data with MSG_PEEK.
2070 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2071 len(MSG), 0,
2072 socket.MSG_PEEK)
2073 self.assertEqual(msg, MSG)
2074 self.checkRecvmsgAddress(addr, self.cli_addr)
2075 self.assertEqual(ancdata, [])
2076 self.checkFlags(flags, eor=True)
2077
2078 # Check that the same data can still be received normally.
2079 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2080 self.assertEqual(msg, MSG)
2081 self.checkRecvmsgAddress(addr, self.cli_addr)
2082 self.assertEqual(ancdata, [])
2083 self.checkFlags(flags, eor=True)
2084
2085 @testRecvmsgPeek.client_skip
2086 def _testRecvmsgPeek(self):
2087 self.sendToServer(MSG)
2088
2089 @requireAttrs(socket.socket, "sendmsg")
2090 def testRecvmsgFromSendmsg(self):
2091 # Test receiving with recvmsg[_into]() when message is sent
2092 # using sendmsg().
2093 self.serv_sock.settimeout(self.fail_timeout)
2094 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2095 self.assertEqual(msg, MSG)
2096 self.checkRecvmsgAddress(addr, self.cli_addr)
2097 self.assertEqual(ancdata, [])
2098 self.checkFlags(flags, eor=True)
2099
2100 @testRecvmsgFromSendmsg.client_skip
2101 def _testRecvmsgFromSendmsg(self):
2102 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2103
2104
2105class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2106 # Tests which require a stream socket and can use either recvmsg()
2107 # or recvmsg_into().
2108
2109 def testRecvmsgEOF(self):
2110 # Receive end-of-stream indicator (b"", peer socket closed).
2111 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2112 self.assertEqual(msg, b"")
2113 self.checkRecvmsgAddress(addr, self.cli_addr)
2114 self.assertEqual(ancdata, [])
2115 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2116
2117 def _testRecvmsgEOF(self):
2118 self.cli_sock.close()
2119
2120 def testRecvmsgOverflow(self):
2121 # Receive a message in more than one chunk.
2122 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2123 len(MSG) - 3)
2124 self.checkRecvmsgAddress(addr, self.cli_addr)
2125 self.assertEqual(ancdata, [])
2126 self.checkFlags(flags, eor=False)
2127
2128 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2129 self.checkRecvmsgAddress(addr, self.cli_addr)
2130 self.assertEqual(ancdata, [])
2131 self.checkFlags(flags, eor=True)
2132
2133 msg = seg1 + seg2
2134 self.assertEqual(msg, MSG)
2135
2136 def _testRecvmsgOverflow(self):
2137 self.sendToServer(MSG)
2138
2139
2140class RecvmsgTests(RecvmsgGenericTests):
2141 # Tests for recvmsg() which can use any socket type.
2142
2143 def testRecvmsgBadArgs(self):
2144 # Check that recvmsg() rejects invalid arguments.
2145 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2146 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2147 -1, 0, 0)
2148 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2149 len(MSG), -1, 0)
2150 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2151 [bytearray(10)], 0, 0)
2152 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2153 object(), 0, 0)
2154 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2155 len(MSG), object(), 0)
2156 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2157 len(MSG), 0, object())
2158
2159 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2160 self.assertEqual(msg, MSG)
2161 self.checkRecvmsgAddress(addr, self.cli_addr)
2162 self.assertEqual(ancdata, [])
2163 self.checkFlags(flags, eor=True)
2164
2165 def _testRecvmsgBadArgs(self):
2166 self.sendToServer(MSG)
2167
2168
2169class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2170 # Tests for recvmsg_into() which can use any socket type.
2171
2172 def testRecvmsgIntoBadArgs(self):
2173 # Check that recvmsg_into() rejects invalid arguments.
2174 buf = bytearray(len(MSG))
2175 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2176 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2177 len(MSG), 0, 0)
2178 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2179 buf, 0, 0)
2180 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2181 [object()], 0, 0)
2182 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2183 [b"I'm not writable"], 0, 0)
2184 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2185 [buf, object()], 0, 0)
2186 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2187 [buf], -1, 0)
2188 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2189 [buf], object(), 0)
2190 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2191 [buf], 0, object())
2192
2193 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2194 self.assertEqual(nbytes, len(MSG))
2195 self.assertEqual(buf, bytearray(MSG))
2196 self.checkRecvmsgAddress(addr, self.cli_addr)
2197 self.assertEqual(ancdata, [])
2198 self.checkFlags(flags, eor=True)
2199
2200 def _testRecvmsgIntoBadArgs(self):
2201 self.sendToServer(MSG)
2202
2203 def testRecvmsgIntoGenerator(self):
2204 # Receive into buffer obtained from a generator (not a sequence).
2205 buf = bytearray(len(MSG))
2206 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2207 (o for o in [buf]))
2208 self.assertEqual(nbytes, len(MSG))
2209 self.assertEqual(buf, bytearray(MSG))
2210 self.checkRecvmsgAddress(addr, self.cli_addr)
2211 self.assertEqual(ancdata, [])
2212 self.checkFlags(flags, eor=True)
2213
2214 def _testRecvmsgIntoGenerator(self):
2215 self.sendToServer(MSG)
2216
2217 def testRecvmsgIntoArray(self):
2218 # Receive into an array rather than the usual bytearray.
2219 buf = array.array("B", [0] * len(MSG))
2220 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2221 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002222 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002223 self.checkRecvmsgAddress(addr, self.cli_addr)
2224 self.assertEqual(ancdata, [])
2225 self.checkFlags(flags, eor=True)
2226
2227 def _testRecvmsgIntoArray(self):
2228 self.sendToServer(MSG)
2229
2230 def testRecvmsgIntoScatter(self):
2231 # Receive into multiple buffers (scatter write).
2232 b1 = bytearray(b"----")
2233 b2 = bytearray(b"0123456789")
2234 b3 = bytearray(b"--------------")
2235 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2236 [b1, memoryview(b2)[2:9], b3])
2237 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2238 self.assertEqual(b1, bytearray(b"Mary"))
2239 self.assertEqual(b2, bytearray(b"01 had a 9"))
2240 self.assertEqual(b3, bytearray(b"little lamb---"))
2241 self.checkRecvmsgAddress(addr, self.cli_addr)
2242 self.assertEqual(ancdata, [])
2243 self.checkFlags(flags, eor=True)
2244
2245 def _testRecvmsgIntoScatter(self):
2246 self.sendToServer(b"Mary had a little lamb")
2247
2248
2249class CmsgMacroTests(unittest.TestCase):
2250 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2251 # assumptions used by sendmsg() and recvmsg[_into](), which share
2252 # code with these functions.
2253
2254 # Match the definition in socketmodule.c
2255 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2256
2257 @requireAttrs(socket, "CMSG_LEN")
2258 def testCMSG_LEN(self):
2259 # Test CMSG_LEN() with various valid and invalid values,
2260 # checking the assumptions used by recvmsg() and sendmsg().
2261 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2262 values = list(range(257)) + list(range(toobig - 257, toobig))
2263
2264 # struct cmsghdr has at least three members, two of which are ints
2265 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2266 for n in values:
2267 ret = socket.CMSG_LEN(n)
2268 # This is how recvmsg() calculates the data size
2269 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2270 self.assertLessEqual(ret, self.socklen_t_limit)
2271
2272 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2273 # sendmsg() shares code with these functions, and requires
2274 # that it reject values over the limit.
2275 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2276 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2277
2278 @requireAttrs(socket, "CMSG_SPACE")
2279 def testCMSG_SPACE(self):
2280 # Test CMSG_SPACE() with various valid and invalid values,
2281 # checking the assumptions used by sendmsg().
2282 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2283 values = list(range(257)) + list(range(toobig - 257, toobig))
2284
2285 last = socket.CMSG_SPACE(0)
2286 # struct cmsghdr has at least three members, two of which are ints
2287 self.assertGreater(last, array.array("i").itemsize * 2)
2288 for n in values:
2289 ret = socket.CMSG_SPACE(n)
2290 self.assertGreaterEqual(ret, last)
2291 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2292 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2293 self.assertLessEqual(ret, self.socklen_t_limit)
2294 last = ret
2295
2296 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2297 # sendmsg() shares code with these functions, and requires
2298 # that it reject values over the limit.
2299 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2300 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2301
2302
2303class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2304 # Tests for file descriptor passing on Unix-domain sockets.
2305
2306 # Invalid file descriptor value that's unlikely to evaluate to a
2307 # real FD even if one of its bytes is replaced with a different
2308 # value (which shouldn't actually happen).
2309 badfd = -0x5555
2310
2311 def newFDs(self, n):
2312 # Return a list of n file descriptors for newly-created files
2313 # containing their list indices as ASCII numbers.
2314 fds = []
2315 for i in range(n):
2316 fd, path = tempfile.mkstemp()
2317 self.addCleanup(os.unlink, path)
2318 self.addCleanup(os.close, fd)
2319 os.write(fd, str(i).encode())
2320 fds.append(fd)
2321 return fds
2322
2323 def checkFDs(self, fds):
2324 # Check that the file descriptors in the given list contain
2325 # their correct list indices as ASCII numbers.
2326 for n, fd in enumerate(fds):
2327 os.lseek(fd, 0, os.SEEK_SET)
2328 self.assertEqual(os.read(fd, 1024), str(n).encode())
2329
2330 def registerRecvmsgResult(self, result):
2331 self.addCleanup(self.closeRecvmsgFDs, result)
2332
2333 def closeRecvmsgFDs(self, recvmsg_result):
2334 # Close all file descriptors specified in the ancillary data
2335 # of the given return value from recvmsg() or recvmsg_into().
2336 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2337 if (cmsg_level == socket.SOL_SOCKET and
2338 cmsg_type == socket.SCM_RIGHTS):
2339 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002340 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002341 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2342 for fd in fds:
2343 os.close(fd)
2344
2345 def createAndSendFDs(self, n):
2346 # Send n new file descriptors created by newFDs() to the
2347 # server, with the constant MSG as the non-ancillary data.
2348 self.assertEqual(
2349 self.sendmsgToServer([MSG],
2350 [(socket.SOL_SOCKET,
2351 socket.SCM_RIGHTS,
2352 array.array("i", self.newFDs(n)))]),
2353 len(MSG))
2354
2355 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2356 # Check that constant MSG was received with numfds file
2357 # descriptors in a maximum of maxcmsgs control messages (which
2358 # must contain only complete integers). By default, check
2359 # that MSG_CTRUNC is unset, but ignore any flags in
2360 # ignoreflags.
2361 msg, ancdata, flags, addr = result
2362 self.assertEqual(msg, MSG)
2363 self.checkRecvmsgAddress(addr, self.cli_addr)
2364 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2365 ignore=ignoreflags)
2366
2367 self.assertIsInstance(ancdata, list)
2368 self.assertLessEqual(len(ancdata), maxcmsgs)
2369 fds = array.array("i")
2370 for item in ancdata:
2371 self.assertIsInstance(item, tuple)
2372 cmsg_level, cmsg_type, cmsg_data = item
2373 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2374 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2375 self.assertIsInstance(cmsg_data, bytes)
2376 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002377 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002378
2379 self.assertEqual(len(fds), numfds)
2380 self.checkFDs(fds)
2381
2382 def testFDPassSimple(self):
2383 # Pass a single FD (array read from bytes object).
2384 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2385 len(MSG), 10240))
2386
2387 def _testFDPassSimple(self):
2388 self.assertEqual(
2389 self.sendmsgToServer(
2390 [MSG],
2391 [(socket.SOL_SOCKET,
2392 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002393 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002394 len(MSG))
2395
2396 def testMultipleFDPass(self):
2397 # Pass multiple FDs in a single array.
2398 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2399 len(MSG), 10240))
2400
2401 def _testMultipleFDPass(self):
2402 self.createAndSendFDs(4)
2403
2404 @requireAttrs(socket, "CMSG_SPACE")
2405 def testFDPassCMSG_SPACE(self):
2406 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2407 self.checkRecvmsgFDs(
2408 4, self.doRecvmsg(self.serv_sock, len(MSG),
2409 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2410
2411 @testFDPassCMSG_SPACE.client_skip
2412 def _testFDPassCMSG_SPACE(self):
2413 self.createAndSendFDs(4)
2414
2415 def testFDPassCMSG_LEN(self):
2416 # Test using CMSG_LEN() to calculate ancillary buffer size.
2417 self.checkRecvmsgFDs(1,
2418 self.doRecvmsg(self.serv_sock, len(MSG),
2419 socket.CMSG_LEN(4 * SIZEOF_INT)),
2420 # RFC 3542 says implementations may set
2421 # MSG_CTRUNC if there isn't enough space
2422 # for trailing padding.
2423 ignoreflags=socket.MSG_CTRUNC)
2424
2425 def _testFDPassCMSG_LEN(self):
2426 self.createAndSendFDs(1)
2427
Nick Coghlan2496f332011-09-19 20:26:31 +10002428 # Issue #12958: The following test has problems on Mac OS X
2429 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002430 @requireAttrs(socket, "CMSG_SPACE")
2431 def testFDPassSeparate(self):
2432 # Pass two FDs in two separate arrays. Arrays may be combined
2433 # into a single control message by the OS.
2434 self.checkRecvmsgFDs(2,
2435 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2436 maxcmsgs=2)
2437
2438 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002439 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002440 def _testFDPassSeparate(self):
2441 fd0, fd1 = self.newFDs(2)
2442 self.assertEqual(
2443 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2444 socket.SCM_RIGHTS,
2445 array.array("i", [fd0])),
2446 (socket.SOL_SOCKET,
2447 socket.SCM_RIGHTS,
2448 array.array("i", [fd1]))]),
2449 len(MSG))
2450
Nick Coghlan2496f332011-09-19 20:26:31 +10002451 # Issue #12958: The following test has problems on Mac OS X
2452 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002453 @requireAttrs(socket, "CMSG_SPACE")
2454 def testFDPassSeparateMinSpace(self):
2455 # Pass two FDs in two separate arrays, receiving them into the
2456 # minimum space for two arrays.
2457 self.checkRecvmsgFDs(2,
2458 self.doRecvmsg(self.serv_sock, len(MSG),
2459 socket.CMSG_SPACE(SIZEOF_INT) +
2460 socket.CMSG_LEN(SIZEOF_INT)),
2461 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2462
2463 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002464 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002465 def _testFDPassSeparateMinSpace(self):
2466 fd0, fd1 = self.newFDs(2)
2467 self.assertEqual(
2468 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2469 socket.SCM_RIGHTS,
2470 array.array("i", [fd0])),
2471 (socket.SOL_SOCKET,
2472 socket.SCM_RIGHTS,
2473 array.array("i", [fd1]))]),
2474 len(MSG))
2475
2476 def sendAncillaryIfPossible(self, msg, ancdata):
2477 # Try to send msg and ancdata to server, but if the system
2478 # call fails, just send msg with no ancillary data.
2479 try:
2480 nbytes = self.sendmsgToServer([msg], ancdata)
2481 except socket.error as e:
2482 # Check that it was the system call that failed
2483 self.assertIsInstance(e.errno, int)
2484 nbytes = self.sendmsgToServer([msg])
2485 self.assertEqual(nbytes, len(msg))
2486
2487 def testFDPassEmpty(self):
2488 # Try to pass an empty FD array. Can receive either no array
2489 # or an empty array.
2490 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2491 len(MSG), 10240),
2492 ignoreflags=socket.MSG_CTRUNC)
2493
2494 def _testFDPassEmpty(self):
2495 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2496 socket.SCM_RIGHTS,
2497 b"")])
2498
2499 def testFDPassPartialInt(self):
2500 # Try to pass a truncated FD array.
2501 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2502 len(MSG), 10240)
2503 self.assertEqual(msg, MSG)
2504 self.checkRecvmsgAddress(addr, self.cli_addr)
2505 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2506 self.assertLessEqual(len(ancdata), 1)
2507 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2508 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2509 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2510 self.assertLess(len(cmsg_data), SIZEOF_INT)
2511
2512 def _testFDPassPartialInt(self):
2513 self.sendAncillaryIfPossible(
2514 MSG,
2515 [(socket.SOL_SOCKET,
2516 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002517 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002518
2519 @requireAttrs(socket, "CMSG_SPACE")
2520 def testFDPassPartialIntInMiddle(self):
2521 # Try to pass two FD arrays, the first of which is truncated.
2522 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2523 len(MSG), 10240)
2524 self.assertEqual(msg, MSG)
2525 self.checkRecvmsgAddress(addr, self.cli_addr)
2526 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2527 self.assertLessEqual(len(ancdata), 2)
2528 fds = array.array("i")
2529 # Arrays may have been combined in a single control message
2530 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2531 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2532 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002533 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002534 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2535 self.assertLessEqual(len(fds), 2)
2536 self.checkFDs(fds)
2537
2538 @testFDPassPartialIntInMiddle.client_skip
2539 def _testFDPassPartialIntInMiddle(self):
2540 fd0, fd1 = self.newFDs(2)
2541 self.sendAncillaryIfPossible(
2542 MSG,
2543 [(socket.SOL_SOCKET,
2544 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002545 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002546 (socket.SOL_SOCKET,
2547 socket.SCM_RIGHTS,
2548 array.array("i", [fd1]))])
2549
2550 def checkTruncatedHeader(self, result, ignoreflags=0):
2551 # Check that no ancillary data items are returned when data is
2552 # truncated inside the cmsghdr structure.
2553 msg, ancdata, flags, addr = result
2554 self.assertEqual(msg, MSG)
2555 self.checkRecvmsgAddress(addr, self.cli_addr)
2556 self.assertEqual(ancdata, [])
2557 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2558 ignore=ignoreflags)
2559
2560 def testCmsgTruncNoBufSize(self):
2561 # Check that no ancillary data is received when no buffer size
2562 # is specified.
2563 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2564 # BSD seems to set MSG_CTRUNC only
2565 # if an item has been partially
2566 # received.
2567 ignoreflags=socket.MSG_CTRUNC)
2568
2569 def _testCmsgTruncNoBufSize(self):
2570 self.createAndSendFDs(1)
2571
2572 def testCmsgTrunc0(self):
2573 # Check that no ancillary data is received when buffer size is 0.
2574 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2575 ignoreflags=socket.MSG_CTRUNC)
2576
2577 def _testCmsgTrunc0(self):
2578 self.createAndSendFDs(1)
2579
2580 # Check that no ancillary data is returned for various non-zero
2581 # (but still too small) buffer sizes.
2582
2583 def testCmsgTrunc1(self):
2584 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2585
2586 def _testCmsgTrunc1(self):
2587 self.createAndSendFDs(1)
2588
2589 def testCmsgTrunc2Int(self):
2590 # The cmsghdr structure has at least three members, two of
2591 # which are ints, so we still shouldn't see any ancillary
2592 # data.
2593 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2594 SIZEOF_INT * 2))
2595
2596 def _testCmsgTrunc2Int(self):
2597 self.createAndSendFDs(1)
2598
2599 def testCmsgTruncLen0Minus1(self):
2600 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2601 socket.CMSG_LEN(0) - 1))
2602
2603 def _testCmsgTruncLen0Minus1(self):
2604 self.createAndSendFDs(1)
2605
2606 # The following tests try to truncate the control message in the
2607 # middle of the FD array.
2608
2609 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2610 # Check that file descriptor data is truncated to between
2611 # mindata and maxdata bytes when received with buffer size
2612 # ancbuf, and that any complete file descriptor numbers are
2613 # valid.
2614 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2615 len(MSG), ancbuf)
2616 self.assertEqual(msg, MSG)
2617 self.checkRecvmsgAddress(addr, self.cli_addr)
2618 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2619
2620 if mindata == 0 and ancdata == []:
2621 return
2622 self.assertEqual(len(ancdata), 1)
2623 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2624 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2625 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2626 self.assertGreaterEqual(len(cmsg_data), mindata)
2627 self.assertLessEqual(len(cmsg_data), maxdata)
2628 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002629 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002630 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2631 self.checkFDs(fds)
2632
2633 def testCmsgTruncLen0(self):
2634 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2635
2636 def _testCmsgTruncLen0(self):
2637 self.createAndSendFDs(1)
2638
2639 def testCmsgTruncLen0Plus1(self):
2640 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2641
2642 def _testCmsgTruncLen0Plus1(self):
2643 self.createAndSendFDs(2)
2644
2645 def testCmsgTruncLen1(self):
2646 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2647 maxdata=SIZEOF_INT)
2648
2649 def _testCmsgTruncLen1(self):
2650 self.createAndSendFDs(2)
2651
2652 def testCmsgTruncLen2Minus1(self):
2653 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2654 maxdata=(2 * SIZEOF_INT) - 1)
2655
2656 def _testCmsgTruncLen2Minus1(self):
2657 self.createAndSendFDs(2)
2658
2659
2660class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2661 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2662 # features of the RFC 3542 Advanced Sockets API for IPv6.
2663 # Currently we can only handle certain data items (e.g. traffic
2664 # class, hop limit, MTU discovery and fragmentation settings)
2665 # without resorting to unportable means such as the struct module,
2666 # but the tests here are aimed at testing the ancillary data
2667 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2668 # itself.
2669
2670 # Test value to use when setting hop limit of packet
2671 hop_limit = 2
2672
2673 # Test value to use when setting traffic class of packet.
2674 # -1 means "use kernel default".
2675 traffic_class = -1
2676
2677 def ancillaryMapping(self, ancdata):
2678 # Given ancillary data list ancdata, return a mapping from
2679 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2680 # Check that no (level, type) pair appears more than once.
2681 d = {}
2682 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2683 self.assertNotIn((cmsg_level, cmsg_type), d)
2684 d[(cmsg_level, cmsg_type)] = cmsg_data
2685 return d
2686
2687 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2688 # Receive hop limit into ancbufsize bytes of ancillary data
2689 # space. Check that data is MSG, ancillary data is not
2690 # truncated (but ignore any flags in ignoreflags), and hop
2691 # limit is between 0 and maxhop inclusive.
2692 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2693 socket.IPV6_RECVHOPLIMIT, 1)
2694 self.misc_event.set()
2695 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2696 len(MSG), ancbufsize)
2697
2698 self.assertEqual(msg, MSG)
2699 self.checkRecvmsgAddress(addr, self.cli_addr)
2700 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2701 ignore=ignoreflags)
2702
2703 self.assertEqual(len(ancdata), 1)
2704 self.assertIsInstance(ancdata[0], tuple)
2705 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2706 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2707 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2708 self.assertIsInstance(cmsg_data, bytes)
2709 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2710 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002711 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002712 self.assertGreaterEqual(a[0], 0)
2713 self.assertLessEqual(a[0], maxhop)
2714
2715 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2716 def testRecvHopLimit(self):
2717 # Test receiving the packet hop limit as ancillary data.
2718 self.checkHopLimit(ancbufsize=10240)
2719
2720 @testRecvHopLimit.client_skip
2721 def _testRecvHopLimit(self):
2722 # Need to wait until server has asked to receive ancillary
2723 # data, as implementations are not required to buffer it
2724 # otherwise.
2725 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2726 self.sendToServer(MSG)
2727
2728 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2729 def testRecvHopLimitCMSG_SPACE(self):
2730 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2731 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2732
2733 @testRecvHopLimitCMSG_SPACE.client_skip
2734 def _testRecvHopLimitCMSG_SPACE(self):
2735 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2736 self.sendToServer(MSG)
2737
2738 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2739 # 3542 says portable applications must provide space for trailing
2740 # padding. Implementations may set MSG_CTRUNC if there isn't
2741 # enough space for the padding.
2742
2743 @requireAttrs(socket.socket, "sendmsg")
2744 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2745 def testSetHopLimit(self):
2746 # Test setting hop limit on outgoing packet and receiving it
2747 # at the other end.
2748 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2749
2750 @testSetHopLimit.client_skip
2751 def _testSetHopLimit(self):
2752 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2753 self.assertEqual(
2754 self.sendmsgToServer([MSG],
2755 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2756 array.array("i", [self.hop_limit]))]),
2757 len(MSG))
2758
2759 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2760 ignoreflags=0):
2761 # Receive traffic class and hop limit into ancbufsize bytes of
2762 # ancillary data space. Check that data is MSG, ancillary
2763 # data is not truncated (but ignore any flags in ignoreflags),
2764 # and traffic class and hop limit are in range (hop limit no
2765 # more than maxhop).
2766 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2767 socket.IPV6_RECVHOPLIMIT, 1)
2768 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2769 socket.IPV6_RECVTCLASS, 1)
2770 self.misc_event.set()
2771 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2772 len(MSG), ancbufsize)
2773
2774 self.assertEqual(msg, MSG)
2775 self.checkRecvmsgAddress(addr, self.cli_addr)
2776 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2777 ignore=ignoreflags)
2778 self.assertEqual(len(ancdata), 2)
2779 ancmap = self.ancillaryMapping(ancdata)
2780
2781 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2782 self.assertEqual(len(tcdata), SIZEOF_INT)
2783 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002784 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002785 self.assertGreaterEqual(a[0], 0)
2786 self.assertLessEqual(a[0], 255)
2787
2788 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2789 self.assertEqual(len(hldata), SIZEOF_INT)
2790 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002791 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002792 self.assertGreaterEqual(a[0], 0)
2793 self.assertLessEqual(a[0], maxhop)
2794
2795 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2796 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2797 def testRecvTrafficClassAndHopLimit(self):
2798 # Test receiving traffic class and hop limit as ancillary data.
2799 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2800
2801 @testRecvTrafficClassAndHopLimit.client_skip
2802 def _testRecvTrafficClassAndHopLimit(self):
2803 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2804 self.sendToServer(MSG)
2805
2806 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2807 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2808 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2809 # Test receiving traffic class and hop limit, using
2810 # CMSG_SPACE() to calculate buffer size.
2811 self.checkTrafficClassAndHopLimit(
2812 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2813
2814 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2815 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2816 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2817 self.sendToServer(MSG)
2818
2819 @requireAttrs(socket.socket, "sendmsg")
2820 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2821 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2822 def testSetTrafficClassAndHopLimit(self):
2823 # Test setting traffic class and hop limit on outgoing packet,
2824 # and receiving them at the other end.
2825 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2826 maxhop=self.hop_limit)
2827
2828 @testSetTrafficClassAndHopLimit.client_skip
2829 def _testSetTrafficClassAndHopLimit(self):
2830 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2831 self.assertEqual(
2832 self.sendmsgToServer([MSG],
2833 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2834 array.array("i", [self.traffic_class])),
2835 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2836 array.array("i", [self.hop_limit]))]),
2837 len(MSG))
2838
2839 @requireAttrs(socket.socket, "sendmsg")
2840 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2841 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2842 def testOddCmsgSize(self):
2843 # Try to send ancillary data with first item one byte too
2844 # long. Fall back to sending with correct size if this fails,
2845 # and check that second item was handled correctly.
2846 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2847 maxhop=self.hop_limit)
2848
2849 @testOddCmsgSize.client_skip
2850 def _testOddCmsgSize(self):
2851 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2852 try:
2853 nbytes = self.sendmsgToServer(
2854 [MSG],
2855 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002856 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002857 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2858 array.array("i", [self.hop_limit]))])
2859 except socket.error as e:
2860 self.assertIsInstance(e.errno, int)
2861 nbytes = self.sendmsgToServer(
2862 [MSG],
2863 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2864 array.array("i", [self.traffic_class])),
2865 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2866 array.array("i", [self.hop_limit]))])
2867 self.assertEqual(nbytes, len(MSG))
2868
2869 # Tests for proper handling of truncated ancillary data
2870
2871 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2872 # Receive hop limit into ancbufsize bytes of ancillary data
2873 # space, which should be too small to contain the ancillary
2874 # data header (if ancbufsize is None, pass no second argument
2875 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2876 # (unless included in ignoreflags), and no ancillary data is
2877 # returned.
2878 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2879 socket.IPV6_RECVHOPLIMIT, 1)
2880 self.misc_event.set()
2881 args = () if ancbufsize is None else (ancbufsize,)
2882 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2883 len(MSG), *args)
2884
2885 self.assertEqual(msg, MSG)
2886 self.checkRecvmsgAddress(addr, self.cli_addr)
2887 self.assertEqual(ancdata, [])
2888 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2889 ignore=ignoreflags)
2890
2891 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2892 def testCmsgTruncNoBufSize(self):
2893 # Check that no ancillary data is received when no ancillary
2894 # buffer size is provided.
2895 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2896 # BSD seems to set
2897 # MSG_CTRUNC only if an item
2898 # has been partially
2899 # received.
2900 ignoreflags=socket.MSG_CTRUNC)
2901
2902 @testCmsgTruncNoBufSize.client_skip
2903 def _testCmsgTruncNoBufSize(self):
2904 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2905 self.sendToServer(MSG)
2906
2907 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2908 def testSingleCmsgTrunc0(self):
2909 # Check that no ancillary data is received when ancillary
2910 # buffer size is zero.
2911 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2912 ignoreflags=socket.MSG_CTRUNC)
2913
2914 @testSingleCmsgTrunc0.client_skip
2915 def _testSingleCmsgTrunc0(self):
2916 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2917 self.sendToServer(MSG)
2918
2919 # Check that no ancillary data is returned for various non-zero
2920 # (but still too small) buffer sizes.
2921
2922 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2923 def testSingleCmsgTrunc1(self):
2924 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2925
2926 @testSingleCmsgTrunc1.client_skip
2927 def _testSingleCmsgTrunc1(self):
2928 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2929 self.sendToServer(MSG)
2930
2931 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2932 def testSingleCmsgTrunc2Int(self):
2933 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
2934
2935 @testSingleCmsgTrunc2Int.client_skip
2936 def _testSingleCmsgTrunc2Int(self):
2937 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2938 self.sendToServer(MSG)
2939
2940 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2941 def testSingleCmsgTruncLen0Minus1(self):
2942 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
2943
2944 @testSingleCmsgTruncLen0Minus1.client_skip
2945 def _testSingleCmsgTruncLen0Minus1(self):
2946 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2947 self.sendToServer(MSG)
2948
2949 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2950 def testSingleCmsgTruncInData(self):
2951 # Test truncation of a control message inside its associated
2952 # data. The message may be returned with its data truncated,
2953 # or not returned at all.
2954 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2955 socket.IPV6_RECVHOPLIMIT, 1)
2956 self.misc_event.set()
2957 msg, ancdata, flags, addr = self.doRecvmsg(
2958 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
2959
2960 self.assertEqual(msg, MSG)
2961 self.checkRecvmsgAddress(addr, self.cli_addr)
2962 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2963
2964 self.assertLessEqual(len(ancdata), 1)
2965 if ancdata:
2966 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2967 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2968 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2969 self.assertLess(len(cmsg_data), SIZEOF_INT)
2970
2971 @testSingleCmsgTruncInData.client_skip
2972 def _testSingleCmsgTruncInData(self):
2973 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2974 self.sendToServer(MSG)
2975
2976 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
2977 # Receive traffic class and hop limit into ancbufsize bytes of
2978 # ancillary data space, which should be large enough to
2979 # contain the first item, but too small to contain the header
2980 # of the second. Check that data is MSG, MSG_CTRUNC is set
2981 # (unless included in ignoreflags), and only one ancillary
2982 # data item is returned.
2983 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2984 socket.IPV6_RECVHOPLIMIT, 1)
2985 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2986 socket.IPV6_RECVTCLASS, 1)
2987 self.misc_event.set()
2988 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2989 len(MSG), ancbufsize)
2990
2991 self.assertEqual(msg, MSG)
2992 self.checkRecvmsgAddress(addr, self.cli_addr)
2993 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2994 ignore=ignoreflags)
2995
2996 self.assertEqual(len(ancdata), 1)
2997 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2998 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2999 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3000 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3001 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003002 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003003 self.assertGreaterEqual(a[0], 0)
3004 self.assertLessEqual(a[0], 255)
3005
3006 # Try the above test with various buffer sizes.
3007
3008 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3009 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3010 def testSecondCmsgTrunc0(self):
3011 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3012 ignoreflags=socket.MSG_CTRUNC)
3013
3014 @testSecondCmsgTrunc0.client_skip
3015 def _testSecondCmsgTrunc0(self):
3016 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3017 self.sendToServer(MSG)
3018
3019 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3020 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3021 def testSecondCmsgTrunc1(self):
3022 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3023
3024 @testSecondCmsgTrunc1.client_skip
3025 def _testSecondCmsgTrunc1(self):
3026 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3027 self.sendToServer(MSG)
3028
3029 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3030 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3031 def testSecondCmsgTrunc2Int(self):
3032 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3033 2 * SIZEOF_INT)
3034
3035 @testSecondCmsgTrunc2Int.client_skip
3036 def _testSecondCmsgTrunc2Int(self):
3037 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3038 self.sendToServer(MSG)
3039
3040 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3041 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3042 def testSecondCmsgTruncLen0Minus1(self):
3043 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3044 socket.CMSG_LEN(0) - 1)
3045
3046 @testSecondCmsgTruncLen0Minus1.client_skip
3047 def _testSecondCmsgTruncLen0Minus1(self):
3048 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3049 self.sendToServer(MSG)
3050
3051 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3052 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3053 def testSecomdCmsgTruncInData(self):
3054 # Test truncation of the second of two control messages inside
3055 # its associated data.
3056 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3057 socket.IPV6_RECVHOPLIMIT, 1)
3058 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3059 socket.IPV6_RECVTCLASS, 1)
3060 self.misc_event.set()
3061 msg, ancdata, flags, addr = self.doRecvmsg(
3062 self.serv_sock, len(MSG),
3063 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3064
3065 self.assertEqual(msg, MSG)
3066 self.checkRecvmsgAddress(addr, self.cli_addr)
3067 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3068
3069 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3070
3071 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3072 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3073 cmsg_types.remove(cmsg_type)
3074 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3075 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003076 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003077 self.assertGreaterEqual(a[0], 0)
3078 self.assertLessEqual(a[0], 255)
3079
3080 if ancdata:
3081 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3082 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3083 cmsg_types.remove(cmsg_type)
3084 self.assertLess(len(cmsg_data), SIZEOF_INT)
3085
3086 self.assertEqual(ancdata, [])
3087
3088 @testSecomdCmsgTruncInData.client_skip
3089 def _testSecomdCmsgTruncInData(self):
3090 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3091 self.sendToServer(MSG)
3092
3093
3094# Derive concrete test classes for different socket types.
3095
3096class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3097 SendrecvmsgConnectionlessBase,
3098 ThreadedSocketTestMixin, UDPTestBase):
3099 pass
3100
3101@requireAttrs(socket.socket, "sendmsg")
3102@unittest.skipUnless(thread, 'Threading required for this test.')
3103class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3104 pass
3105
3106@requireAttrs(socket.socket, "recvmsg")
3107@unittest.skipUnless(thread, 'Threading required for this test.')
3108class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3109 pass
3110
3111@requireAttrs(socket.socket, "recvmsg_into")
3112@unittest.skipUnless(thread, 'Threading required for this test.')
3113class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3114 pass
3115
3116
3117class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3118 SendrecvmsgConnectionlessBase,
3119 ThreadedSocketTestMixin, UDP6TestBase):
3120 pass
3121
3122@requireAttrs(socket.socket, "sendmsg")
3123@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3124@requireSocket("AF_INET6", "SOCK_DGRAM")
3125@unittest.skipUnless(thread, 'Threading required for this test.')
3126class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3127 pass
3128
3129@requireAttrs(socket.socket, "recvmsg")
3130@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3131@requireSocket("AF_INET6", "SOCK_DGRAM")
3132@unittest.skipUnless(thread, 'Threading required for this test.')
3133class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3134 pass
3135
3136@requireAttrs(socket.socket, "recvmsg_into")
3137@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3138@requireSocket("AF_INET6", "SOCK_DGRAM")
3139@unittest.skipUnless(thread, 'Threading required for this test.')
3140class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3141 pass
3142
3143@requireAttrs(socket.socket, "recvmsg")
3144@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3145@requireAttrs(socket, "IPPROTO_IPV6")
3146@requireSocket("AF_INET6", "SOCK_DGRAM")
3147@unittest.skipUnless(thread, 'Threading required for this test.')
3148class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3149 SendrecvmsgUDP6TestBase):
3150 pass
3151
3152@requireAttrs(socket.socket, "recvmsg_into")
3153@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3154@requireAttrs(socket, "IPPROTO_IPV6")
3155@requireSocket("AF_INET6", "SOCK_DGRAM")
3156@unittest.skipUnless(thread, 'Threading required for this test.')
3157class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3158 RFC3542AncillaryTest,
3159 SendrecvmsgUDP6TestBase):
3160 pass
3161
3162
3163class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3164 ConnectedStreamTestMixin, TCPTestBase):
3165 pass
3166
3167@requireAttrs(socket.socket, "sendmsg")
3168@unittest.skipUnless(thread, 'Threading required for this test.')
3169class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3170 pass
3171
3172@requireAttrs(socket.socket, "recvmsg")
3173@unittest.skipUnless(thread, 'Threading required for this test.')
3174class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3175 SendrecvmsgTCPTestBase):
3176 pass
3177
3178@requireAttrs(socket.socket, "recvmsg_into")
3179@unittest.skipUnless(thread, 'Threading required for this test.')
3180class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3181 SendrecvmsgTCPTestBase):
3182 pass
3183
3184
3185class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3186 SendrecvmsgConnectedBase,
3187 ConnectedStreamTestMixin, SCTPStreamBase):
3188 pass
3189
3190@requireAttrs(socket.socket, "sendmsg")
3191@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3192@unittest.skipUnless(thread, 'Threading required for this test.')
3193class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3194 pass
3195
3196@requireAttrs(socket.socket, "recvmsg")
3197@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3198@unittest.skipUnless(thread, 'Threading required for this test.')
3199class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3200 SendrecvmsgSCTPStreamTestBase):
3201 pass
3202
3203@requireAttrs(socket.socket, "recvmsg_into")
3204@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3205@unittest.skipUnless(thread, 'Threading required for this test.')
3206class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3207 SendrecvmsgSCTPStreamTestBase):
3208 pass
3209
3210
3211class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3212 ConnectedStreamTestMixin, UnixStreamBase):
3213 pass
3214
3215@requireAttrs(socket.socket, "sendmsg")
3216@requireAttrs(socket, "AF_UNIX")
3217@unittest.skipUnless(thread, 'Threading required for this test.')
3218class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3219 pass
3220
3221@requireAttrs(socket.socket, "recvmsg")
3222@requireAttrs(socket, "AF_UNIX")
3223@unittest.skipUnless(thread, 'Threading required for this test.')
3224class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3225 SendrecvmsgUnixStreamTestBase):
3226 pass
3227
3228@requireAttrs(socket.socket, "recvmsg_into")
3229@requireAttrs(socket, "AF_UNIX")
3230@unittest.skipUnless(thread, 'Threading required for this test.')
3231class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3232 SendrecvmsgUnixStreamTestBase):
3233 pass
3234
3235@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3236@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3237@unittest.skipUnless(thread, 'Threading required for this test.')
3238class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3239 pass
3240
3241@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3242@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3243@unittest.skipUnless(thread, 'Threading required for this test.')
3244class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3245 SendrecvmsgUnixStreamTestBase):
3246 pass
3247
3248
3249# Test interrupting the interruptible send/receive methods with a
3250# signal when a timeout is set. These tests avoid having multiple
3251# threads alive during the test so that the OS cannot deliver the
3252# signal to the wrong one.
3253
3254class InterruptedTimeoutBase(unittest.TestCase):
3255 # Base class for interrupted send/receive tests. Installs an
3256 # empty handler for SIGALRM and removes it on teardown, along with
3257 # any scheduled alarms.
3258
3259 def setUp(self):
3260 super().setUp()
3261 orig_alrm_handler = signal.signal(signal.SIGALRM,
3262 lambda signum, frame: None)
3263 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3264 self.addCleanup(self.setAlarm, 0)
3265
3266 # Timeout for socket operations
3267 timeout = 4.0
3268
3269 # Provide setAlarm() method to schedule delivery of SIGALRM after
3270 # given number of seconds, or cancel it if zero, and an
3271 # appropriate time value to use. Use setitimer() if available.
3272 if hasattr(signal, "setitimer"):
3273 alarm_time = 0.05
3274
3275 def setAlarm(self, seconds):
3276 signal.setitimer(signal.ITIMER_REAL, seconds)
3277 else:
3278 # Old systems may deliver the alarm up to one second early
3279 alarm_time = 2
3280
3281 def setAlarm(self, seconds):
3282 signal.alarm(seconds)
3283
3284
3285# Require siginterrupt() in order to ensure that system calls are
3286# interrupted by default.
3287@requireAttrs(signal, "siginterrupt")
3288@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3289 "Don't have signal.alarm or signal.setitimer")
3290class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3291 # Test interrupting the recv*() methods with signals when a
3292 # timeout is set.
3293
3294 def setUp(self):
3295 super().setUp()
3296 self.serv.settimeout(self.timeout)
3297
3298 def checkInterruptedRecv(self, func, *args, **kwargs):
3299 # Check that func(*args, **kwargs) raises socket.error with an
3300 # errno of EINTR when interrupted by a signal.
3301 self.setAlarm(self.alarm_time)
3302 with self.assertRaises(socket.error) as cm:
3303 func(*args, **kwargs)
3304 self.assertNotIsInstance(cm.exception, socket.timeout)
3305 self.assertEqual(cm.exception.errno, errno.EINTR)
3306
3307 def testInterruptedRecvTimeout(self):
3308 self.checkInterruptedRecv(self.serv.recv, 1024)
3309
3310 def testInterruptedRecvIntoTimeout(self):
3311 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3312
3313 def testInterruptedRecvfromTimeout(self):
3314 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3315
3316 def testInterruptedRecvfromIntoTimeout(self):
3317 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3318
3319 @requireAttrs(socket.socket, "recvmsg")
3320 def testInterruptedRecvmsgTimeout(self):
3321 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3322
3323 @requireAttrs(socket.socket, "recvmsg_into")
3324 def testInterruptedRecvmsgIntoTimeout(self):
3325 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3326
3327
3328# Require siginterrupt() in order to ensure that system calls are
3329# interrupted by default.
3330@requireAttrs(signal, "siginterrupt")
3331@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3332 "Don't have signal.alarm or signal.setitimer")
3333@unittest.skipUnless(thread, 'Threading required for this test.')
3334class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3335 ThreadSafeCleanupTestCase,
3336 SocketListeningTestMixin, TCPTestBase):
3337 # Test interrupting the interruptible send*() methods with signals
3338 # when a timeout is set.
3339
3340 def setUp(self):
3341 super().setUp()
3342 self.serv_conn = self.newSocket()
3343 self.addCleanup(self.serv_conn.close)
3344 # Use a thread to complete the connection, but wait for it to
3345 # terminate before running the test, so that there is only one
3346 # thread to accept the signal.
3347 cli_thread = threading.Thread(target=self.doConnect)
3348 cli_thread.start()
3349 self.cli_conn, addr = self.serv.accept()
3350 self.addCleanup(self.cli_conn.close)
3351 cli_thread.join()
3352 self.serv_conn.settimeout(self.timeout)
3353
3354 def doConnect(self):
3355 self.serv_conn.connect(self.serv_addr)
3356
3357 def checkInterruptedSend(self, func, *args, **kwargs):
3358 # Check that func(*args, **kwargs), run in a loop, raises
3359 # socket.error with an errno of EINTR when interrupted by a
3360 # signal.
3361 with self.assertRaises(socket.error) as cm:
3362 while True:
3363 self.setAlarm(self.alarm_time)
3364 func(*args, **kwargs)
3365 self.assertNotIsInstance(cm.exception, socket.timeout)
3366 self.assertEqual(cm.exception.errno, errno.EINTR)
3367
Nick Coghlan2496f332011-09-19 20:26:31 +10003368 # Issue #12958: The following tests have problems on Mac OS X
3369 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003370 def testInterruptedSendTimeout(self):
3371 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3372
Nick Coghlan2496f332011-09-19 20:26:31 +10003373 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003374 def testInterruptedSendtoTimeout(self):
3375 # Passing an actual address here as Python's wrapper for
3376 # sendto() doesn't allow passing a zero-length one; POSIX
3377 # requires that the address is ignored since the socket is
3378 # connection-mode, however.
3379 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3380 self.serv_addr)
3381
Nick Coghlan2496f332011-09-19 20:26:31 +10003382 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003383 @requireAttrs(socket.socket, "sendmsg")
3384 def testInterruptedSendmsgTimeout(self):
3385 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3386
3387
Victor Stinner45df8202010-04-28 22:31:17 +00003388@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003389class TCPCloserTest(ThreadedTCPSocketTest):
3390
3391 def testClose(self):
3392 conn, addr = self.serv.accept()
3393 conn.close()
3394
3395 sd = self.cli
3396 read, write, err = select.select([sd], [], [], 1.0)
3397 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003398 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003399
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003400 # Calling close() many times should be safe.
3401 conn.close()
3402 conn.close()
3403
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003404 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003405 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003406 time.sleep(1.0)
3407
Victor Stinner45df8202010-04-28 22:31:17 +00003408@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003409class BasicSocketPairTest(SocketPairTest):
3410
3411 def __init__(self, methodName='runTest'):
3412 SocketPairTest.__init__(self, methodName=methodName)
3413
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003414 def _check_defaults(self, sock):
3415 self.assertIsInstance(sock, socket.socket)
3416 if hasattr(socket, 'AF_UNIX'):
3417 self.assertEqual(sock.family, socket.AF_UNIX)
3418 else:
3419 self.assertEqual(sock.family, socket.AF_INET)
3420 self.assertEqual(sock.type, socket.SOCK_STREAM)
3421 self.assertEqual(sock.proto, 0)
3422
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003423 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003424 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003425
3426 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003427 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003428
Dave Cole331708b2004-08-09 04:51:41 +00003429 def testRecv(self):
3430 msg = self.serv.recv(1024)
3431 self.assertEqual(msg, MSG)
3432
3433 def _testRecv(self):
3434 self.cli.send(MSG)
3435
3436 def testSend(self):
3437 self.serv.send(MSG)
3438
3439 def _testSend(self):
3440 msg = self.cli.recv(1024)
3441 self.assertEqual(msg, MSG)
3442
Victor Stinner45df8202010-04-28 22:31:17 +00003443@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003444class NonBlockingTCPTests(ThreadedTCPSocketTest):
3445
3446 def __init__(self, methodName='runTest'):
3447 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3448
3449 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003450 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003451 self.serv.setblocking(0)
3452 start = time.time()
3453 try:
3454 self.serv.accept()
3455 except socket.error:
3456 pass
3457 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003458 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003459
3460 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003461 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003462
Antoine Pitroub1c54962010-10-14 15:05:38 +00003463 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003464 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003465 def testInitNonBlocking(self):
3466 # reinit server socket
3467 self.serv.close()
3468 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003469 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003470 self.port = support.bind_port(self.serv)
3471 self.serv.listen(1)
3472 # actual testing
3473 start = time.time()
3474 try:
3475 self.serv.accept()
3476 except socket.error:
3477 pass
3478 end = time.time()
3479 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3480
3481 def _testInitNonBlocking(self):
3482 pass
3483
Antoine Pitrou600232b2011-01-05 21:03:42 +00003484 def testInheritFlags(self):
3485 # Issue #7995: when calling accept() on a listening socket with a
3486 # timeout, the resulting socket should not be non-blocking.
3487 self.serv.settimeout(10)
3488 try:
3489 conn, addr = self.serv.accept()
3490 message = conn.recv(len(MSG))
3491 finally:
3492 conn.close()
3493 self.serv.settimeout(None)
3494
3495 def _testInheritFlags(self):
3496 time.sleep(0.1)
3497 self.cli.connect((HOST, self.port))
3498 time.sleep(0.5)
3499 self.cli.send(MSG)
3500
Guido van Rossum24e4af82002-06-12 19:18:08 +00003501 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003502 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003503 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003504 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003505 conn, addr = self.serv.accept()
3506 except socket.error:
3507 pass
3508 else:
3509 self.fail("Error trying to do non-blocking accept.")
3510 read, write, err = select.select([self.serv], [], [])
3511 if self.serv in read:
3512 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003513 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003514 else:
3515 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003516
Guido van Rossum24e4af82002-06-12 19:18:08 +00003517 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003518 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003519 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003520
3521 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003522 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003523 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003524 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003525
3526 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003527 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003528 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003529
3530 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003531 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003532 conn, addr = self.serv.accept()
3533 conn.setblocking(0)
3534 try:
3535 msg = conn.recv(len(MSG))
3536 except socket.error:
3537 pass
3538 else:
3539 self.fail("Error trying to do non-blocking recv.")
3540 read, write, err = select.select([conn], [], [])
3541 if conn in read:
3542 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003543 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003544 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003545 else:
3546 self.fail("Error during select call to non-blocking socket.")
3547
3548 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003549 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003550 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003551 self.cli.send(MSG)
3552
Victor Stinner45df8202010-04-28 22:31:17 +00003553@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003554class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003555 """Unit tests for the object returned by socket.makefile()
3556
Antoine Pitrou834bd812010-10-13 16:17:14 +00003557 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003558 the client connection. You can read from this file to
3559 get output from the server.
3560
Antoine Pitrou834bd812010-10-13 16:17:14 +00003561 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003562 server connection. You can write to this file to send output
3563 to the client.
3564 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003565
Guido van Rossume9f66142002-08-07 15:46:19 +00003566 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003567 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003568 errors = 'strict'
3569 newline = None
3570
3571 read_mode = 'rb'
3572 read_msg = MSG
3573 write_mode = 'wb'
3574 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003575
Guido van Rossum24e4af82002-06-12 19:18:08 +00003576 def __init__(self, methodName='runTest'):
3577 SocketConnectedTest.__init__(self, methodName=methodName)
3578
3579 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003580 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3581 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003582 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003583 self.read_file = self.cli_conn.makefile(
3584 self.read_mode, self.bufsize,
3585 encoding = self.encoding,
3586 errors = self.errors,
3587 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003588
3589 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003590 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003591 self.read_file.close()
3592 self.assertTrue(self.read_file.closed)
3593 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003594 SocketConnectedTest.tearDown(self)
3595
3596 def clientSetUp(self):
3597 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003598 self.write_file = self.serv_conn.makefile(
3599 self.write_mode, self.bufsize,
3600 encoding = self.encoding,
3601 errors = self.errors,
3602 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003603
3604 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003605 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003606 self.write_file.close()
3607 self.assertTrue(self.write_file.closed)
3608 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003609 SocketConnectedTest.clientTearDown(self)
3610
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003611 def testReadAfterTimeout(self):
3612 # Issue #7322: A file object must disallow further reads
3613 # after a timeout has occurred.
3614 self.cli_conn.settimeout(1)
3615 self.read_file.read(3)
3616 # First read raises a timeout
3617 self.assertRaises(socket.timeout, self.read_file.read, 1)
3618 # Second read is disallowed
3619 with self.assertRaises(IOError) as ctx:
3620 self.read_file.read(1)
3621 self.assertIn("cannot read from timed out object", str(ctx.exception))
3622
3623 def _testReadAfterTimeout(self):
3624 self.write_file.write(self.write_msg[0:3])
3625 self.write_file.flush()
3626 self.serv_finished.wait()
3627
Guido van Rossum24e4af82002-06-12 19:18:08 +00003628 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003629 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003630 first_seg = self.read_file.read(len(self.read_msg)-3)
3631 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003632 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003633 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003634
3635 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003636 self.write_file.write(self.write_msg)
3637 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003638
Guido van Rossum8c943832002-08-08 01:00:28 +00003639 def testFullRead(self):
3640 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003641 msg = self.read_file.read()
3642 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003643
3644 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003645 self.write_file.write(self.write_msg)
3646 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003647
Guido van Rossum24e4af82002-06-12 19:18:08 +00003648 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003649 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003650 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003651 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003652 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003653 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003654 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003655 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003656 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003657
3658 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003659 self.write_file.write(self.write_msg)
3660 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003661
3662 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003663 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003664 line = self.read_file.readline()
3665 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003666
3667 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003668 self.write_file.write(self.write_msg)
3669 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003670
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003671 def testCloseAfterMakefile(self):
3672 # The file returned by makefile should keep the socket open.
3673 self.cli_conn.close()
3674 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003675 msg = self.read_file.read()
3676 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003677
3678 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003679 self.write_file.write(self.write_msg)
3680 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003681
3682 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003683 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003684 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003685 if isinstance(self.read_msg, str):
3686 msg = msg.decode()
3687 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003688
3689 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003690 self.write_file.write(self.write_msg)
3691 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003692
Tim Peters116d83c2004-03-28 02:20:45 +00003693 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003694 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003695
3696 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003697 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003698
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003699 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003700 self.assertEqual(self.read_file.mode, self.read_mode)
3701 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003702
3703 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003704 self.assertEqual(self.write_file.mode, self.write_mode)
3705 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003706
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003707 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003708 self.read_file.close()
3709 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003710 self.cli_conn.close()
3711 self.assertRaises(socket.error, self.cli_conn.getsockname)
3712
3713 def _testRealClose(self):
3714 pass
3715
3716
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003717class FileObjectInterruptedTestCase(unittest.TestCase):
3718 """Test that the file object correctly handles EINTR internally."""
3719
3720 class MockSocket(object):
3721 def __init__(self, recv_funcs=()):
3722 # A generator that returns callables that we'll call for each
3723 # call to recv().
3724 self._recv_step = iter(recv_funcs)
3725
3726 def recv_into(self, buffer):
3727 data = next(self._recv_step)()
3728 assert len(buffer) >= len(data)
3729 buffer[:len(data)] = data
3730 return len(data)
3731
3732 def _decref_socketios(self):
3733 pass
3734
3735 def _textiowrap_for_test(self, buffering=-1):
3736 raw = socket.SocketIO(self, "r")
3737 if buffering < 0:
3738 buffering = io.DEFAULT_BUFFER_SIZE
3739 if buffering == 0:
3740 return raw
3741 buffer = io.BufferedReader(raw, buffering)
3742 text = io.TextIOWrapper(buffer, None, None)
3743 text.mode = "rb"
3744 return text
3745
3746 @staticmethod
3747 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003748 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003749
3750 def _textiowrap_mock_socket(self, mock, buffering=-1):
3751 raw = socket.SocketIO(mock, "r")
3752 if buffering < 0:
3753 buffering = io.DEFAULT_BUFFER_SIZE
3754 if buffering == 0:
3755 return raw
3756 buffer = io.BufferedReader(raw, buffering)
3757 text = io.TextIOWrapper(buffer, None, None)
3758 text.mode = "rb"
3759 return text
3760
3761 def _test_readline(self, size=-1, buffering=-1):
3762 mock_sock = self.MockSocket(recv_funcs=[
3763 lambda : b"This is the first line\nAnd the sec",
3764 self._raise_eintr,
3765 lambda : b"ond line is here\n",
3766 lambda : b"",
3767 lambda : b"", # XXX(gps): io library does an extra EOF read
3768 ])
3769 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003770 self.assertEqual(fo.readline(size), "This is the first line\n")
3771 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003772
3773 def _test_read(self, size=-1, buffering=-1):
3774 mock_sock = self.MockSocket(recv_funcs=[
3775 lambda : b"This is the first line\nAnd the sec",
3776 self._raise_eintr,
3777 lambda : b"ond line is here\n",
3778 lambda : b"",
3779 lambda : b"", # XXX(gps): io library does an extra EOF read
3780 ])
3781 expecting = (b"This is the first line\n"
3782 b"And the second line is here\n")
3783 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3784 if buffering == 0:
3785 data = b''
3786 else:
3787 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003788 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003789 while len(data) != len(expecting):
3790 part = fo.read(size)
3791 if not part:
3792 break
3793 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003794 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003795
3796 def test_default(self):
3797 self._test_readline()
3798 self._test_readline(size=100)
3799 self._test_read()
3800 self._test_read(size=100)
3801
3802 def test_with_1k_buffer(self):
3803 self._test_readline(buffering=1024)
3804 self._test_readline(size=100, buffering=1024)
3805 self._test_read(buffering=1024)
3806 self._test_read(size=100, buffering=1024)
3807
3808 def _test_readline_no_buffer(self, size=-1):
3809 mock_sock = self.MockSocket(recv_funcs=[
3810 lambda : b"a",
3811 lambda : b"\n",
3812 lambda : b"B",
3813 self._raise_eintr,
3814 lambda : b"b",
3815 lambda : b"",
3816 ])
3817 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003818 self.assertEqual(fo.readline(size), b"a\n")
3819 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003820
3821 def test_no_buffer(self):
3822 self._test_readline_no_buffer()
3823 self._test_readline_no_buffer(size=4)
3824 self._test_read(buffering=0)
3825 self._test_read(size=100, buffering=0)
3826
3827
Guido van Rossume9f66142002-08-07 15:46:19 +00003828class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3829
3830 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003831
Guido van Rossume9f66142002-08-07 15:46:19 +00003832 In this case (and in this case only), it should be possible to
3833 create a file object, read a line from it, create another file
3834 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003835 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003836 when reading multiple requests from the same socket."""
3837
3838 bufsize = 0 # Use unbuffered mode
3839
3840 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003841 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003842 line = self.read_file.readline() # first line
3843 self.assertEqual(line, b"A. " + self.write_msg) # first line
3844 self.read_file = self.cli_conn.makefile('rb', 0)
3845 line = self.read_file.readline() # second line
3846 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003847
3848 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003849 self.write_file.write(b"A. " + self.write_msg)
3850 self.write_file.write(b"B. " + self.write_msg)
3851 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003852
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003853 def testMakefileClose(self):
3854 # The file returned by makefile should keep the socket open...
3855 self.cli_conn.close()
3856 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003857 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003858 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003859 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003860 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3861
3862 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003863 self.write_file.write(self.write_msg)
3864 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003865
3866 def testMakefileCloseSocketDestroy(self):
3867 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003868 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003869 refcount_after = sys.getrefcount(self.cli_conn)
3870 self.assertEqual(refcount_before - 1, refcount_after)
3871
3872 def _testMakefileCloseSocketDestroy(self):
3873 pass
3874
Antoine Pitrou98b46702010-09-18 22:59:00 +00003875 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003876 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003877 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3878
3879 def testSmallReadNonBlocking(self):
3880 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003881 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3882 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003883 self.evt1.set()
3884 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003885 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003886 if first_seg is None:
3887 # Data not arrived (can happen under Windows), wait a bit
3888 time.sleep(0.5)
3889 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003890 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003891 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003892 self.assertEqual(n, 3)
3893 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003894 self.assertEqual(msg, self.read_msg)
3895 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3896 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003897
3898 def _testSmallReadNonBlocking(self):
3899 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003900 self.write_file.write(self.write_msg)
3901 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003902 self.evt2.set()
3903 # Avoid cloding the socket before the server test has finished,
3904 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3905 self.serv_finished.wait(5.0)
3906
3907 def testWriteNonBlocking(self):
3908 self.cli_finished.wait(5.0)
3909 # The client thread can't skip directly - the SkipTest exception
3910 # would appear as a failure.
3911 if self.serv_skipped:
3912 self.skipTest(self.serv_skipped)
3913
3914 def _testWriteNonBlocking(self):
3915 self.serv_skipped = None
3916 self.serv_conn.setblocking(False)
3917 # Try to saturate the socket buffer pipe with repeated large writes.
3918 BIG = b"x" * (1024 ** 2)
3919 LIMIT = 10
3920 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003921 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003922 self.assertGreater(n, 0)
3923 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003924 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003925 if n is None:
3926 # Succeeded
3927 break
3928 self.assertGreater(n, 0)
3929 else:
3930 # Let us know that this test didn't manage to establish
3931 # the expected conditions. This is not a failure in itself but,
3932 # if it happens repeatedly, the test should be fixed.
3933 self.serv_skipped = "failed to saturate the socket buffer"
3934
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003935
Guido van Rossum8c943832002-08-08 01:00:28 +00003936class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3937
3938 bufsize = 1 # Default-buffered for reading; line-buffered for writing
3939
3940
3941class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3942
3943 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00003944
Thomas Woutersb2137042007-02-01 18:02:27 +00003945
Antoine Pitrou834bd812010-10-13 16:17:14 +00003946class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
3947 """Tests for socket.makefile() in text mode (rather than binary)"""
3948
3949 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003950 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003951 write_mode = 'wb'
3952 write_msg = MSG
3953 newline = ''
3954
3955
3956class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
3957 """Tests for socket.makefile() in text mode (rather than binary)"""
3958
3959 read_mode = 'rb'
3960 read_msg = MSG
3961 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003962 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003963 newline = ''
3964
3965
3966class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
3967 """Tests for socket.makefile() in text mode (rather than binary)"""
3968
3969 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003970 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003971 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003972 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003973 newline = ''
3974
3975
Guido van Rossumd8faa362007-04-27 19:54:29 +00003976class NetworkConnectionTest(object):
3977 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003978
Guido van Rossumd8faa362007-04-27 19:54:29 +00003979 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003980 # We're inherited below by BasicTCPTest2, which also inherits
3981 # BasicTCPTest, which defines self.port referenced below.
3982 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003983 self.serv_conn = self.cli
3984
3985class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
3986 """Tests that NetworkConnection does not break existing TCP functionality.
3987 """
3988
3989class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003990
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003991 class MockSocket(socket.socket):
3992 def connect(self, *args):
3993 raise socket.timeout('timed out')
3994
3995 @contextlib.contextmanager
3996 def mocked_socket_module(self):
3997 """Return a socket which times out on connect"""
3998 old_socket = socket.socket
3999 socket.socket = self.MockSocket
4000 try:
4001 yield
4002 finally:
4003 socket.socket = old_socket
4004
4005 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004006 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004007 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004008 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004009 with self.assertRaises(socket.error) as cm:
4010 cli.connect((HOST, port))
4011 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4012
4013 def test_create_connection(self):
4014 # Issue #9792: errors raised by create_connection() should have
4015 # a proper errno attribute.
4016 port = support.find_unused_port()
4017 with self.assertRaises(socket.error) as cm:
4018 socket.create_connection((HOST, port))
4019 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4020
4021 def test_create_connection_timeout(self):
4022 # Issue #9792: create_connection() should not recast timeout errors
4023 # as generic socket errors.
4024 with self.mocked_socket_module():
4025 with self.assertRaises(socket.timeout):
4026 socket.create_connection((HOST, 1234))
4027
Guido van Rossumd8faa362007-04-27 19:54:29 +00004028
Victor Stinner45df8202010-04-28 22:31:17 +00004029@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004030class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4031
4032 def __init__(self, methodName='runTest'):
4033 SocketTCPTest.__init__(self, methodName=methodName)
4034 ThreadableTest.__init__(self)
4035
4036 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004037 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004038
4039 def clientTearDown(self):
4040 self.cli.close()
4041 self.cli = None
4042 ThreadableTest.clientTearDown(self)
4043
4044 def _justAccept(self):
4045 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004046 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004047
4048 testFamily = _justAccept
4049 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004050 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004051 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004052 self.assertEqual(self.cli.family, 2)
4053
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004054 testSourceAddress = _justAccept
4055 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004056 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4057 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004058 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004059 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004060 # The port number being used is sufficient to show that the bind()
4061 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004062
Guido van Rossumd8faa362007-04-27 19:54:29 +00004063 testTimeoutDefault = _justAccept
4064 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004065 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004066 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004067 socket.setdefaulttimeout(42)
4068 try:
4069 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004070 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004071 finally:
4072 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004073 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004074
4075 testTimeoutNone = _justAccept
4076 def _testTimeoutNone(self):
4077 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004078 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004079 socket.setdefaulttimeout(30)
4080 try:
4081 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004082 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004083 finally:
4084 socket.setdefaulttimeout(None)
4085 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004086
4087 testTimeoutValueNamed = _justAccept
4088 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004089 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004090 self.assertEqual(self.cli.gettimeout(), 30)
4091
4092 testTimeoutValueNonamed = _justAccept
4093 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004094 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004095 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004096 self.assertEqual(self.cli.gettimeout(), 30)
4097
Victor Stinner45df8202010-04-28 22:31:17 +00004098@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004099class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4100
4101 def __init__(self, methodName='runTest'):
4102 SocketTCPTest.__init__(self, methodName=methodName)
4103 ThreadableTest.__init__(self)
4104
4105 def clientSetUp(self):
4106 pass
4107
4108 def clientTearDown(self):
4109 self.cli.close()
4110 self.cli = None
4111 ThreadableTest.clientTearDown(self)
4112
4113 def testInsideTimeout(self):
4114 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004115 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004116 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004117 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004118 testOutsideTimeout = testInsideTimeout
4119
4120 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004121 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004122 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004123 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004124
4125 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004126 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004127 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004128
4129
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004130class TCPTimeoutTest(SocketTCPTest):
4131
4132 def testTCPTimeout(self):
4133 def raise_timeout(*args, **kwargs):
4134 self.serv.settimeout(1.0)
4135 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004136 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004137 "Error generating a timeout exception (TCP)")
4138
4139 def testTimeoutZero(self):
4140 ok = False
4141 try:
4142 self.serv.settimeout(0.0)
4143 foo = self.serv.accept()
4144 except socket.timeout:
4145 self.fail("caught timeout instead of error (TCP)")
4146 except socket.error:
4147 ok = True
4148 except:
4149 self.fail("caught unexpected exception (TCP)")
4150 if not ok:
4151 self.fail("accept() returned success when we did not expect it")
4152
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004153 def testInterruptedTimeout(self):
4154 # XXX I don't know how to do this test on MSWindows or any other
4155 # plaform that doesn't support signal.alarm() or os.kill(), though
4156 # the bug should have existed on all platforms.
4157 if not hasattr(signal, "alarm"):
4158 return # can only test on *nix
4159 self.serv.settimeout(5.0) # must be longer than alarm
4160 class Alarm(Exception):
4161 pass
4162 def alarm_handler(signal, frame):
4163 raise Alarm
4164 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4165 try:
4166 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4167 try:
4168 foo = self.serv.accept()
4169 except socket.timeout:
4170 self.fail("caught timeout instead of Alarm")
4171 except Alarm:
4172 pass
4173 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004174 self.fail("caught other exception instead of Alarm:"
4175 " %s(%s):\n%s" %
4176 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004177 else:
4178 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004179 finally:
4180 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004181 except Alarm:
4182 self.fail("got Alarm in wrong place")
4183 finally:
4184 # no alarm can be pending. Safe to restore old handler.
4185 signal.signal(signal.SIGALRM, old_alarm)
4186
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004187class UDPTimeoutTest(SocketTCPTest):
4188
4189 def testUDPTimeout(self):
4190 def raise_timeout(*args, **kwargs):
4191 self.serv.settimeout(1.0)
4192 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004193 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004194 "Error generating a timeout exception (UDP)")
4195
4196 def testTimeoutZero(self):
4197 ok = False
4198 try:
4199 self.serv.settimeout(0.0)
4200 foo = self.serv.recv(1024)
4201 except socket.timeout:
4202 self.fail("caught timeout instead of error (UDP)")
4203 except socket.error:
4204 ok = True
4205 except:
4206 self.fail("caught unexpected exception (UDP)")
4207 if not ok:
4208 self.fail("recv() returned success when we did not expect it")
4209
4210class TestExceptions(unittest.TestCase):
4211
4212 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004213 self.assertTrue(issubclass(socket.error, Exception))
4214 self.assertTrue(issubclass(socket.herror, socket.error))
4215 self.assertTrue(issubclass(socket.gaierror, socket.error))
4216 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004217
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004218class TestLinuxAbstractNamespace(unittest.TestCase):
4219
4220 UNIX_PATH_MAX = 108
4221
4222 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004223 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004224 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4225 s1.bind(address)
4226 s1.listen(1)
4227 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4228 s2.connect(s1.getsockname())
4229 with s1.accept()[0] as s3:
4230 self.assertEqual(s1.getsockname(), address)
4231 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004232
4233 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004234 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004235 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4236 s.bind(address)
4237 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004238
4239 def testNameOverflow(self):
4240 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004241 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4242 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004243
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004244
Victor Stinner45df8202010-04-28 22:31:17 +00004245@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004246class BufferIOTest(SocketConnectedTest):
4247 """
4248 Test the buffer versions of socket.recv() and socket.send().
4249 """
4250 def __init__(self, methodName='runTest'):
4251 SocketConnectedTest.__init__(self, methodName=methodName)
4252
Antoine Pitrou25480782010-03-17 22:50:28 +00004253 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004254 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004255 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004256 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004257 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004258 self.assertEqual(msg, MSG)
4259
Antoine Pitrou25480782010-03-17 22:50:28 +00004260 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004261 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004262 self.serv_conn.send(buf)
4263
Antoine Pitrou25480782010-03-17 22:50:28 +00004264 def testRecvIntoBytearray(self):
4265 buf = bytearray(1024)
4266 nbytes = self.cli_conn.recv_into(buf)
4267 self.assertEqual(nbytes, len(MSG))
4268 msg = buf[:len(MSG)]
4269 self.assertEqual(msg, MSG)
4270
4271 _testRecvIntoBytearray = _testRecvIntoArray
4272
4273 def testRecvIntoMemoryview(self):
4274 buf = bytearray(1024)
4275 nbytes = self.cli_conn.recv_into(memoryview(buf))
4276 self.assertEqual(nbytes, len(MSG))
4277 msg = buf[:len(MSG)]
4278 self.assertEqual(msg, MSG)
4279
4280 _testRecvIntoMemoryview = _testRecvIntoArray
4281
4282 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004283 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004284 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004285 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004286 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004287 self.assertEqual(msg, MSG)
4288
Antoine Pitrou25480782010-03-17 22:50:28 +00004289 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004290 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004291 self.serv_conn.send(buf)
4292
Antoine Pitrou25480782010-03-17 22:50:28 +00004293 def testRecvFromIntoBytearray(self):
4294 buf = bytearray(1024)
4295 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4296 self.assertEqual(nbytes, len(MSG))
4297 msg = buf[:len(MSG)]
4298 self.assertEqual(msg, MSG)
4299
4300 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4301
4302 def testRecvFromIntoMemoryview(self):
4303 buf = bytearray(1024)
4304 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4305 self.assertEqual(nbytes, len(MSG))
4306 msg = buf[:len(MSG)]
4307 self.assertEqual(msg, MSG)
4308
4309 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4310
Christian Heimes043d6f62008-01-07 17:19:16 +00004311
4312TIPC_STYPE = 2000
4313TIPC_LOWER = 200
4314TIPC_UPPER = 210
4315
4316def isTipcAvailable():
4317 """Check if the TIPC module is loaded
4318
4319 The TIPC module is not loaded automatically on Ubuntu and probably
4320 other Linux distros.
4321 """
4322 if not hasattr(socket, "AF_TIPC"):
4323 return False
4324 if not os.path.isfile("/proc/modules"):
4325 return False
4326 with open("/proc/modules") as f:
4327 for line in f:
4328 if line.startswith("tipc "):
4329 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004330 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004331 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4332 return False
4333
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004334class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004335 def testRDM(self):
4336 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4337 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004338 self.addCleanup(srv.close)
4339 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004340
4341 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4342 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4343 TIPC_LOWER, TIPC_UPPER)
4344 srv.bind(srvaddr)
4345
4346 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4347 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4348 cli.sendto(MSG, sendaddr)
4349
4350 msg, recvaddr = srv.recvfrom(1024)
4351
4352 self.assertEqual(cli.getsockname(), recvaddr)
4353 self.assertEqual(msg, MSG)
4354
4355
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004356class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004357 def __init__(self, methodName = 'runTest'):
4358 unittest.TestCase.__init__(self, methodName = methodName)
4359 ThreadableTest.__init__(self)
4360
4361 def setUp(self):
4362 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004363 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004364 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4365 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4366 TIPC_LOWER, TIPC_UPPER)
4367 self.srv.bind(srvaddr)
4368 self.srv.listen(5)
4369 self.serverExplicitReady()
4370 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004371 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004372
4373 def clientSetUp(self):
4374 # The is a hittable race between serverExplicitReady() and the
4375 # accept() call; sleep a little while to avoid it, otherwise
4376 # we could get an exception
4377 time.sleep(0.1)
4378 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004379 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004380 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4381 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4382 self.cli.connect(addr)
4383 self.cliaddr = self.cli.getsockname()
4384
4385 def testStream(self):
4386 msg = self.conn.recv(1024)
4387 self.assertEqual(msg, MSG)
4388 self.assertEqual(self.cliaddr, self.connaddr)
4389
4390 def _testStream(self):
4391 self.cli.send(MSG)
4392 self.cli.close()
4393
4394
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004395@unittest.skipUnless(thread, 'Threading required for this test.')
4396class ContextManagersTest(ThreadedTCPSocketTest):
4397
4398 def _testSocketClass(self):
4399 # base test
4400 with socket.socket() as sock:
4401 self.assertFalse(sock._closed)
4402 self.assertTrue(sock._closed)
4403 # close inside with block
4404 with socket.socket() as sock:
4405 sock.close()
4406 self.assertTrue(sock._closed)
4407 # exception inside with block
4408 with socket.socket() as sock:
4409 self.assertRaises(socket.error, sock.sendall, b'foo')
4410 self.assertTrue(sock._closed)
4411
4412 def testCreateConnectionBase(self):
4413 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004414 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004415 data = conn.recv(1024)
4416 conn.sendall(data)
4417
4418 def _testCreateConnectionBase(self):
4419 address = self.serv.getsockname()
4420 with socket.create_connection(address) as sock:
4421 self.assertFalse(sock._closed)
4422 sock.sendall(b'foo')
4423 self.assertEqual(sock.recv(1024), b'foo')
4424 self.assertTrue(sock._closed)
4425
4426 def testCreateConnectionClose(self):
4427 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004428 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004429 data = conn.recv(1024)
4430 conn.sendall(data)
4431
4432 def _testCreateConnectionClose(self):
4433 address = self.serv.getsockname()
4434 with socket.create_connection(address) as sock:
4435 sock.close()
4436 self.assertTrue(sock._closed)
4437 self.assertRaises(socket.error, sock.sendall, b'foo')
4438
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004439
Antoine Pitroub1c54962010-10-14 15:05:38 +00004440@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4441 "SOCK_CLOEXEC not defined")
4442@unittest.skipUnless(fcntl, "module fcntl not available")
4443class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004444 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004445 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004446 with socket.socket(socket.AF_INET,
4447 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4448 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4449 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004450
4451
4452@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4453 "SOCK_NONBLOCK not defined")
4454class NonblockConstantTest(unittest.TestCase):
4455 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4456 if nonblock:
4457 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4458 self.assertEqual(s.gettimeout(), timeout)
4459 else:
4460 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4461 self.assertEqual(s.gettimeout(), None)
4462
Charles-François Natali239bb962011-06-03 12:55:15 +02004463 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004464 def test_SOCK_NONBLOCK(self):
4465 # a lot of it seems silly and redundant, but I wanted to test that
4466 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004467 with socket.socket(socket.AF_INET,
4468 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4469 self.checkNonblock(s)
4470 s.setblocking(1)
4471 self.checkNonblock(s, False)
4472 s.setblocking(0)
4473 self.checkNonblock(s)
4474 s.settimeout(None)
4475 self.checkNonblock(s, False)
4476 s.settimeout(2.0)
4477 self.checkNonblock(s, timeout=2.0)
4478 s.setblocking(1)
4479 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004480 # defaulttimeout
4481 t = socket.getdefaulttimeout()
4482 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004483 with socket.socket() as s:
4484 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004485 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004486 with socket.socket() as s:
4487 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004488 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004489 with socket.socket() as s:
4490 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004491 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004492 with socket.socket() as s:
4493 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004494 socket.setdefaulttimeout(t)
4495
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004496
Guido van Rossumb995eb72002-07-31 16:08:40 +00004497def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004498 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004499 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004500
4501 tests.extend([
4502 NonBlockingTCPTests,
4503 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004504 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004505 UnbufferedFileObjectClassTestCase,
4506 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004507 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004508 UnicodeReadFileObjectClassTestCase,
4509 UnicodeWriteFileObjectClassTestCase,
4510 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004511 NetworkConnectionNoServer,
4512 NetworkConnectionAttributesTest,
4513 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004514 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004515 CloexecConstantTest,
4516 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004517 ])
Dave Cole331708b2004-08-09 04:51:41 +00004518 if hasattr(socket, "socketpair"):
4519 tests.append(BasicSocketPairTest)
Victor Stinnere6747472011-08-21 00:39:18 +02004520 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004521 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004522 if isTipcAvailable():
4523 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004524 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004525 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004526 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004527 tests.extend([
4528 CmsgMacroTests,
4529 SendmsgUDPTest,
4530 RecvmsgUDPTest,
4531 RecvmsgIntoUDPTest,
4532 SendmsgUDP6Test,
4533 RecvmsgUDP6Test,
4534 RecvmsgRFC3542AncillaryUDP6Test,
4535 RecvmsgIntoRFC3542AncillaryUDP6Test,
4536 RecvmsgIntoUDP6Test,
4537 SendmsgTCPTest,
4538 RecvmsgTCPTest,
4539 RecvmsgIntoTCPTest,
4540 SendmsgSCTPStreamTest,
4541 RecvmsgSCTPStreamTest,
4542 RecvmsgIntoSCTPStreamTest,
4543 SendmsgUnixStreamTest,
4544 RecvmsgUnixStreamTest,
4545 RecvmsgIntoUnixStreamTest,
4546 RecvmsgSCMRightsStreamTest,
4547 RecvmsgIntoSCMRightsStreamTest,
4548 # These are slow when setitimer() is not available
4549 InterruptedRecvTimeoutTest,
4550 InterruptedSendTimeoutTest,
4551 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004552
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004553 thread_info = support.threading_setup()
4554 support.run_unittest(*tests)
4555 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004556
4557if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004558 test_main()