blob: a7cee59910259d01aff748f7e9786df82fd54b81 [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
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100898 assertInvalid = lambda func,a: self.assertRaises(
899 (socket.error, ValueError), func, a
900 )
901
Ezio Melottib3aedd42010-11-20 19:04:17 +0000902 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
903 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
904 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
905 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
906 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100907 assertInvalid(f, '0.0.0.')
908 assertInvalid(f, '300.0.0.0')
909 assertInvalid(f, 'a.0.0.0')
910 assertInvalid(f, '1.2.3.4.5')
911 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000912
Ezio Melottib3aedd42010-11-20 19:04:17 +0000913 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
914 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
915 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
916 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100917 assertInvalid(g, '0.0.0.')
918 assertInvalid(g, '300.0.0.0')
919 assertInvalid(g, 'a.0.0.0')
920 assertInvalid(g, '1.2.3.4.5')
921 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000922
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000923 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000924 if not hasattr(socket, 'inet_pton'):
925 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000926 try:
927 from socket import inet_pton, AF_INET6, has_ipv6
928 if not has_ipv6:
929 return
930 except ImportError:
931 return
932 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100933 assertInvalid = lambda a: self.assertRaises(
934 (socket.error, ValueError), f, a
935 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000936
Ezio Melottib3aedd42010-11-20 19:04:17 +0000937 self.assertEqual(b'\x00' * 16, f('::'))
938 self.assertEqual(b'\x00' * 16, f('0::0'))
939 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
940 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000941 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 +0000942 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
943 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100944 self.assertEqual(
945 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
946 f('ad42:abc::127:0:254:2')
947 )
948 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
949 assertInvalid('0x20::')
950 assertInvalid(':::')
951 assertInvalid('::0::')
952 assertInvalid('1::abc::')
953 assertInvalid('1::abc::def')
954 assertInvalid('1:2:3:4:5:6:')
955 assertInvalid('1:2:3:4:5:6')
956 assertInvalid('1:2:3:4:5:6:7:8:')
957 assertInvalid('1:2:3:4:5:6:7:8:0')
958
959 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
960 f('::254.42.23.64')
961 )
962 self.assertEqual(
963 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
964 f('42::a29b:254.42.23.64')
965 )
966 self.assertEqual(
967 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
968 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
969 )
970 assertInvalid('255.254.253.252')
971 assertInvalid('1::260.2.3.0')
972 assertInvalid('1::0.be.e.0')
973 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
974 assertInvalid('::1.2.3.4:0')
975 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +0000976
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000977 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000978 if not hasattr(socket, 'inet_ntop'):
979 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000980 from socket import inet_ntoa as f, inet_ntop, AF_INET
981 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100982 assertInvalid = lambda func,a: self.assertRaises(
983 (socket.error, ValueError), func, a
984 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000985
Ezio Melottib3aedd42010-11-20 19:04:17 +0000986 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
987 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
988 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
989 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100990 assertInvalid(f, b'\x00' * 3)
991 assertInvalid(f, b'\x00' * 5)
992 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +0000993
Ezio Melottib3aedd42010-11-20 19:04:17 +0000994 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
995 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
996 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100997 assertInvalid(g, b'\x00' * 3)
998 assertInvalid(g, b'\x00' * 5)
999 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001000
1001 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001002 if not hasattr(socket, 'inet_ntop'):
1003 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001004 try:
1005 from socket import inet_ntop, AF_INET6, has_ipv6
1006 if not has_ipv6:
1007 return
1008 except ImportError:
1009 return
1010 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001011 assertInvalid = lambda a: self.assertRaises(
1012 (socket.error, ValueError), f, a
1013 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001014
Ezio Melottib3aedd42010-11-20 19:04:17 +00001015 self.assertEqual('::', f(b'\x00' * 16))
1016 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1017 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001018 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001019 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 +00001020 )
1021
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001022 assertInvalid(b'\x12' * 15)
1023 assertInvalid(b'\x12' * 17)
1024 assertInvalid(b'\x12' * 4)
1025
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001026 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001027
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001028 def testSockName(self):
1029 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001030 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001031 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001032 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001033 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001034 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001035 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1036 # it reasonable to get the host's addr in addition to 0.0.0.0.
1037 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001038 try:
1039 my_ip_addr = socket.gethostbyname(socket.gethostname())
1040 except socket.error:
1041 # Probably name lookup wasn't set up right; skip this test
1042 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001043 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001044 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001045
1046 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001047 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001048 # We know a socket should start without reuse==0
1049 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001050 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001051 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001052 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001053
1054 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001055 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001056 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001057 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1059 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001060 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001062 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001063 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001064 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1065 sock.settimeout(1)
1066 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001067 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001068
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001069 def testNewAttributes(self):
1070 # testing .family, .type and .protocol
1071 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1072 self.assertEqual(sock.family, socket.AF_INET)
1073 self.assertEqual(sock.type, socket.SOCK_STREAM)
1074 self.assertEqual(sock.proto, 0)
1075 sock.close()
1076
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001077 def test_getsockaddrarg(self):
1078 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001079 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001080 big_port = port + 65536
1081 neg_port = port - 65536
1082 sock = socket.socket()
1083 try:
1084 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1085 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1086 sock.bind((host, port))
1087 finally:
1088 sock.close()
1089
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001090 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001091 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001092 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1093 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1094 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1095 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001096 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1097 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001098 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001099 self.assertRaises(ValueError, s.ioctl, -1, None)
1100 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001101
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001102 def testGetaddrinfo(self):
1103 try:
1104 socket.getaddrinfo('localhost', 80)
1105 except socket.gaierror as err:
1106 if err.errno == socket.EAI_SERVICE:
1107 # see http://bugs.python.org/issue1282647
1108 self.skipTest("buggy libc version")
1109 raise
1110 # len of every sequence is supposed to be == 5
1111 for info in socket.getaddrinfo(HOST, None):
1112 self.assertEqual(len(info), 5)
1113 # host can be a domain name, a string representation of an
1114 # IPv4/v6 address or None
1115 socket.getaddrinfo('localhost', 80)
1116 socket.getaddrinfo('127.0.0.1', 80)
1117 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001118 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001119 socket.getaddrinfo('::1', 80)
1120 # port can be a string service name such as "http", a numeric
1121 # port number or None
1122 socket.getaddrinfo(HOST, "http")
1123 socket.getaddrinfo(HOST, 80)
1124 socket.getaddrinfo(HOST, None)
1125 # test family and socktype filters
1126 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1127 for family, _, _, _, _ in infos:
1128 self.assertEqual(family, socket.AF_INET)
1129 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1130 for _, socktype, _, _, _ in infos:
1131 self.assertEqual(socktype, socket.SOCK_STREAM)
1132 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001133 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001134 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1135 # a server willing to support both IPv4 and IPv6 will
1136 # usually do this
1137 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1138 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001139 # test keyword arguments
1140 a = socket.getaddrinfo(HOST, None)
1141 b = socket.getaddrinfo(host=HOST, port=None)
1142 self.assertEqual(a, b)
1143 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1144 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1145 self.assertEqual(a, b)
1146 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1147 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1148 self.assertEqual(a, b)
1149 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1150 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1151 self.assertEqual(a, b)
1152 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1153 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1154 self.assertEqual(a, b)
1155 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1156 socket.AI_PASSIVE)
1157 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1158 type=socket.SOCK_STREAM, proto=0,
1159 flags=socket.AI_PASSIVE)
1160 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001161 # Issue #6697.
1162 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001163
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001164 def test_getnameinfo(self):
1165 # only IP addresses are allowed
1166 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1167
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001168 @unittest.skipUnless(support.is_resource_enabled('network'),
1169 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001170 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +00001171 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001172 # these should all be successful
1173 socket.gethostbyname('испытание.python.org')
1174 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001175 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1176 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1177 # have a reverse entry yet
1178 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001179
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001180 def check_sendall_interrupted(self, with_timeout):
1181 # socketpair() is not stricly required, but it makes things easier.
1182 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1183 self.skipTest("signal.alarm and socket.socketpair required for this test")
1184 # Our signal handlers clobber the C errno by calling a math function
1185 # with an invalid domain value.
1186 def ok_handler(*args):
1187 self.assertRaises(ValueError, math.acosh, 0)
1188 def raising_handler(*args):
1189 self.assertRaises(ValueError, math.acosh, 0)
1190 1 // 0
1191 c, s = socket.socketpair()
1192 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1193 try:
1194 if with_timeout:
1195 # Just above the one second minimum for signal.alarm
1196 c.settimeout(1.5)
1197 with self.assertRaises(ZeroDivisionError):
1198 signal.alarm(1)
1199 c.sendall(b"x" * (1024**2))
1200 if with_timeout:
1201 signal.signal(signal.SIGALRM, ok_handler)
1202 signal.alarm(1)
1203 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1204 finally:
1205 signal.signal(signal.SIGALRM, old_alarm)
1206 c.close()
1207 s.close()
1208
1209 def test_sendall_interrupted(self):
1210 self.check_sendall_interrupted(False)
1211
1212 def test_sendall_interrupted_with_timeout(self):
1213 self.check_sendall_interrupted(True)
1214
Antoine Pitroue033e062010-10-29 10:38:18 +00001215 def test_dealloc_warn(self):
1216 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1217 r = repr(sock)
1218 with self.assertWarns(ResourceWarning) as cm:
1219 sock = None
1220 support.gc_collect()
1221 self.assertIn(r, str(cm.warning.args[0]))
1222 # An open socket file object gets dereferenced after the socket
1223 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1224 f = sock.makefile('rb')
1225 r = repr(sock)
1226 sock = None
1227 support.gc_collect()
1228 with self.assertWarns(ResourceWarning):
1229 f = None
1230 support.gc_collect()
1231
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001232 def test_name_closed_socketio(self):
1233 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1234 fp = sock.makefile("rb")
1235 fp.close()
1236 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1237
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001238 def test_pickle(self):
1239 sock = socket.socket()
1240 with sock:
1241 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1242 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1243
Antoine Pitrou3cade992011-05-10 19:19:13 +02001244 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001245 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1246 srv.bind((HOST, 0))
1247 # backlog = 0
1248 srv.listen(0)
1249 srv.close()
1250
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001251
Charles-François Natali47413c12011-10-06 19:47:44 +02001252@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1253class BasicCANTest(unittest.TestCase):
1254
1255 def testCrucialConstants(self):
1256 socket.AF_CAN
1257 socket.PF_CAN
1258 socket.CAN_RAW
1259
1260 def testCreateSocket(self):
1261 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1262 pass
1263
1264 def testBindAny(self):
1265 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1266 s.bind(('', ))
1267
1268 def testTooLongInterfaceName(self):
1269 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1270 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001271 self.assertRaisesRegex(socket.error, 'interface name too long',
1272 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001273
1274 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1275 'socket.CAN_RAW_LOOPBACK required for this test.')
1276 def testLoopback(self):
1277 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1278 for loopback in (0, 1):
1279 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1280 loopback)
1281 self.assertEqual(loopback,
1282 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1283
1284 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1285 'socket.CAN_RAW_FILTER required for this test.')
1286 def testFilter(self):
1287 can_id, can_mask = 0x200, 0x700
1288 can_filter = struct.pack("=II", can_id, can_mask)
1289 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1290 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1291 self.assertEqual(can_filter,
1292 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1293
1294
1295@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1296@unittest.skipUnless(thread, 'Threading required for this test.')
1297class CANTest(ThreadedCANSocketTest):
1298
1299 """The CAN frame structure is defined in <linux/can.h>:
1300
1301 struct can_frame {
1302 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1303 __u8 can_dlc; /* data length code: 0 .. 8 */
1304 __u8 data[8] __attribute__((aligned(8)));
1305 };
1306 """
1307 can_frame_fmt = "=IB3x8s"
1308
1309 def __init__(self, methodName='runTest'):
1310 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1311
1312 @classmethod
1313 def build_can_frame(cls, can_id, data):
1314 """Build a CAN frame."""
1315 can_dlc = len(data)
1316 data = data.ljust(8, b'\x00')
1317 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1318
1319 @classmethod
1320 def dissect_can_frame(cls, frame):
1321 """Dissect a CAN frame."""
1322 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1323 return (can_id, can_dlc, data[:can_dlc])
1324
1325 def testSendFrame(self):
1326 cf, addr = self.s.recvfrom(self.bufsize)
1327 self.assertEqual(self.cf, cf)
1328 self.assertEqual(addr[0], self.interface)
1329 self.assertEqual(addr[1], socket.AF_CAN)
1330
1331 def _testSendFrame(self):
1332 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1333 self.cli.send(self.cf)
1334
1335 def testSendMaxFrame(self):
1336 cf, addr = self.s.recvfrom(self.bufsize)
1337 self.assertEqual(self.cf, cf)
1338
1339 def _testSendMaxFrame(self):
1340 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1341 self.cli.send(self.cf)
1342
1343 def testSendMultiFrames(self):
1344 cf, addr = self.s.recvfrom(self.bufsize)
1345 self.assertEqual(self.cf1, cf)
1346
1347 cf, addr = self.s.recvfrom(self.bufsize)
1348 self.assertEqual(self.cf2, cf)
1349
1350 def _testSendMultiFrames(self):
1351 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1352 self.cli.send(self.cf1)
1353
1354 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1355 self.cli.send(self.cf2)
1356
1357
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001358@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1359class BasicRDSTest(unittest.TestCase):
1360
1361 def testCrucialConstants(self):
1362 socket.AF_RDS
1363 socket.PF_RDS
1364
1365 def testCreateSocket(self):
1366 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1367 pass
1368
1369 def testSocketBufferSize(self):
1370 bufsize = 16384
1371 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1372 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1373 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1374
1375
1376@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1377@unittest.skipUnless(thread, 'Threading required for this test.')
1378class RDSTest(ThreadedRDSSocketTest):
1379
1380 def __init__(self, methodName='runTest'):
1381 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1382
Charles-François Natali240c55f2011-11-10 20:33:36 +01001383 def setUp(self):
1384 super().setUp()
1385 self.evt = threading.Event()
1386
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001387 def testSendAndRecv(self):
1388 data, addr = self.serv.recvfrom(self.bufsize)
1389 self.assertEqual(self.data, data)
1390 self.assertEqual(self.cli_addr, addr)
1391
1392 def _testSendAndRecv(self):
1393 self.data = b'spam'
1394 self.cli.sendto(self.data, 0, (HOST, self.port))
1395
1396 def testPeek(self):
1397 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1398 self.assertEqual(self.data, data)
1399 data, addr = self.serv.recvfrom(self.bufsize)
1400 self.assertEqual(self.data, data)
1401
1402 def _testPeek(self):
1403 self.data = b'spam'
1404 self.cli.sendto(self.data, 0, (HOST, self.port))
1405
1406 @requireAttrs(socket.socket, 'recvmsg')
1407 def testSendAndRecvMsg(self):
1408 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1409 self.assertEqual(self.data, data)
1410
1411 @requireAttrs(socket.socket, 'sendmsg')
1412 def _testSendAndRecvMsg(self):
1413 self.data = b'hello ' * 10
1414 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1415
1416 def testSendAndRecvMulti(self):
1417 data, addr = self.serv.recvfrom(self.bufsize)
1418 self.assertEqual(self.data1, data)
1419
1420 data, addr = self.serv.recvfrom(self.bufsize)
1421 self.assertEqual(self.data2, data)
1422
1423 def _testSendAndRecvMulti(self):
1424 self.data1 = b'bacon'
1425 self.cli.sendto(self.data1, 0, (HOST, self.port))
1426
1427 self.data2 = b'egg'
1428 self.cli.sendto(self.data2, 0, (HOST, self.port))
1429
1430 def testSelect(self):
1431 r, w, x = select.select([self.serv], [], [], 3.0)
1432 self.assertIn(self.serv, r)
1433 data, addr = self.serv.recvfrom(self.bufsize)
1434 self.assertEqual(self.data, data)
1435
1436 def _testSelect(self):
1437 self.data = b'select'
1438 self.cli.sendto(self.data, 0, (HOST, self.port))
1439
1440 def testCongestion(self):
1441 # wait until the sender is done
1442 self.evt.wait()
1443
1444 def _testCongestion(self):
1445 # test the behavior in case of congestion
1446 self.data = b'fill'
1447 self.cli.setblocking(False)
1448 try:
1449 # try to lower the receiver's socket buffer size
1450 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1451 except OSError:
1452 pass
1453 with self.assertRaises(OSError) as cm:
1454 try:
1455 # fill the receiver's socket buffer
1456 while True:
1457 self.cli.sendto(self.data, 0, (HOST, self.port))
1458 finally:
1459 # signal the receiver we're done
1460 self.evt.set()
1461 # sendto() should have failed with ENOBUFS
1462 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1463 # and we should have received a congestion notification through poll
1464 r, w, x = select.select([self.serv], [], [], 3.0)
1465 self.assertIn(self.serv, r)
1466
1467
Victor Stinner45df8202010-04-28 22:31:17 +00001468@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001469class BasicTCPTest(SocketConnectedTest):
1470
1471 def __init__(self, methodName='runTest'):
1472 SocketConnectedTest.__init__(self, methodName=methodName)
1473
1474 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001475 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001476 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001477 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001478
1479 def _testRecv(self):
1480 self.serv_conn.send(MSG)
1481
1482 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001483 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001484 seg1 = self.cli_conn.recv(len(MSG) - 3)
1485 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001486 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001487 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001488
1489 def _testOverFlowRecv(self):
1490 self.serv_conn.send(MSG)
1491
1492 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001493 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001494 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001495 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001496
1497 def _testRecvFrom(self):
1498 self.serv_conn.send(MSG)
1499
1500 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001501 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001502 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1503 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001504 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001505 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001506
1507 def _testOverFlowRecvFrom(self):
1508 self.serv_conn.send(MSG)
1509
1510 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001511 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001512 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001513 while 1:
1514 read = self.cli_conn.recv(1024)
1515 if not read:
1516 break
Guido van Rossume531e292002-08-08 20:28:34 +00001517 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001518 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001519
1520 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001521 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001522 self.serv_conn.sendall(big_chunk)
1523
1524 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001525 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001526 fd = self.cli_conn.fileno()
1527 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001528 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001529 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001530 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001531 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001532
1533 def _testFromFd(self):
1534 self.serv_conn.send(MSG)
1535
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001536 def testDup(self):
1537 # Testing dup()
1538 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001539 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001540 msg = sock.recv(1024)
1541 self.assertEqual(msg, MSG)
1542
1543 def _testDup(self):
1544 self.serv_conn.send(MSG)
1545
Guido van Rossum24e4af82002-06-12 19:18:08 +00001546 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001547 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001548 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001549 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001550 # wait for _testShutdown to finish: on OS X, when the server
1551 # closes the connection the client also becomes disconnected,
1552 # and the client's shutdown call will fail. (Issue #4397.)
1553 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001554
1555 def _testShutdown(self):
1556 self.serv_conn.send(MSG)
1557 self.serv_conn.shutdown(2)
1558
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001559 def testDetach(self):
1560 # Testing detach()
1561 fileno = self.cli_conn.fileno()
1562 f = self.cli_conn.detach()
1563 self.assertEqual(f, fileno)
1564 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001565 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1566 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001567 # ...but we can create another socket using the (still open)
1568 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001569 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001570 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001571 msg = sock.recv(1024)
1572 self.assertEqual(msg, MSG)
1573
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001574 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001575 self.serv_conn.send(MSG)
1576
Victor Stinner45df8202010-04-28 22:31:17 +00001577@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001578class BasicUDPTest(ThreadedUDPSocketTest):
1579
1580 def __init__(self, methodName='runTest'):
1581 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1582
1583 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001584 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001585 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001586 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001587
1588 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001589 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001590
Guido van Rossum1c938012002-06-12 21:17:20 +00001591 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001592 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001593 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001594 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001595
Guido van Rossum1c938012002-06-12 21:17:20 +00001596 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001597 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001598
Guido van Rossumd8faa362007-04-27 19:54:29 +00001599 def testRecvFromNegative(self):
1600 # Negative lengths passed to recvfrom should give ValueError.
1601 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1602
1603 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001604 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001605
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001606# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1607# same test code is used with different families and types of socket
1608# (e.g. stream, datagram), and tests using recvmsg() are repeated
1609# using recvmsg_into().
1610#
1611# The generic test classes such as SendmsgTests and
1612# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1613# supplied with sockets cli_sock and serv_sock representing the
1614# client's and the server's end of the connection respectively, and
1615# attributes cli_addr and serv_addr holding their (numeric where
1616# appropriate) addresses.
1617#
1618# The final concrete test classes combine these with subclasses of
1619# SocketTestBase which set up client and server sockets of a specific
1620# type, and with subclasses of SendrecvmsgBase such as
1621# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1622# sockets to cli_sock and serv_sock and override the methods and
1623# attributes of SendrecvmsgBase to fill in destination addresses if
1624# needed when sending, check for specific flags in msg_flags, etc.
1625#
1626# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1627# recvmsg_into().
1628
1629# XXX: like the other datagram (UDP) tests in this module, the code
1630# here assumes that datagram delivery on the local machine will be
1631# reliable.
1632
1633class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1634 # Base class for sendmsg()/recvmsg() tests.
1635
1636 # Time in seconds to wait before considering a test failed, or
1637 # None for no timeout. Not all tests actually set a timeout.
1638 fail_timeout = 3.0
1639
1640 def setUp(self):
1641 self.misc_event = threading.Event()
1642 super().setUp()
1643
1644 def sendToServer(self, msg):
1645 # Send msg to the server.
1646 return self.cli_sock.send(msg)
1647
1648 # Tuple of alternative default arguments for sendmsg() when called
1649 # via sendmsgToServer() (e.g. to include a destination address).
1650 sendmsg_to_server_defaults = ()
1651
1652 def sendmsgToServer(self, *args):
1653 # Call sendmsg() on self.cli_sock with the given arguments,
1654 # filling in any arguments which are not supplied with the
1655 # corresponding items of self.sendmsg_to_server_defaults, if
1656 # any.
1657 return self.cli_sock.sendmsg(
1658 *(args + self.sendmsg_to_server_defaults[len(args):]))
1659
1660 def doRecvmsg(self, sock, bufsize, *args):
1661 # Call recvmsg() on sock with given arguments and return its
1662 # result. Should be used for tests which can use either
1663 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1664 # this method with one which emulates it using recvmsg_into(),
1665 # thus allowing the same test to be used for both methods.
1666 result = sock.recvmsg(bufsize, *args)
1667 self.registerRecvmsgResult(result)
1668 return result
1669
1670 def registerRecvmsgResult(self, result):
1671 # Called by doRecvmsg() with the return value of recvmsg() or
1672 # recvmsg_into(). Can be overridden to arrange cleanup based
1673 # on the returned ancillary data, for instance.
1674 pass
1675
1676 def checkRecvmsgAddress(self, addr1, addr2):
1677 # Called to compare the received address with the address of
1678 # the peer.
1679 self.assertEqual(addr1, addr2)
1680
1681 # Flags that are normally unset in msg_flags
1682 msg_flags_common_unset = 0
1683 for name in ("MSG_CTRUNC", "MSG_OOB"):
1684 msg_flags_common_unset |= getattr(socket, name, 0)
1685
1686 # Flags that are normally set
1687 msg_flags_common_set = 0
1688
1689 # Flags set when a complete record has been received (e.g. MSG_EOR
1690 # for SCTP)
1691 msg_flags_eor_indicator = 0
1692
1693 # Flags set when a complete record has not been received
1694 # (e.g. MSG_TRUNC for datagram sockets)
1695 msg_flags_non_eor_indicator = 0
1696
1697 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1698 # Method to check the value of msg_flags returned by recvmsg[_into]().
1699 #
1700 # Checks that all bits in msg_flags_common_set attribute are
1701 # set in "flags" and all bits in msg_flags_common_unset are
1702 # unset.
1703 #
1704 # The "eor" argument specifies whether the flags should
1705 # indicate that a full record (or datagram) has been received.
1706 # If "eor" is None, no checks are done; otherwise, checks
1707 # that:
1708 #
1709 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1710 # set and all bits in msg_flags_non_eor_indicator are unset
1711 #
1712 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1713 # are set and all bits in msg_flags_eor_indicator are unset
1714 #
1715 # If "checkset" and/or "checkunset" are supplied, they require
1716 # the given bits to be set or unset respectively, overriding
1717 # what the attributes require for those bits.
1718 #
1719 # If any bits are set in "ignore", they will not be checked,
1720 # regardless of the other inputs.
1721 #
1722 # Will raise Exception if the inputs require a bit to be both
1723 # set and unset, and it is not ignored.
1724
1725 defaultset = self.msg_flags_common_set
1726 defaultunset = self.msg_flags_common_unset
1727
1728 if eor:
1729 defaultset |= self.msg_flags_eor_indicator
1730 defaultunset |= self.msg_flags_non_eor_indicator
1731 elif eor is not None:
1732 defaultset |= self.msg_flags_non_eor_indicator
1733 defaultunset |= self.msg_flags_eor_indicator
1734
1735 # Function arguments override defaults
1736 defaultset &= ~checkunset
1737 defaultunset &= ~checkset
1738
1739 # Merge arguments with remaining defaults, and check for conflicts
1740 checkset |= defaultset
1741 checkunset |= defaultunset
1742 inboth = checkset & checkunset & ~ignore
1743 if inboth:
1744 raise Exception("contradictory set, unset requirements for flags "
1745 "{0:#x}".format(inboth))
1746
1747 # Compare with given msg_flags value
1748 mask = (checkset | checkunset) & ~ignore
1749 self.assertEqual(flags & mask, checkset & mask)
1750
1751
1752class RecvmsgIntoMixin(SendrecvmsgBase):
1753 # Mixin to implement doRecvmsg() using recvmsg_into().
1754
1755 def doRecvmsg(self, sock, bufsize, *args):
1756 buf = bytearray(bufsize)
1757 result = sock.recvmsg_into([buf], *args)
1758 self.registerRecvmsgResult(result)
1759 self.assertGreaterEqual(result[0], 0)
1760 self.assertLessEqual(result[0], bufsize)
1761 return (bytes(buf[:result[0]]),) + result[1:]
1762
1763
1764class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1765 # Defines flags to be checked in msg_flags for datagram sockets.
1766
1767 @property
1768 def msg_flags_non_eor_indicator(self):
1769 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1770
1771
1772class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1773 # Defines flags to be checked in msg_flags for SCTP sockets.
1774
1775 @property
1776 def msg_flags_eor_indicator(self):
1777 return super().msg_flags_eor_indicator | socket.MSG_EOR
1778
1779
1780class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1781 # Base class for tests on connectionless-mode sockets. Users must
1782 # supply sockets on attributes cli and serv to be mapped to
1783 # cli_sock and serv_sock respectively.
1784
1785 @property
1786 def serv_sock(self):
1787 return self.serv
1788
1789 @property
1790 def cli_sock(self):
1791 return self.cli
1792
1793 @property
1794 def sendmsg_to_server_defaults(self):
1795 return ([], [], 0, self.serv_addr)
1796
1797 def sendToServer(self, msg):
1798 return self.cli_sock.sendto(msg, self.serv_addr)
1799
1800
1801class SendrecvmsgConnectedBase(SendrecvmsgBase):
1802 # Base class for tests on connected sockets. Users must supply
1803 # sockets on attributes serv_conn and cli_conn (representing the
1804 # connections *to* the server and the client), to be mapped to
1805 # cli_sock and serv_sock respectively.
1806
1807 @property
1808 def serv_sock(self):
1809 return self.cli_conn
1810
1811 @property
1812 def cli_sock(self):
1813 return self.serv_conn
1814
1815 def checkRecvmsgAddress(self, addr1, addr2):
1816 # Address is currently "unspecified" for a connected socket,
1817 # so we don't examine it
1818 pass
1819
1820
1821class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1822 # Base class to set a timeout on server's socket.
1823
1824 def setUp(self):
1825 super().setUp()
1826 self.serv_sock.settimeout(self.fail_timeout)
1827
1828
1829class SendmsgTests(SendrecvmsgServerTimeoutBase):
1830 # Tests for sendmsg() which can use any socket type and do not
1831 # involve recvmsg() or recvmsg_into().
1832
1833 def testSendmsg(self):
1834 # Send a simple message with sendmsg().
1835 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1836
1837 def _testSendmsg(self):
1838 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1839
1840 def testSendmsgDataGenerator(self):
1841 # Send from buffer obtained from a generator (not a sequence).
1842 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1843
1844 def _testSendmsgDataGenerator(self):
1845 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1846 len(MSG))
1847
1848 def testSendmsgAncillaryGenerator(self):
1849 # Gather (empty) ancillary data from a generator.
1850 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1851
1852 def _testSendmsgAncillaryGenerator(self):
1853 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1854 len(MSG))
1855
1856 def testSendmsgArray(self):
1857 # Send data from an array instead of the usual bytes object.
1858 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1859
1860 def _testSendmsgArray(self):
1861 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1862 len(MSG))
1863
1864 def testSendmsgGather(self):
1865 # Send message data from more than one buffer (gather write).
1866 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1867
1868 def _testSendmsgGather(self):
1869 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1870
1871 def testSendmsgBadArgs(self):
1872 # Check that sendmsg() rejects invalid arguments.
1873 self.assertEqual(self.serv_sock.recv(1000), b"done")
1874
1875 def _testSendmsgBadArgs(self):
1876 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1877 self.assertRaises(TypeError, self.sendmsgToServer,
1878 b"not in an iterable")
1879 self.assertRaises(TypeError, self.sendmsgToServer,
1880 object())
1881 self.assertRaises(TypeError, self.sendmsgToServer,
1882 [object()])
1883 self.assertRaises(TypeError, self.sendmsgToServer,
1884 [MSG, object()])
1885 self.assertRaises(TypeError, self.sendmsgToServer,
1886 [MSG], object())
1887 self.assertRaises(TypeError, self.sendmsgToServer,
1888 [MSG], [], object())
1889 self.assertRaises(TypeError, self.sendmsgToServer,
1890 [MSG], [], 0, object())
1891 self.sendToServer(b"done")
1892
1893 def testSendmsgBadCmsg(self):
1894 # Check that invalid ancillary data items are rejected.
1895 self.assertEqual(self.serv_sock.recv(1000), b"done")
1896
1897 def _testSendmsgBadCmsg(self):
1898 self.assertRaises(TypeError, self.sendmsgToServer,
1899 [MSG], [object()])
1900 self.assertRaises(TypeError, self.sendmsgToServer,
1901 [MSG], [(object(), 0, b"data")])
1902 self.assertRaises(TypeError, self.sendmsgToServer,
1903 [MSG], [(0, object(), b"data")])
1904 self.assertRaises(TypeError, self.sendmsgToServer,
1905 [MSG], [(0, 0, object())])
1906 self.assertRaises(TypeError, self.sendmsgToServer,
1907 [MSG], [(0, 0)])
1908 self.assertRaises(TypeError, self.sendmsgToServer,
1909 [MSG], [(0, 0, b"data", 42)])
1910 self.sendToServer(b"done")
1911
1912 @requireAttrs(socket, "CMSG_SPACE")
1913 def testSendmsgBadMultiCmsg(self):
1914 # Check that invalid ancillary data items are rejected when
1915 # more than one item is present.
1916 self.assertEqual(self.serv_sock.recv(1000), b"done")
1917
1918 @testSendmsgBadMultiCmsg.client_skip
1919 def _testSendmsgBadMultiCmsg(self):
1920 self.assertRaises(TypeError, self.sendmsgToServer,
1921 [MSG], [0, 0, b""])
1922 self.assertRaises(TypeError, self.sendmsgToServer,
1923 [MSG], [(0, 0, b""), object()])
1924 self.sendToServer(b"done")
1925
1926 def testSendmsgExcessCmsgReject(self):
1927 # Check that sendmsg() rejects excess ancillary data items
1928 # when the number that can be sent is limited.
1929 self.assertEqual(self.serv_sock.recv(1000), b"done")
1930
1931 def _testSendmsgExcessCmsgReject(self):
1932 if not hasattr(socket, "CMSG_SPACE"):
1933 # Can only send one item
1934 with self.assertRaises(socket.error) as cm:
1935 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1936 self.assertIsNone(cm.exception.errno)
1937 self.sendToServer(b"done")
1938
1939 def testSendmsgAfterClose(self):
1940 # Check that sendmsg() fails on a closed socket.
1941 pass
1942
1943 def _testSendmsgAfterClose(self):
1944 self.cli_sock.close()
1945 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1946
1947
1948class SendmsgStreamTests(SendmsgTests):
1949 # Tests for sendmsg() which require a stream socket and do not
1950 # involve recvmsg() or recvmsg_into().
1951
1952 def testSendmsgExplicitNoneAddr(self):
1953 # Check that peer address can be specified as None.
1954 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1955
1956 def _testSendmsgExplicitNoneAddr(self):
1957 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1958
1959 def testSendmsgTimeout(self):
1960 # Check that timeout works with sendmsg().
1961 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1962 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1963
1964 def _testSendmsgTimeout(self):
1965 try:
1966 self.cli_sock.settimeout(0.03)
1967 with self.assertRaises(socket.timeout):
1968 while True:
1969 self.sendmsgToServer([b"a"*512])
1970 finally:
1971 self.misc_event.set()
1972
1973 # XXX: would be nice to have more tests for sendmsg flags argument.
1974
1975 # Linux supports MSG_DONTWAIT when sending, but in general, it
1976 # only works when receiving. Could add other platforms if they
1977 # support it too.
1978 @skipWithClientIf(sys.platform not in {"linux2"},
1979 "MSG_DONTWAIT not known to work on this platform when "
1980 "sending")
1981 def testSendmsgDontWait(self):
1982 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1983 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1984 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1985
1986 @testSendmsgDontWait.client_skip
1987 def _testSendmsgDontWait(self):
1988 try:
1989 with self.assertRaises(socket.error) as cm:
1990 while True:
1991 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1992 self.assertIn(cm.exception.errno,
1993 (errno.EAGAIN, errno.EWOULDBLOCK))
1994 finally:
1995 self.misc_event.set()
1996
1997
1998class SendmsgConnectionlessTests(SendmsgTests):
1999 # Tests for sendmsg() which require a connectionless-mode
2000 # (e.g. datagram) socket, and do not involve recvmsg() or
2001 # recvmsg_into().
2002
2003 def testSendmsgNoDestAddr(self):
2004 # Check that sendmsg() fails when no destination address is
2005 # given for unconnected socket.
2006 pass
2007
2008 def _testSendmsgNoDestAddr(self):
2009 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2010 [MSG])
2011 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2012 [MSG], [], 0, None)
2013
2014
2015class RecvmsgGenericTests(SendrecvmsgBase):
2016 # Tests for recvmsg() which can also be emulated using
2017 # recvmsg_into(), and can use any socket type.
2018
2019 def testRecvmsg(self):
2020 # Receive a simple message with recvmsg[_into]().
2021 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
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 _testRecvmsg(self):
2028 self.sendToServer(MSG)
2029
2030 def testRecvmsgExplicitDefaults(self):
2031 # Test recvmsg[_into]() with default arguments provided explicitly.
2032 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2033 len(MSG), 0, 0)
2034 self.assertEqual(msg, MSG)
2035 self.checkRecvmsgAddress(addr, self.cli_addr)
2036 self.assertEqual(ancdata, [])
2037 self.checkFlags(flags, eor=True)
2038
2039 def _testRecvmsgExplicitDefaults(self):
2040 self.sendToServer(MSG)
2041
2042 def testRecvmsgShorter(self):
2043 # Receive a message smaller than buffer.
2044 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2045 len(MSG) + 42)
2046 self.assertEqual(msg, MSG)
2047 self.checkRecvmsgAddress(addr, self.cli_addr)
2048 self.assertEqual(ancdata, [])
2049 self.checkFlags(flags, eor=True)
2050
2051 def _testRecvmsgShorter(self):
2052 self.sendToServer(MSG)
2053
Charles-François Natali8619cd72011-10-03 19:43:15 +02002054 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2055 # datagram is received (issue #13001).
2056 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002057 def testRecvmsgTrunc(self):
2058 # Receive part of message, check for truncation indicators.
2059 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2060 len(MSG) - 3)
2061 self.assertEqual(msg, MSG[:-3])
2062 self.checkRecvmsgAddress(addr, self.cli_addr)
2063 self.assertEqual(ancdata, [])
2064 self.checkFlags(flags, eor=False)
2065
Charles-François Natali8619cd72011-10-03 19:43:15 +02002066 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002067 def _testRecvmsgTrunc(self):
2068 self.sendToServer(MSG)
2069
2070 def testRecvmsgShortAncillaryBuf(self):
2071 # Test ancillary data buffer too small to hold any ancillary data.
2072 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2073 len(MSG), 1)
2074 self.assertEqual(msg, MSG)
2075 self.checkRecvmsgAddress(addr, self.cli_addr)
2076 self.assertEqual(ancdata, [])
2077 self.checkFlags(flags, eor=True)
2078
2079 def _testRecvmsgShortAncillaryBuf(self):
2080 self.sendToServer(MSG)
2081
2082 def testRecvmsgLongAncillaryBuf(self):
2083 # Test large ancillary data buffer.
2084 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2085 len(MSG), 10240)
2086 self.assertEqual(msg, MSG)
2087 self.checkRecvmsgAddress(addr, self.cli_addr)
2088 self.assertEqual(ancdata, [])
2089 self.checkFlags(flags, eor=True)
2090
2091 def _testRecvmsgLongAncillaryBuf(self):
2092 self.sendToServer(MSG)
2093
2094 def testRecvmsgAfterClose(self):
2095 # Check that recvmsg[_into]() fails on a closed socket.
2096 self.serv_sock.close()
2097 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2098
2099 def _testRecvmsgAfterClose(self):
2100 pass
2101
2102 def testRecvmsgTimeout(self):
2103 # Check that timeout works.
2104 try:
2105 self.serv_sock.settimeout(0.03)
2106 self.assertRaises(socket.timeout,
2107 self.doRecvmsg, self.serv_sock, len(MSG))
2108 finally:
2109 self.misc_event.set()
2110
2111 def _testRecvmsgTimeout(self):
2112 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2113
2114 @requireAttrs(socket, "MSG_PEEK")
2115 def testRecvmsgPeek(self):
2116 # Check that MSG_PEEK in flags enables examination of pending
2117 # data without consuming it.
2118
2119 # Receive part of data with MSG_PEEK.
2120 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2121 len(MSG) - 3, 0,
2122 socket.MSG_PEEK)
2123 self.assertEqual(msg, MSG[:-3])
2124 self.checkRecvmsgAddress(addr, self.cli_addr)
2125 self.assertEqual(ancdata, [])
2126 # Ignoring MSG_TRUNC here (so this test is the same for stream
2127 # and datagram sockets). Some wording in POSIX seems to
2128 # suggest that it needn't be set when peeking, but that may
2129 # just be a slip.
2130 self.checkFlags(flags, eor=False,
2131 ignore=getattr(socket, "MSG_TRUNC", 0))
2132
2133 # Receive all data with MSG_PEEK.
2134 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2135 len(MSG), 0,
2136 socket.MSG_PEEK)
2137 self.assertEqual(msg, MSG)
2138 self.checkRecvmsgAddress(addr, self.cli_addr)
2139 self.assertEqual(ancdata, [])
2140 self.checkFlags(flags, eor=True)
2141
2142 # Check that the same data can still be received normally.
2143 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2144 self.assertEqual(msg, MSG)
2145 self.checkRecvmsgAddress(addr, self.cli_addr)
2146 self.assertEqual(ancdata, [])
2147 self.checkFlags(flags, eor=True)
2148
2149 @testRecvmsgPeek.client_skip
2150 def _testRecvmsgPeek(self):
2151 self.sendToServer(MSG)
2152
2153 @requireAttrs(socket.socket, "sendmsg")
2154 def testRecvmsgFromSendmsg(self):
2155 # Test receiving with recvmsg[_into]() when message is sent
2156 # using sendmsg().
2157 self.serv_sock.settimeout(self.fail_timeout)
2158 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2159 self.assertEqual(msg, MSG)
2160 self.checkRecvmsgAddress(addr, self.cli_addr)
2161 self.assertEqual(ancdata, [])
2162 self.checkFlags(flags, eor=True)
2163
2164 @testRecvmsgFromSendmsg.client_skip
2165 def _testRecvmsgFromSendmsg(self):
2166 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2167
2168
2169class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2170 # Tests which require a stream socket and can use either recvmsg()
2171 # or recvmsg_into().
2172
2173 def testRecvmsgEOF(self):
2174 # Receive end-of-stream indicator (b"", peer socket closed).
2175 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2176 self.assertEqual(msg, b"")
2177 self.checkRecvmsgAddress(addr, self.cli_addr)
2178 self.assertEqual(ancdata, [])
2179 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2180
2181 def _testRecvmsgEOF(self):
2182 self.cli_sock.close()
2183
2184 def testRecvmsgOverflow(self):
2185 # Receive a message in more than one chunk.
2186 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2187 len(MSG) - 3)
2188 self.checkRecvmsgAddress(addr, self.cli_addr)
2189 self.assertEqual(ancdata, [])
2190 self.checkFlags(flags, eor=False)
2191
2192 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2193 self.checkRecvmsgAddress(addr, self.cli_addr)
2194 self.assertEqual(ancdata, [])
2195 self.checkFlags(flags, eor=True)
2196
2197 msg = seg1 + seg2
2198 self.assertEqual(msg, MSG)
2199
2200 def _testRecvmsgOverflow(self):
2201 self.sendToServer(MSG)
2202
2203
2204class RecvmsgTests(RecvmsgGenericTests):
2205 # Tests for recvmsg() which can use any socket type.
2206
2207 def testRecvmsgBadArgs(self):
2208 # Check that recvmsg() rejects invalid arguments.
2209 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2210 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2211 -1, 0, 0)
2212 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2213 len(MSG), -1, 0)
2214 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2215 [bytearray(10)], 0, 0)
2216 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2217 object(), 0, 0)
2218 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2219 len(MSG), object(), 0)
2220 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2221 len(MSG), 0, object())
2222
2223 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2224 self.assertEqual(msg, MSG)
2225 self.checkRecvmsgAddress(addr, self.cli_addr)
2226 self.assertEqual(ancdata, [])
2227 self.checkFlags(flags, eor=True)
2228
2229 def _testRecvmsgBadArgs(self):
2230 self.sendToServer(MSG)
2231
2232
2233class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2234 # Tests for recvmsg_into() which can use any socket type.
2235
2236 def testRecvmsgIntoBadArgs(self):
2237 # Check that recvmsg_into() rejects invalid arguments.
2238 buf = bytearray(len(MSG))
2239 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2240 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2241 len(MSG), 0, 0)
2242 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2243 buf, 0, 0)
2244 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2245 [object()], 0, 0)
2246 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2247 [b"I'm not writable"], 0, 0)
2248 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2249 [buf, object()], 0, 0)
2250 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2251 [buf], -1, 0)
2252 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2253 [buf], object(), 0)
2254 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2255 [buf], 0, object())
2256
2257 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2258 self.assertEqual(nbytes, len(MSG))
2259 self.assertEqual(buf, bytearray(MSG))
2260 self.checkRecvmsgAddress(addr, self.cli_addr)
2261 self.assertEqual(ancdata, [])
2262 self.checkFlags(flags, eor=True)
2263
2264 def _testRecvmsgIntoBadArgs(self):
2265 self.sendToServer(MSG)
2266
2267 def testRecvmsgIntoGenerator(self):
2268 # Receive into buffer obtained from a generator (not a sequence).
2269 buf = bytearray(len(MSG))
2270 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2271 (o for o in [buf]))
2272 self.assertEqual(nbytes, len(MSG))
2273 self.assertEqual(buf, bytearray(MSG))
2274 self.checkRecvmsgAddress(addr, self.cli_addr)
2275 self.assertEqual(ancdata, [])
2276 self.checkFlags(flags, eor=True)
2277
2278 def _testRecvmsgIntoGenerator(self):
2279 self.sendToServer(MSG)
2280
2281 def testRecvmsgIntoArray(self):
2282 # Receive into an array rather than the usual bytearray.
2283 buf = array.array("B", [0] * len(MSG))
2284 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2285 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002286 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002287 self.checkRecvmsgAddress(addr, self.cli_addr)
2288 self.assertEqual(ancdata, [])
2289 self.checkFlags(flags, eor=True)
2290
2291 def _testRecvmsgIntoArray(self):
2292 self.sendToServer(MSG)
2293
2294 def testRecvmsgIntoScatter(self):
2295 # Receive into multiple buffers (scatter write).
2296 b1 = bytearray(b"----")
2297 b2 = bytearray(b"0123456789")
2298 b3 = bytearray(b"--------------")
2299 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2300 [b1, memoryview(b2)[2:9], b3])
2301 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2302 self.assertEqual(b1, bytearray(b"Mary"))
2303 self.assertEqual(b2, bytearray(b"01 had a 9"))
2304 self.assertEqual(b3, bytearray(b"little lamb---"))
2305 self.checkRecvmsgAddress(addr, self.cli_addr)
2306 self.assertEqual(ancdata, [])
2307 self.checkFlags(flags, eor=True)
2308
2309 def _testRecvmsgIntoScatter(self):
2310 self.sendToServer(b"Mary had a little lamb")
2311
2312
2313class CmsgMacroTests(unittest.TestCase):
2314 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2315 # assumptions used by sendmsg() and recvmsg[_into](), which share
2316 # code with these functions.
2317
2318 # Match the definition in socketmodule.c
2319 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2320
2321 @requireAttrs(socket, "CMSG_LEN")
2322 def testCMSG_LEN(self):
2323 # Test CMSG_LEN() with various valid and invalid values,
2324 # checking the assumptions used by recvmsg() and sendmsg().
2325 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2326 values = list(range(257)) + list(range(toobig - 257, toobig))
2327
2328 # struct cmsghdr has at least three members, two of which are ints
2329 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2330 for n in values:
2331 ret = socket.CMSG_LEN(n)
2332 # This is how recvmsg() calculates the data size
2333 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2334 self.assertLessEqual(ret, self.socklen_t_limit)
2335
2336 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2337 # sendmsg() shares code with these functions, and requires
2338 # that it reject values over the limit.
2339 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2340 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2341
2342 @requireAttrs(socket, "CMSG_SPACE")
2343 def testCMSG_SPACE(self):
2344 # Test CMSG_SPACE() with various valid and invalid values,
2345 # checking the assumptions used by sendmsg().
2346 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2347 values = list(range(257)) + list(range(toobig - 257, toobig))
2348
2349 last = socket.CMSG_SPACE(0)
2350 # struct cmsghdr has at least three members, two of which are ints
2351 self.assertGreater(last, array.array("i").itemsize * 2)
2352 for n in values:
2353 ret = socket.CMSG_SPACE(n)
2354 self.assertGreaterEqual(ret, last)
2355 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2356 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2357 self.assertLessEqual(ret, self.socklen_t_limit)
2358 last = ret
2359
2360 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2361 # sendmsg() shares code with these functions, and requires
2362 # that it reject values over the limit.
2363 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2364 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2365
2366
2367class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2368 # Tests for file descriptor passing on Unix-domain sockets.
2369
2370 # Invalid file descriptor value that's unlikely to evaluate to a
2371 # real FD even if one of its bytes is replaced with a different
2372 # value (which shouldn't actually happen).
2373 badfd = -0x5555
2374
2375 def newFDs(self, n):
2376 # Return a list of n file descriptors for newly-created files
2377 # containing their list indices as ASCII numbers.
2378 fds = []
2379 for i in range(n):
2380 fd, path = tempfile.mkstemp()
2381 self.addCleanup(os.unlink, path)
2382 self.addCleanup(os.close, fd)
2383 os.write(fd, str(i).encode())
2384 fds.append(fd)
2385 return fds
2386
2387 def checkFDs(self, fds):
2388 # Check that the file descriptors in the given list contain
2389 # their correct list indices as ASCII numbers.
2390 for n, fd in enumerate(fds):
2391 os.lseek(fd, 0, os.SEEK_SET)
2392 self.assertEqual(os.read(fd, 1024), str(n).encode())
2393
2394 def registerRecvmsgResult(self, result):
2395 self.addCleanup(self.closeRecvmsgFDs, result)
2396
2397 def closeRecvmsgFDs(self, recvmsg_result):
2398 # Close all file descriptors specified in the ancillary data
2399 # of the given return value from recvmsg() or recvmsg_into().
2400 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2401 if (cmsg_level == socket.SOL_SOCKET and
2402 cmsg_type == socket.SCM_RIGHTS):
2403 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002404 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002405 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2406 for fd in fds:
2407 os.close(fd)
2408
2409 def createAndSendFDs(self, n):
2410 # Send n new file descriptors created by newFDs() to the
2411 # server, with the constant MSG as the non-ancillary data.
2412 self.assertEqual(
2413 self.sendmsgToServer([MSG],
2414 [(socket.SOL_SOCKET,
2415 socket.SCM_RIGHTS,
2416 array.array("i", self.newFDs(n)))]),
2417 len(MSG))
2418
2419 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2420 # Check that constant MSG was received with numfds file
2421 # descriptors in a maximum of maxcmsgs control messages (which
2422 # must contain only complete integers). By default, check
2423 # that MSG_CTRUNC is unset, but ignore any flags in
2424 # ignoreflags.
2425 msg, ancdata, flags, addr = result
2426 self.assertEqual(msg, MSG)
2427 self.checkRecvmsgAddress(addr, self.cli_addr)
2428 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2429 ignore=ignoreflags)
2430
2431 self.assertIsInstance(ancdata, list)
2432 self.assertLessEqual(len(ancdata), maxcmsgs)
2433 fds = array.array("i")
2434 for item in ancdata:
2435 self.assertIsInstance(item, tuple)
2436 cmsg_level, cmsg_type, cmsg_data = item
2437 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2438 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2439 self.assertIsInstance(cmsg_data, bytes)
2440 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002441 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002442
2443 self.assertEqual(len(fds), numfds)
2444 self.checkFDs(fds)
2445
2446 def testFDPassSimple(self):
2447 # Pass a single FD (array read from bytes object).
2448 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2449 len(MSG), 10240))
2450
2451 def _testFDPassSimple(self):
2452 self.assertEqual(
2453 self.sendmsgToServer(
2454 [MSG],
2455 [(socket.SOL_SOCKET,
2456 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002457 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002458 len(MSG))
2459
2460 def testMultipleFDPass(self):
2461 # Pass multiple FDs in a single array.
2462 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2463 len(MSG), 10240))
2464
2465 def _testMultipleFDPass(self):
2466 self.createAndSendFDs(4)
2467
2468 @requireAttrs(socket, "CMSG_SPACE")
2469 def testFDPassCMSG_SPACE(self):
2470 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2471 self.checkRecvmsgFDs(
2472 4, self.doRecvmsg(self.serv_sock, len(MSG),
2473 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2474
2475 @testFDPassCMSG_SPACE.client_skip
2476 def _testFDPassCMSG_SPACE(self):
2477 self.createAndSendFDs(4)
2478
2479 def testFDPassCMSG_LEN(self):
2480 # Test using CMSG_LEN() to calculate ancillary buffer size.
2481 self.checkRecvmsgFDs(1,
2482 self.doRecvmsg(self.serv_sock, len(MSG),
2483 socket.CMSG_LEN(4 * SIZEOF_INT)),
2484 # RFC 3542 says implementations may set
2485 # MSG_CTRUNC if there isn't enough space
2486 # for trailing padding.
2487 ignoreflags=socket.MSG_CTRUNC)
2488
2489 def _testFDPassCMSG_LEN(self):
2490 self.createAndSendFDs(1)
2491
Nick Coghlan2496f332011-09-19 20:26:31 +10002492 # Issue #12958: The following test has problems on Mac OS X
2493 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002494 @requireAttrs(socket, "CMSG_SPACE")
2495 def testFDPassSeparate(self):
2496 # Pass two FDs in two separate arrays. Arrays may be combined
2497 # into a single control message by the OS.
2498 self.checkRecvmsgFDs(2,
2499 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2500 maxcmsgs=2)
2501
2502 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002503 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002504 def _testFDPassSeparate(self):
2505 fd0, fd1 = self.newFDs(2)
2506 self.assertEqual(
2507 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2508 socket.SCM_RIGHTS,
2509 array.array("i", [fd0])),
2510 (socket.SOL_SOCKET,
2511 socket.SCM_RIGHTS,
2512 array.array("i", [fd1]))]),
2513 len(MSG))
2514
Nick Coghlan2496f332011-09-19 20:26:31 +10002515 # Issue #12958: The following test has problems on Mac OS X
2516 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002517 @requireAttrs(socket, "CMSG_SPACE")
2518 def testFDPassSeparateMinSpace(self):
2519 # Pass two FDs in two separate arrays, receiving them into the
2520 # minimum space for two arrays.
2521 self.checkRecvmsgFDs(2,
2522 self.doRecvmsg(self.serv_sock, len(MSG),
2523 socket.CMSG_SPACE(SIZEOF_INT) +
2524 socket.CMSG_LEN(SIZEOF_INT)),
2525 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2526
2527 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002528 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002529 def _testFDPassSeparateMinSpace(self):
2530 fd0, fd1 = self.newFDs(2)
2531 self.assertEqual(
2532 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2533 socket.SCM_RIGHTS,
2534 array.array("i", [fd0])),
2535 (socket.SOL_SOCKET,
2536 socket.SCM_RIGHTS,
2537 array.array("i", [fd1]))]),
2538 len(MSG))
2539
2540 def sendAncillaryIfPossible(self, msg, ancdata):
2541 # Try to send msg and ancdata to server, but if the system
2542 # call fails, just send msg with no ancillary data.
2543 try:
2544 nbytes = self.sendmsgToServer([msg], ancdata)
2545 except socket.error as e:
2546 # Check that it was the system call that failed
2547 self.assertIsInstance(e.errno, int)
2548 nbytes = self.sendmsgToServer([msg])
2549 self.assertEqual(nbytes, len(msg))
2550
2551 def testFDPassEmpty(self):
2552 # Try to pass an empty FD array. Can receive either no array
2553 # or an empty array.
2554 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2555 len(MSG), 10240),
2556 ignoreflags=socket.MSG_CTRUNC)
2557
2558 def _testFDPassEmpty(self):
2559 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2560 socket.SCM_RIGHTS,
2561 b"")])
2562
2563 def testFDPassPartialInt(self):
2564 # Try to pass a truncated FD array.
2565 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2566 len(MSG), 10240)
2567 self.assertEqual(msg, MSG)
2568 self.checkRecvmsgAddress(addr, self.cli_addr)
2569 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2570 self.assertLessEqual(len(ancdata), 1)
2571 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2572 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2573 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2574 self.assertLess(len(cmsg_data), SIZEOF_INT)
2575
2576 def _testFDPassPartialInt(self):
2577 self.sendAncillaryIfPossible(
2578 MSG,
2579 [(socket.SOL_SOCKET,
2580 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002581 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002582
2583 @requireAttrs(socket, "CMSG_SPACE")
2584 def testFDPassPartialIntInMiddle(self):
2585 # Try to pass two FD arrays, the first of which is truncated.
2586 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2587 len(MSG), 10240)
2588 self.assertEqual(msg, MSG)
2589 self.checkRecvmsgAddress(addr, self.cli_addr)
2590 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2591 self.assertLessEqual(len(ancdata), 2)
2592 fds = array.array("i")
2593 # Arrays may have been combined in a single control message
2594 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2595 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2596 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002597 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002598 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2599 self.assertLessEqual(len(fds), 2)
2600 self.checkFDs(fds)
2601
2602 @testFDPassPartialIntInMiddle.client_skip
2603 def _testFDPassPartialIntInMiddle(self):
2604 fd0, fd1 = self.newFDs(2)
2605 self.sendAncillaryIfPossible(
2606 MSG,
2607 [(socket.SOL_SOCKET,
2608 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002609 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002610 (socket.SOL_SOCKET,
2611 socket.SCM_RIGHTS,
2612 array.array("i", [fd1]))])
2613
2614 def checkTruncatedHeader(self, result, ignoreflags=0):
2615 # Check that no ancillary data items are returned when data is
2616 # truncated inside the cmsghdr structure.
2617 msg, ancdata, flags, addr = result
2618 self.assertEqual(msg, MSG)
2619 self.checkRecvmsgAddress(addr, self.cli_addr)
2620 self.assertEqual(ancdata, [])
2621 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2622 ignore=ignoreflags)
2623
2624 def testCmsgTruncNoBufSize(self):
2625 # Check that no ancillary data is received when no buffer size
2626 # is specified.
2627 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2628 # BSD seems to set MSG_CTRUNC only
2629 # if an item has been partially
2630 # received.
2631 ignoreflags=socket.MSG_CTRUNC)
2632
2633 def _testCmsgTruncNoBufSize(self):
2634 self.createAndSendFDs(1)
2635
2636 def testCmsgTrunc0(self):
2637 # Check that no ancillary data is received when buffer size is 0.
2638 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2639 ignoreflags=socket.MSG_CTRUNC)
2640
2641 def _testCmsgTrunc0(self):
2642 self.createAndSendFDs(1)
2643
2644 # Check that no ancillary data is returned for various non-zero
2645 # (but still too small) buffer sizes.
2646
2647 def testCmsgTrunc1(self):
2648 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2649
2650 def _testCmsgTrunc1(self):
2651 self.createAndSendFDs(1)
2652
2653 def testCmsgTrunc2Int(self):
2654 # The cmsghdr structure has at least three members, two of
2655 # which are ints, so we still shouldn't see any ancillary
2656 # data.
2657 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2658 SIZEOF_INT * 2))
2659
2660 def _testCmsgTrunc2Int(self):
2661 self.createAndSendFDs(1)
2662
2663 def testCmsgTruncLen0Minus1(self):
2664 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2665 socket.CMSG_LEN(0) - 1))
2666
2667 def _testCmsgTruncLen0Minus1(self):
2668 self.createAndSendFDs(1)
2669
2670 # The following tests try to truncate the control message in the
2671 # middle of the FD array.
2672
2673 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2674 # Check that file descriptor data is truncated to between
2675 # mindata and maxdata bytes when received with buffer size
2676 # ancbuf, and that any complete file descriptor numbers are
2677 # valid.
2678 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2679 len(MSG), ancbuf)
2680 self.assertEqual(msg, MSG)
2681 self.checkRecvmsgAddress(addr, self.cli_addr)
2682 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2683
2684 if mindata == 0 and ancdata == []:
2685 return
2686 self.assertEqual(len(ancdata), 1)
2687 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2688 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2689 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2690 self.assertGreaterEqual(len(cmsg_data), mindata)
2691 self.assertLessEqual(len(cmsg_data), maxdata)
2692 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002693 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002694 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2695 self.checkFDs(fds)
2696
2697 def testCmsgTruncLen0(self):
2698 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2699
2700 def _testCmsgTruncLen0(self):
2701 self.createAndSendFDs(1)
2702
2703 def testCmsgTruncLen0Plus1(self):
2704 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2705
2706 def _testCmsgTruncLen0Plus1(self):
2707 self.createAndSendFDs(2)
2708
2709 def testCmsgTruncLen1(self):
2710 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2711 maxdata=SIZEOF_INT)
2712
2713 def _testCmsgTruncLen1(self):
2714 self.createAndSendFDs(2)
2715
2716 def testCmsgTruncLen2Minus1(self):
2717 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2718 maxdata=(2 * SIZEOF_INT) - 1)
2719
2720 def _testCmsgTruncLen2Minus1(self):
2721 self.createAndSendFDs(2)
2722
2723
2724class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2725 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2726 # features of the RFC 3542 Advanced Sockets API for IPv6.
2727 # Currently we can only handle certain data items (e.g. traffic
2728 # class, hop limit, MTU discovery and fragmentation settings)
2729 # without resorting to unportable means such as the struct module,
2730 # but the tests here are aimed at testing the ancillary data
2731 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2732 # itself.
2733
2734 # Test value to use when setting hop limit of packet
2735 hop_limit = 2
2736
2737 # Test value to use when setting traffic class of packet.
2738 # -1 means "use kernel default".
2739 traffic_class = -1
2740
2741 def ancillaryMapping(self, ancdata):
2742 # Given ancillary data list ancdata, return a mapping from
2743 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2744 # Check that no (level, type) pair appears more than once.
2745 d = {}
2746 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2747 self.assertNotIn((cmsg_level, cmsg_type), d)
2748 d[(cmsg_level, cmsg_type)] = cmsg_data
2749 return d
2750
2751 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2752 # Receive hop limit into ancbufsize bytes of ancillary data
2753 # space. Check that data is MSG, ancillary data is not
2754 # truncated (but ignore any flags in ignoreflags), and hop
2755 # limit is between 0 and maxhop inclusive.
2756 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2757 socket.IPV6_RECVHOPLIMIT, 1)
2758 self.misc_event.set()
2759 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2760 len(MSG), ancbufsize)
2761
2762 self.assertEqual(msg, MSG)
2763 self.checkRecvmsgAddress(addr, self.cli_addr)
2764 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2765 ignore=ignoreflags)
2766
2767 self.assertEqual(len(ancdata), 1)
2768 self.assertIsInstance(ancdata[0], tuple)
2769 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2770 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2771 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2772 self.assertIsInstance(cmsg_data, bytes)
2773 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2774 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002775 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002776 self.assertGreaterEqual(a[0], 0)
2777 self.assertLessEqual(a[0], maxhop)
2778
2779 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2780 def testRecvHopLimit(self):
2781 # Test receiving the packet hop limit as ancillary data.
2782 self.checkHopLimit(ancbufsize=10240)
2783
2784 @testRecvHopLimit.client_skip
2785 def _testRecvHopLimit(self):
2786 # Need to wait until server has asked to receive ancillary
2787 # data, as implementations are not required to buffer it
2788 # otherwise.
2789 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2790 self.sendToServer(MSG)
2791
2792 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2793 def testRecvHopLimitCMSG_SPACE(self):
2794 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2795 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2796
2797 @testRecvHopLimitCMSG_SPACE.client_skip
2798 def _testRecvHopLimitCMSG_SPACE(self):
2799 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2800 self.sendToServer(MSG)
2801
2802 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2803 # 3542 says portable applications must provide space for trailing
2804 # padding. Implementations may set MSG_CTRUNC if there isn't
2805 # enough space for the padding.
2806
2807 @requireAttrs(socket.socket, "sendmsg")
2808 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2809 def testSetHopLimit(self):
2810 # Test setting hop limit on outgoing packet and receiving it
2811 # at the other end.
2812 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2813
2814 @testSetHopLimit.client_skip
2815 def _testSetHopLimit(self):
2816 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2817 self.assertEqual(
2818 self.sendmsgToServer([MSG],
2819 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2820 array.array("i", [self.hop_limit]))]),
2821 len(MSG))
2822
2823 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2824 ignoreflags=0):
2825 # Receive traffic class and hop limit into ancbufsize bytes of
2826 # ancillary data space. Check that data is MSG, ancillary
2827 # data is not truncated (but ignore any flags in ignoreflags),
2828 # and traffic class and hop limit are in range (hop limit no
2829 # more than maxhop).
2830 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2831 socket.IPV6_RECVHOPLIMIT, 1)
2832 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2833 socket.IPV6_RECVTCLASS, 1)
2834 self.misc_event.set()
2835 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2836 len(MSG), ancbufsize)
2837
2838 self.assertEqual(msg, MSG)
2839 self.checkRecvmsgAddress(addr, self.cli_addr)
2840 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2841 ignore=ignoreflags)
2842 self.assertEqual(len(ancdata), 2)
2843 ancmap = self.ancillaryMapping(ancdata)
2844
2845 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2846 self.assertEqual(len(tcdata), SIZEOF_INT)
2847 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002848 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002849 self.assertGreaterEqual(a[0], 0)
2850 self.assertLessEqual(a[0], 255)
2851
2852 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2853 self.assertEqual(len(hldata), SIZEOF_INT)
2854 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002855 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002856 self.assertGreaterEqual(a[0], 0)
2857 self.assertLessEqual(a[0], maxhop)
2858
2859 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2860 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2861 def testRecvTrafficClassAndHopLimit(self):
2862 # Test receiving traffic class and hop limit as ancillary data.
2863 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2864
2865 @testRecvTrafficClassAndHopLimit.client_skip
2866 def _testRecvTrafficClassAndHopLimit(self):
2867 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2868 self.sendToServer(MSG)
2869
2870 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2871 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2872 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2873 # Test receiving traffic class and hop limit, using
2874 # CMSG_SPACE() to calculate buffer size.
2875 self.checkTrafficClassAndHopLimit(
2876 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2877
2878 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2879 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2880 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2881 self.sendToServer(MSG)
2882
2883 @requireAttrs(socket.socket, "sendmsg")
2884 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2885 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2886 def testSetTrafficClassAndHopLimit(self):
2887 # Test setting traffic class and hop limit on outgoing packet,
2888 # and receiving them at the other end.
2889 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2890 maxhop=self.hop_limit)
2891
2892 @testSetTrafficClassAndHopLimit.client_skip
2893 def _testSetTrafficClassAndHopLimit(self):
2894 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2895 self.assertEqual(
2896 self.sendmsgToServer([MSG],
2897 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2898 array.array("i", [self.traffic_class])),
2899 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2900 array.array("i", [self.hop_limit]))]),
2901 len(MSG))
2902
2903 @requireAttrs(socket.socket, "sendmsg")
2904 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2905 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2906 def testOddCmsgSize(self):
2907 # Try to send ancillary data with first item one byte too
2908 # long. Fall back to sending with correct size if this fails,
2909 # and check that second item was handled correctly.
2910 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2911 maxhop=self.hop_limit)
2912
2913 @testOddCmsgSize.client_skip
2914 def _testOddCmsgSize(self):
2915 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2916 try:
2917 nbytes = self.sendmsgToServer(
2918 [MSG],
2919 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002920 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002921 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2922 array.array("i", [self.hop_limit]))])
2923 except socket.error as e:
2924 self.assertIsInstance(e.errno, int)
2925 nbytes = self.sendmsgToServer(
2926 [MSG],
2927 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2928 array.array("i", [self.traffic_class])),
2929 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2930 array.array("i", [self.hop_limit]))])
2931 self.assertEqual(nbytes, len(MSG))
2932
2933 # Tests for proper handling of truncated ancillary data
2934
2935 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2936 # Receive hop limit into ancbufsize bytes of ancillary data
2937 # space, which should be too small to contain the ancillary
2938 # data header (if ancbufsize is None, pass no second argument
2939 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2940 # (unless included in ignoreflags), and no ancillary data is
2941 # returned.
2942 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2943 socket.IPV6_RECVHOPLIMIT, 1)
2944 self.misc_event.set()
2945 args = () if ancbufsize is None else (ancbufsize,)
2946 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2947 len(MSG), *args)
2948
2949 self.assertEqual(msg, MSG)
2950 self.checkRecvmsgAddress(addr, self.cli_addr)
2951 self.assertEqual(ancdata, [])
2952 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2953 ignore=ignoreflags)
2954
2955 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2956 def testCmsgTruncNoBufSize(self):
2957 # Check that no ancillary data is received when no ancillary
2958 # buffer size is provided.
2959 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2960 # BSD seems to set
2961 # MSG_CTRUNC only if an item
2962 # has been partially
2963 # received.
2964 ignoreflags=socket.MSG_CTRUNC)
2965
2966 @testCmsgTruncNoBufSize.client_skip
2967 def _testCmsgTruncNoBufSize(self):
2968 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2969 self.sendToServer(MSG)
2970
2971 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2972 def testSingleCmsgTrunc0(self):
2973 # Check that no ancillary data is received when ancillary
2974 # buffer size is zero.
2975 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2976 ignoreflags=socket.MSG_CTRUNC)
2977
2978 @testSingleCmsgTrunc0.client_skip
2979 def _testSingleCmsgTrunc0(self):
2980 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2981 self.sendToServer(MSG)
2982
2983 # Check that no ancillary data is returned for various non-zero
2984 # (but still too small) buffer sizes.
2985
2986 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2987 def testSingleCmsgTrunc1(self):
2988 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2989
2990 @testSingleCmsgTrunc1.client_skip
2991 def _testSingleCmsgTrunc1(self):
2992 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2993 self.sendToServer(MSG)
2994
2995 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2996 def testSingleCmsgTrunc2Int(self):
2997 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
2998
2999 @testSingleCmsgTrunc2Int.client_skip
3000 def _testSingleCmsgTrunc2Int(self):
3001 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3002 self.sendToServer(MSG)
3003
3004 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3005 def testSingleCmsgTruncLen0Minus1(self):
3006 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3007
3008 @testSingleCmsgTruncLen0Minus1.client_skip
3009 def _testSingleCmsgTruncLen0Minus1(self):
3010 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3011 self.sendToServer(MSG)
3012
3013 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3014 def testSingleCmsgTruncInData(self):
3015 # Test truncation of a control message inside its associated
3016 # data. The message may be returned with its data truncated,
3017 # or not returned at all.
3018 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3019 socket.IPV6_RECVHOPLIMIT, 1)
3020 self.misc_event.set()
3021 msg, ancdata, flags, addr = self.doRecvmsg(
3022 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3023
3024 self.assertEqual(msg, MSG)
3025 self.checkRecvmsgAddress(addr, self.cli_addr)
3026 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3027
3028 self.assertLessEqual(len(ancdata), 1)
3029 if ancdata:
3030 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3031 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3032 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3033 self.assertLess(len(cmsg_data), SIZEOF_INT)
3034
3035 @testSingleCmsgTruncInData.client_skip
3036 def _testSingleCmsgTruncInData(self):
3037 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3038 self.sendToServer(MSG)
3039
3040 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3041 # Receive traffic class and hop limit into ancbufsize bytes of
3042 # ancillary data space, which should be large enough to
3043 # contain the first item, but too small to contain the header
3044 # of the second. Check that data is MSG, MSG_CTRUNC is set
3045 # (unless included in ignoreflags), and only one ancillary
3046 # data item is returned.
3047 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3048 socket.IPV6_RECVHOPLIMIT, 1)
3049 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3050 socket.IPV6_RECVTCLASS, 1)
3051 self.misc_event.set()
3052 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3053 len(MSG), ancbufsize)
3054
3055 self.assertEqual(msg, MSG)
3056 self.checkRecvmsgAddress(addr, self.cli_addr)
3057 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3058 ignore=ignoreflags)
3059
3060 self.assertEqual(len(ancdata), 1)
3061 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3062 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3063 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3064 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3065 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003066 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003067 self.assertGreaterEqual(a[0], 0)
3068 self.assertLessEqual(a[0], 255)
3069
3070 # Try the above test with various buffer sizes.
3071
3072 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3073 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3074 def testSecondCmsgTrunc0(self):
3075 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3076 ignoreflags=socket.MSG_CTRUNC)
3077
3078 @testSecondCmsgTrunc0.client_skip
3079 def _testSecondCmsgTrunc0(self):
3080 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3081 self.sendToServer(MSG)
3082
3083 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3084 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3085 def testSecondCmsgTrunc1(self):
3086 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3087
3088 @testSecondCmsgTrunc1.client_skip
3089 def _testSecondCmsgTrunc1(self):
3090 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3091 self.sendToServer(MSG)
3092
3093 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3094 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3095 def testSecondCmsgTrunc2Int(self):
3096 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3097 2 * SIZEOF_INT)
3098
3099 @testSecondCmsgTrunc2Int.client_skip
3100 def _testSecondCmsgTrunc2Int(self):
3101 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3102 self.sendToServer(MSG)
3103
3104 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3105 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3106 def testSecondCmsgTruncLen0Minus1(self):
3107 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3108 socket.CMSG_LEN(0) - 1)
3109
3110 @testSecondCmsgTruncLen0Minus1.client_skip
3111 def _testSecondCmsgTruncLen0Minus1(self):
3112 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3113 self.sendToServer(MSG)
3114
3115 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3116 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3117 def testSecomdCmsgTruncInData(self):
3118 # Test truncation of the second of two control messages inside
3119 # its associated data.
3120 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3121 socket.IPV6_RECVHOPLIMIT, 1)
3122 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3123 socket.IPV6_RECVTCLASS, 1)
3124 self.misc_event.set()
3125 msg, ancdata, flags, addr = self.doRecvmsg(
3126 self.serv_sock, len(MSG),
3127 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3128
3129 self.assertEqual(msg, MSG)
3130 self.checkRecvmsgAddress(addr, self.cli_addr)
3131 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3132
3133 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3134
3135 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3136 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3137 cmsg_types.remove(cmsg_type)
3138 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3139 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003140 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003141 self.assertGreaterEqual(a[0], 0)
3142 self.assertLessEqual(a[0], 255)
3143
3144 if ancdata:
3145 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3146 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3147 cmsg_types.remove(cmsg_type)
3148 self.assertLess(len(cmsg_data), SIZEOF_INT)
3149
3150 self.assertEqual(ancdata, [])
3151
3152 @testSecomdCmsgTruncInData.client_skip
3153 def _testSecomdCmsgTruncInData(self):
3154 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3155 self.sendToServer(MSG)
3156
3157
3158# Derive concrete test classes for different socket types.
3159
3160class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3161 SendrecvmsgConnectionlessBase,
3162 ThreadedSocketTestMixin, UDPTestBase):
3163 pass
3164
3165@requireAttrs(socket.socket, "sendmsg")
3166@unittest.skipUnless(thread, 'Threading required for this test.')
3167class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3168 pass
3169
3170@requireAttrs(socket.socket, "recvmsg")
3171@unittest.skipUnless(thread, 'Threading required for this test.')
3172class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3173 pass
3174
3175@requireAttrs(socket.socket, "recvmsg_into")
3176@unittest.skipUnless(thread, 'Threading required for this test.')
3177class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3178 pass
3179
3180
3181class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3182 SendrecvmsgConnectionlessBase,
3183 ThreadedSocketTestMixin, UDP6TestBase):
3184 pass
3185
3186@requireAttrs(socket.socket, "sendmsg")
3187@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3188@requireSocket("AF_INET6", "SOCK_DGRAM")
3189@unittest.skipUnless(thread, 'Threading required for this test.')
3190class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3191 pass
3192
3193@requireAttrs(socket.socket, "recvmsg")
3194@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3195@requireSocket("AF_INET6", "SOCK_DGRAM")
3196@unittest.skipUnless(thread, 'Threading required for this test.')
3197class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3198 pass
3199
3200@requireAttrs(socket.socket, "recvmsg_into")
3201@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3202@requireSocket("AF_INET6", "SOCK_DGRAM")
3203@unittest.skipUnless(thread, 'Threading required for this test.')
3204class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3205 pass
3206
3207@requireAttrs(socket.socket, "recvmsg")
3208@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3209@requireAttrs(socket, "IPPROTO_IPV6")
3210@requireSocket("AF_INET6", "SOCK_DGRAM")
3211@unittest.skipUnless(thread, 'Threading required for this test.')
3212class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3213 SendrecvmsgUDP6TestBase):
3214 pass
3215
3216@requireAttrs(socket.socket, "recvmsg_into")
3217@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3218@requireAttrs(socket, "IPPROTO_IPV6")
3219@requireSocket("AF_INET6", "SOCK_DGRAM")
3220@unittest.skipUnless(thread, 'Threading required for this test.')
3221class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3222 RFC3542AncillaryTest,
3223 SendrecvmsgUDP6TestBase):
3224 pass
3225
3226
3227class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3228 ConnectedStreamTestMixin, TCPTestBase):
3229 pass
3230
3231@requireAttrs(socket.socket, "sendmsg")
3232@unittest.skipUnless(thread, 'Threading required for this test.')
3233class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3234 pass
3235
3236@requireAttrs(socket.socket, "recvmsg")
3237@unittest.skipUnless(thread, 'Threading required for this test.')
3238class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3239 SendrecvmsgTCPTestBase):
3240 pass
3241
3242@requireAttrs(socket.socket, "recvmsg_into")
3243@unittest.skipUnless(thread, 'Threading required for this test.')
3244class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3245 SendrecvmsgTCPTestBase):
3246 pass
3247
3248
3249class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3250 SendrecvmsgConnectedBase,
3251 ConnectedStreamTestMixin, SCTPStreamBase):
3252 pass
3253
3254@requireAttrs(socket.socket, "sendmsg")
3255@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3256@unittest.skipUnless(thread, 'Threading required for this test.')
3257class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3258 pass
3259
3260@requireAttrs(socket.socket, "recvmsg")
3261@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3262@unittest.skipUnless(thread, 'Threading required for this test.')
3263class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3264 SendrecvmsgSCTPStreamTestBase):
3265 pass
3266
3267@requireAttrs(socket.socket, "recvmsg_into")
3268@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3269@unittest.skipUnless(thread, 'Threading required for this test.')
3270class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3271 SendrecvmsgSCTPStreamTestBase):
3272 pass
3273
3274
3275class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3276 ConnectedStreamTestMixin, UnixStreamBase):
3277 pass
3278
3279@requireAttrs(socket.socket, "sendmsg")
3280@requireAttrs(socket, "AF_UNIX")
3281@unittest.skipUnless(thread, 'Threading required for this test.')
3282class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3283 pass
3284
3285@requireAttrs(socket.socket, "recvmsg")
3286@requireAttrs(socket, "AF_UNIX")
3287@unittest.skipUnless(thread, 'Threading required for this test.')
3288class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3289 SendrecvmsgUnixStreamTestBase):
3290 pass
3291
3292@requireAttrs(socket.socket, "recvmsg_into")
3293@requireAttrs(socket, "AF_UNIX")
3294@unittest.skipUnless(thread, 'Threading required for this test.')
3295class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3296 SendrecvmsgUnixStreamTestBase):
3297 pass
3298
3299@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3300@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3301@unittest.skipUnless(thread, 'Threading required for this test.')
3302class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3303 pass
3304
3305@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3306@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3307@unittest.skipUnless(thread, 'Threading required for this test.')
3308class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3309 SendrecvmsgUnixStreamTestBase):
3310 pass
3311
3312
3313# Test interrupting the interruptible send/receive methods with a
3314# signal when a timeout is set. These tests avoid having multiple
3315# threads alive during the test so that the OS cannot deliver the
3316# signal to the wrong one.
3317
3318class InterruptedTimeoutBase(unittest.TestCase):
3319 # Base class for interrupted send/receive tests. Installs an
3320 # empty handler for SIGALRM and removes it on teardown, along with
3321 # any scheduled alarms.
3322
3323 def setUp(self):
3324 super().setUp()
3325 orig_alrm_handler = signal.signal(signal.SIGALRM,
3326 lambda signum, frame: None)
3327 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3328 self.addCleanup(self.setAlarm, 0)
3329
3330 # Timeout for socket operations
3331 timeout = 4.0
3332
3333 # Provide setAlarm() method to schedule delivery of SIGALRM after
3334 # given number of seconds, or cancel it if zero, and an
3335 # appropriate time value to use. Use setitimer() if available.
3336 if hasattr(signal, "setitimer"):
3337 alarm_time = 0.05
3338
3339 def setAlarm(self, seconds):
3340 signal.setitimer(signal.ITIMER_REAL, seconds)
3341 else:
3342 # Old systems may deliver the alarm up to one second early
3343 alarm_time = 2
3344
3345 def setAlarm(self, seconds):
3346 signal.alarm(seconds)
3347
3348
3349# Require siginterrupt() in order to ensure that system calls are
3350# interrupted by default.
3351@requireAttrs(signal, "siginterrupt")
3352@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3353 "Don't have signal.alarm or signal.setitimer")
3354class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3355 # Test interrupting the recv*() methods with signals when a
3356 # timeout is set.
3357
3358 def setUp(self):
3359 super().setUp()
3360 self.serv.settimeout(self.timeout)
3361
3362 def checkInterruptedRecv(self, func, *args, **kwargs):
3363 # Check that func(*args, **kwargs) raises socket.error with an
3364 # errno of EINTR when interrupted by a signal.
3365 self.setAlarm(self.alarm_time)
3366 with self.assertRaises(socket.error) as cm:
3367 func(*args, **kwargs)
3368 self.assertNotIsInstance(cm.exception, socket.timeout)
3369 self.assertEqual(cm.exception.errno, errno.EINTR)
3370
3371 def testInterruptedRecvTimeout(self):
3372 self.checkInterruptedRecv(self.serv.recv, 1024)
3373
3374 def testInterruptedRecvIntoTimeout(self):
3375 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3376
3377 def testInterruptedRecvfromTimeout(self):
3378 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3379
3380 def testInterruptedRecvfromIntoTimeout(self):
3381 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3382
3383 @requireAttrs(socket.socket, "recvmsg")
3384 def testInterruptedRecvmsgTimeout(self):
3385 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3386
3387 @requireAttrs(socket.socket, "recvmsg_into")
3388 def testInterruptedRecvmsgIntoTimeout(self):
3389 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3390
3391
3392# Require siginterrupt() in order to ensure that system calls are
3393# interrupted by default.
3394@requireAttrs(signal, "siginterrupt")
3395@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3396 "Don't have signal.alarm or signal.setitimer")
3397@unittest.skipUnless(thread, 'Threading required for this test.')
3398class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3399 ThreadSafeCleanupTestCase,
3400 SocketListeningTestMixin, TCPTestBase):
3401 # Test interrupting the interruptible send*() methods with signals
3402 # when a timeout is set.
3403
3404 def setUp(self):
3405 super().setUp()
3406 self.serv_conn = self.newSocket()
3407 self.addCleanup(self.serv_conn.close)
3408 # Use a thread to complete the connection, but wait for it to
3409 # terminate before running the test, so that there is only one
3410 # thread to accept the signal.
3411 cli_thread = threading.Thread(target=self.doConnect)
3412 cli_thread.start()
3413 self.cli_conn, addr = self.serv.accept()
3414 self.addCleanup(self.cli_conn.close)
3415 cli_thread.join()
3416 self.serv_conn.settimeout(self.timeout)
3417
3418 def doConnect(self):
3419 self.serv_conn.connect(self.serv_addr)
3420
3421 def checkInterruptedSend(self, func, *args, **kwargs):
3422 # Check that func(*args, **kwargs), run in a loop, raises
3423 # socket.error with an errno of EINTR when interrupted by a
3424 # signal.
3425 with self.assertRaises(socket.error) as cm:
3426 while True:
3427 self.setAlarm(self.alarm_time)
3428 func(*args, **kwargs)
3429 self.assertNotIsInstance(cm.exception, socket.timeout)
3430 self.assertEqual(cm.exception.errno, errno.EINTR)
3431
Nick Coghlan2496f332011-09-19 20:26:31 +10003432 # Issue #12958: The following tests have problems on Mac OS X
3433 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003434 def testInterruptedSendTimeout(self):
3435 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3436
Nick Coghlan2496f332011-09-19 20:26:31 +10003437 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003438 def testInterruptedSendtoTimeout(self):
3439 # Passing an actual address here as Python's wrapper for
3440 # sendto() doesn't allow passing a zero-length one; POSIX
3441 # requires that the address is ignored since the socket is
3442 # connection-mode, however.
3443 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3444 self.serv_addr)
3445
Nick Coghlan2496f332011-09-19 20:26:31 +10003446 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003447 @requireAttrs(socket.socket, "sendmsg")
3448 def testInterruptedSendmsgTimeout(self):
3449 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3450
3451
Victor Stinner45df8202010-04-28 22:31:17 +00003452@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003453class TCPCloserTest(ThreadedTCPSocketTest):
3454
3455 def testClose(self):
3456 conn, addr = self.serv.accept()
3457 conn.close()
3458
3459 sd = self.cli
3460 read, write, err = select.select([sd], [], [], 1.0)
3461 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003462 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003463
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003464 # Calling close() many times should be safe.
3465 conn.close()
3466 conn.close()
3467
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003468 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003469 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003470 time.sleep(1.0)
3471
Victor Stinner45df8202010-04-28 22:31:17 +00003472@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003473class BasicSocketPairTest(SocketPairTest):
3474
3475 def __init__(self, methodName='runTest'):
3476 SocketPairTest.__init__(self, methodName=methodName)
3477
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003478 def _check_defaults(self, sock):
3479 self.assertIsInstance(sock, socket.socket)
3480 if hasattr(socket, 'AF_UNIX'):
3481 self.assertEqual(sock.family, socket.AF_UNIX)
3482 else:
3483 self.assertEqual(sock.family, socket.AF_INET)
3484 self.assertEqual(sock.type, socket.SOCK_STREAM)
3485 self.assertEqual(sock.proto, 0)
3486
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003487 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003488 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003489
3490 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003491 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003492
Dave Cole331708b2004-08-09 04:51:41 +00003493 def testRecv(self):
3494 msg = self.serv.recv(1024)
3495 self.assertEqual(msg, MSG)
3496
3497 def _testRecv(self):
3498 self.cli.send(MSG)
3499
3500 def testSend(self):
3501 self.serv.send(MSG)
3502
3503 def _testSend(self):
3504 msg = self.cli.recv(1024)
3505 self.assertEqual(msg, MSG)
3506
Victor Stinner45df8202010-04-28 22:31:17 +00003507@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003508class NonBlockingTCPTests(ThreadedTCPSocketTest):
3509
3510 def __init__(self, methodName='runTest'):
3511 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3512
3513 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003514 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003515 self.serv.setblocking(0)
3516 start = time.time()
3517 try:
3518 self.serv.accept()
3519 except socket.error:
3520 pass
3521 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003522 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003523
3524 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003525 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003526
Antoine Pitroub1c54962010-10-14 15:05:38 +00003527 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003528 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003529 def testInitNonBlocking(self):
3530 # reinit server socket
3531 self.serv.close()
3532 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003533 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003534 self.port = support.bind_port(self.serv)
3535 self.serv.listen(1)
3536 # actual testing
3537 start = time.time()
3538 try:
3539 self.serv.accept()
3540 except socket.error:
3541 pass
3542 end = time.time()
3543 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3544
3545 def _testInitNonBlocking(self):
3546 pass
3547
Antoine Pitrou600232b2011-01-05 21:03:42 +00003548 def testInheritFlags(self):
3549 # Issue #7995: when calling accept() on a listening socket with a
3550 # timeout, the resulting socket should not be non-blocking.
3551 self.serv.settimeout(10)
3552 try:
3553 conn, addr = self.serv.accept()
3554 message = conn.recv(len(MSG))
3555 finally:
3556 conn.close()
3557 self.serv.settimeout(None)
3558
3559 def _testInheritFlags(self):
3560 time.sleep(0.1)
3561 self.cli.connect((HOST, self.port))
3562 time.sleep(0.5)
3563 self.cli.send(MSG)
3564
Guido van Rossum24e4af82002-06-12 19:18:08 +00003565 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003566 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003567 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003568 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003569 conn, addr = self.serv.accept()
3570 except socket.error:
3571 pass
3572 else:
3573 self.fail("Error trying to do non-blocking accept.")
3574 read, write, err = select.select([self.serv], [], [])
3575 if self.serv in read:
3576 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003577 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003578 else:
3579 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003580
Guido van Rossum24e4af82002-06-12 19:18:08 +00003581 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003582 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003583 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003584
3585 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003586 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003587 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003588 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003589
3590 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003591 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003592 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003593
3594 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003595 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003596 conn, addr = self.serv.accept()
3597 conn.setblocking(0)
3598 try:
3599 msg = conn.recv(len(MSG))
3600 except socket.error:
3601 pass
3602 else:
3603 self.fail("Error trying to do non-blocking recv.")
3604 read, write, err = select.select([conn], [], [])
3605 if conn in read:
3606 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003607 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003608 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003609 else:
3610 self.fail("Error during select call to non-blocking socket.")
3611
3612 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003613 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003614 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003615 self.cli.send(MSG)
3616
Victor Stinner45df8202010-04-28 22:31:17 +00003617@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003618class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003619 """Unit tests for the object returned by socket.makefile()
3620
Antoine Pitrou834bd812010-10-13 16:17:14 +00003621 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003622 the client connection. You can read from this file to
3623 get output from the server.
3624
Antoine Pitrou834bd812010-10-13 16:17:14 +00003625 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003626 server connection. You can write to this file to send output
3627 to the client.
3628 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003629
Guido van Rossume9f66142002-08-07 15:46:19 +00003630 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003631 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003632 errors = 'strict'
3633 newline = None
3634
3635 read_mode = 'rb'
3636 read_msg = MSG
3637 write_mode = 'wb'
3638 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003639
Guido van Rossum24e4af82002-06-12 19:18:08 +00003640 def __init__(self, methodName='runTest'):
3641 SocketConnectedTest.__init__(self, methodName=methodName)
3642
3643 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003644 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3645 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003646 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003647 self.read_file = self.cli_conn.makefile(
3648 self.read_mode, self.bufsize,
3649 encoding = self.encoding,
3650 errors = self.errors,
3651 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003652
3653 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003654 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003655 self.read_file.close()
3656 self.assertTrue(self.read_file.closed)
3657 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003658 SocketConnectedTest.tearDown(self)
3659
3660 def clientSetUp(self):
3661 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003662 self.write_file = self.serv_conn.makefile(
3663 self.write_mode, self.bufsize,
3664 encoding = self.encoding,
3665 errors = self.errors,
3666 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003667
3668 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003669 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003670 self.write_file.close()
3671 self.assertTrue(self.write_file.closed)
3672 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003673 SocketConnectedTest.clientTearDown(self)
3674
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003675 def testReadAfterTimeout(self):
3676 # Issue #7322: A file object must disallow further reads
3677 # after a timeout has occurred.
3678 self.cli_conn.settimeout(1)
3679 self.read_file.read(3)
3680 # First read raises a timeout
3681 self.assertRaises(socket.timeout, self.read_file.read, 1)
3682 # Second read is disallowed
3683 with self.assertRaises(IOError) as ctx:
3684 self.read_file.read(1)
3685 self.assertIn("cannot read from timed out object", str(ctx.exception))
3686
3687 def _testReadAfterTimeout(self):
3688 self.write_file.write(self.write_msg[0:3])
3689 self.write_file.flush()
3690 self.serv_finished.wait()
3691
Guido van Rossum24e4af82002-06-12 19:18:08 +00003692 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003693 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003694 first_seg = self.read_file.read(len(self.read_msg)-3)
3695 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003696 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003697 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003698
3699 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003700 self.write_file.write(self.write_msg)
3701 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003702
Guido van Rossum8c943832002-08-08 01:00:28 +00003703 def testFullRead(self):
3704 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003705 msg = self.read_file.read()
3706 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003707
3708 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003709 self.write_file.write(self.write_msg)
3710 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003711
Guido van Rossum24e4af82002-06-12 19:18:08 +00003712 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003713 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003714 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003715 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003716 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003717 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003718 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003719 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003720 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003721
3722 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003723 self.write_file.write(self.write_msg)
3724 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003725
3726 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003727 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003728 line = self.read_file.readline()
3729 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003730
3731 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003732 self.write_file.write(self.write_msg)
3733 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003734
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003735 def testCloseAfterMakefile(self):
3736 # The file returned by makefile should keep the socket open.
3737 self.cli_conn.close()
3738 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003739 msg = self.read_file.read()
3740 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003741
3742 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003743 self.write_file.write(self.write_msg)
3744 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003745
3746 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003747 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003748 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003749 if isinstance(self.read_msg, str):
3750 msg = msg.decode()
3751 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003752
3753 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003754 self.write_file.write(self.write_msg)
3755 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003756
Tim Peters116d83c2004-03-28 02:20:45 +00003757 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003758 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003759
3760 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003761 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003762
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003763 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003764 self.assertEqual(self.read_file.mode, self.read_mode)
3765 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003766
3767 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003768 self.assertEqual(self.write_file.mode, self.write_mode)
3769 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003770
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003771 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003772 self.read_file.close()
3773 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003774 self.cli_conn.close()
3775 self.assertRaises(socket.error, self.cli_conn.getsockname)
3776
3777 def _testRealClose(self):
3778 pass
3779
3780
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003781class FileObjectInterruptedTestCase(unittest.TestCase):
3782 """Test that the file object correctly handles EINTR internally."""
3783
3784 class MockSocket(object):
3785 def __init__(self, recv_funcs=()):
3786 # A generator that returns callables that we'll call for each
3787 # call to recv().
3788 self._recv_step = iter(recv_funcs)
3789
3790 def recv_into(self, buffer):
3791 data = next(self._recv_step)()
3792 assert len(buffer) >= len(data)
3793 buffer[:len(data)] = data
3794 return len(data)
3795
3796 def _decref_socketios(self):
3797 pass
3798
3799 def _textiowrap_for_test(self, buffering=-1):
3800 raw = socket.SocketIO(self, "r")
3801 if buffering < 0:
3802 buffering = io.DEFAULT_BUFFER_SIZE
3803 if buffering == 0:
3804 return raw
3805 buffer = io.BufferedReader(raw, buffering)
3806 text = io.TextIOWrapper(buffer, None, None)
3807 text.mode = "rb"
3808 return text
3809
3810 @staticmethod
3811 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003812 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003813
3814 def _textiowrap_mock_socket(self, mock, buffering=-1):
3815 raw = socket.SocketIO(mock, "r")
3816 if buffering < 0:
3817 buffering = io.DEFAULT_BUFFER_SIZE
3818 if buffering == 0:
3819 return raw
3820 buffer = io.BufferedReader(raw, buffering)
3821 text = io.TextIOWrapper(buffer, None, None)
3822 text.mode = "rb"
3823 return text
3824
3825 def _test_readline(self, size=-1, buffering=-1):
3826 mock_sock = self.MockSocket(recv_funcs=[
3827 lambda : b"This is the first line\nAnd the sec",
3828 self._raise_eintr,
3829 lambda : b"ond line is here\n",
3830 lambda : b"",
3831 lambda : b"", # XXX(gps): io library does an extra EOF read
3832 ])
3833 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003834 self.assertEqual(fo.readline(size), "This is the first line\n")
3835 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003836
3837 def _test_read(self, size=-1, buffering=-1):
3838 mock_sock = self.MockSocket(recv_funcs=[
3839 lambda : b"This is the first line\nAnd the sec",
3840 self._raise_eintr,
3841 lambda : b"ond line is here\n",
3842 lambda : b"",
3843 lambda : b"", # XXX(gps): io library does an extra EOF read
3844 ])
3845 expecting = (b"This is the first line\n"
3846 b"And the second line is here\n")
3847 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3848 if buffering == 0:
3849 data = b''
3850 else:
3851 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003852 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003853 while len(data) != len(expecting):
3854 part = fo.read(size)
3855 if not part:
3856 break
3857 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003858 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003859
3860 def test_default(self):
3861 self._test_readline()
3862 self._test_readline(size=100)
3863 self._test_read()
3864 self._test_read(size=100)
3865
3866 def test_with_1k_buffer(self):
3867 self._test_readline(buffering=1024)
3868 self._test_readline(size=100, buffering=1024)
3869 self._test_read(buffering=1024)
3870 self._test_read(size=100, buffering=1024)
3871
3872 def _test_readline_no_buffer(self, size=-1):
3873 mock_sock = self.MockSocket(recv_funcs=[
3874 lambda : b"a",
3875 lambda : b"\n",
3876 lambda : b"B",
3877 self._raise_eintr,
3878 lambda : b"b",
3879 lambda : b"",
3880 ])
3881 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003882 self.assertEqual(fo.readline(size), b"a\n")
3883 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003884
3885 def test_no_buffer(self):
3886 self._test_readline_no_buffer()
3887 self._test_readline_no_buffer(size=4)
3888 self._test_read(buffering=0)
3889 self._test_read(size=100, buffering=0)
3890
3891
Guido van Rossume9f66142002-08-07 15:46:19 +00003892class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3893
3894 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003895
Guido van Rossume9f66142002-08-07 15:46:19 +00003896 In this case (and in this case only), it should be possible to
3897 create a file object, read a line from it, create another file
3898 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003899 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003900 when reading multiple requests from the same socket."""
3901
3902 bufsize = 0 # Use unbuffered mode
3903
3904 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003905 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003906 line = self.read_file.readline() # first line
3907 self.assertEqual(line, b"A. " + self.write_msg) # first line
3908 self.read_file = self.cli_conn.makefile('rb', 0)
3909 line = self.read_file.readline() # second line
3910 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003911
3912 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003913 self.write_file.write(b"A. " + self.write_msg)
3914 self.write_file.write(b"B. " + self.write_msg)
3915 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003916
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003917 def testMakefileClose(self):
3918 # The file returned by makefile should keep the socket open...
3919 self.cli_conn.close()
3920 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003921 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003922 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003923 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003924 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3925
3926 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003927 self.write_file.write(self.write_msg)
3928 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003929
3930 def testMakefileCloseSocketDestroy(self):
3931 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003932 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003933 refcount_after = sys.getrefcount(self.cli_conn)
3934 self.assertEqual(refcount_before - 1, refcount_after)
3935
3936 def _testMakefileCloseSocketDestroy(self):
3937 pass
3938
Antoine Pitrou98b46702010-09-18 22:59:00 +00003939 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003940 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003941 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3942
3943 def testSmallReadNonBlocking(self):
3944 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3946 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003947 self.evt1.set()
3948 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003949 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003950 if first_seg is None:
3951 # Data not arrived (can happen under Windows), wait a bit
3952 time.sleep(0.5)
3953 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003954 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003955 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003956 self.assertEqual(n, 3)
3957 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003958 self.assertEqual(msg, self.read_msg)
3959 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3960 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003961
3962 def _testSmallReadNonBlocking(self):
3963 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003964 self.write_file.write(self.write_msg)
3965 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003966 self.evt2.set()
3967 # Avoid cloding the socket before the server test has finished,
3968 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3969 self.serv_finished.wait(5.0)
3970
3971 def testWriteNonBlocking(self):
3972 self.cli_finished.wait(5.0)
3973 # The client thread can't skip directly - the SkipTest exception
3974 # would appear as a failure.
3975 if self.serv_skipped:
3976 self.skipTest(self.serv_skipped)
3977
3978 def _testWriteNonBlocking(self):
3979 self.serv_skipped = None
3980 self.serv_conn.setblocking(False)
3981 # Try to saturate the socket buffer pipe with repeated large writes.
3982 BIG = b"x" * (1024 ** 2)
3983 LIMIT = 10
3984 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003985 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003986 self.assertGreater(n, 0)
3987 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003988 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003989 if n is None:
3990 # Succeeded
3991 break
3992 self.assertGreater(n, 0)
3993 else:
3994 # Let us know that this test didn't manage to establish
3995 # the expected conditions. This is not a failure in itself but,
3996 # if it happens repeatedly, the test should be fixed.
3997 self.serv_skipped = "failed to saturate the socket buffer"
3998
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003999
Guido van Rossum8c943832002-08-08 01:00:28 +00004000class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4001
4002 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4003
4004
4005class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4006
4007 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004008
Thomas Woutersb2137042007-02-01 18:02:27 +00004009
Antoine Pitrou834bd812010-10-13 16:17:14 +00004010class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4011 """Tests for socket.makefile() in text mode (rather than binary)"""
4012
4013 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004014 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004015 write_mode = 'wb'
4016 write_msg = MSG
4017 newline = ''
4018
4019
4020class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4021 """Tests for socket.makefile() in text mode (rather than binary)"""
4022
4023 read_mode = 'rb'
4024 read_msg = MSG
4025 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004026 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027 newline = ''
4028
4029
4030class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4031 """Tests for socket.makefile() in text mode (rather than binary)"""
4032
4033 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004034 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004035 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004036 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004037 newline = ''
4038
4039
Guido van Rossumd8faa362007-04-27 19:54:29 +00004040class NetworkConnectionTest(object):
4041 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004042
Guido van Rossumd8faa362007-04-27 19:54:29 +00004043 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004044 # We're inherited below by BasicTCPTest2, which also inherits
4045 # BasicTCPTest, which defines self.port referenced below.
4046 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004047 self.serv_conn = self.cli
4048
4049class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4050 """Tests that NetworkConnection does not break existing TCP functionality.
4051 """
4052
4053class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004054
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004055 class MockSocket(socket.socket):
4056 def connect(self, *args):
4057 raise socket.timeout('timed out')
4058
4059 @contextlib.contextmanager
4060 def mocked_socket_module(self):
4061 """Return a socket which times out on connect"""
4062 old_socket = socket.socket
4063 socket.socket = self.MockSocket
4064 try:
4065 yield
4066 finally:
4067 socket.socket = old_socket
4068
4069 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004070 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004071 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004072 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004073 with self.assertRaises(socket.error) as cm:
4074 cli.connect((HOST, port))
4075 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4076
4077 def test_create_connection(self):
4078 # Issue #9792: errors raised by create_connection() should have
4079 # a proper errno attribute.
4080 port = support.find_unused_port()
4081 with self.assertRaises(socket.error) as cm:
4082 socket.create_connection((HOST, port))
4083 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4084
4085 def test_create_connection_timeout(self):
4086 # Issue #9792: create_connection() should not recast timeout errors
4087 # as generic socket errors.
4088 with self.mocked_socket_module():
4089 with self.assertRaises(socket.timeout):
4090 socket.create_connection((HOST, 1234))
4091
Guido van Rossumd8faa362007-04-27 19:54:29 +00004092
Victor Stinner45df8202010-04-28 22:31:17 +00004093@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004094class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4095
4096 def __init__(self, methodName='runTest'):
4097 SocketTCPTest.__init__(self, methodName=methodName)
4098 ThreadableTest.__init__(self)
4099
4100 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004101 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004102
4103 def clientTearDown(self):
4104 self.cli.close()
4105 self.cli = None
4106 ThreadableTest.clientTearDown(self)
4107
4108 def _justAccept(self):
4109 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004110 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004111
4112 testFamily = _justAccept
4113 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004114 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004115 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004116 self.assertEqual(self.cli.family, 2)
4117
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004118 testSourceAddress = _justAccept
4119 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004120 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4121 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004122 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004123 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004124 # The port number being used is sufficient to show that the bind()
4125 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004126
Guido van Rossumd8faa362007-04-27 19:54:29 +00004127 testTimeoutDefault = _justAccept
4128 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004129 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004130 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004131 socket.setdefaulttimeout(42)
4132 try:
4133 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004134 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004135 finally:
4136 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004137 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004138
4139 testTimeoutNone = _justAccept
4140 def _testTimeoutNone(self):
4141 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004142 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004143 socket.setdefaulttimeout(30)
4144 try:
4145 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004146 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004147 finally:
4148 socket.setdefaulttimeout(None)
4149 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004150
4151 testTimeoutValueNamed = _justAccept
4152 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004153 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004154 self.assertEqual(self.cli.gettimeout(), 30)
4155
4156 testTimeoutValueNonamed = _justAccept
4157 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004158 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004159 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004160 self.assertEqual(self.cli.gettimeout(), 30)
4161
Victor Stinner45df8202010-04-28 22:31:17 +00004162@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004163class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4164
4165 def __init__(self, methodName='runTest'):
4166 SocketTCPTest.__init__(self, methodName=methodName)
4167 ThreadableTest.__init__(self)
4168
4169 def clientSetUp(self):
4170 pass
4171
4172 def clientTearDown(self):
4173 self.cli.close()
4174 self.cli = None
4175 ThreadableTest.clientTearDown(self)
4176
4177 def testInsideTimeout(self):
4178 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004179 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004180 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004181 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004182 testOutsideTimeout = testInsideTimeout
4183
4184 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004185 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004186 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004187 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004188
4189 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004190 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004191 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004192
4193
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004194class TCPTimeoutTest(SocketTCPTest):
4195
4196 def testTCPTimeout(self):
4197 def raise_timeout(*args, **kwargs):
4198 self.serv.settimeout(1.0)
4199 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004200 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004201 "Error generating a timeout exception (TCP)")
4202
4203 def testTimeoutZero(self):
4204 ok = False
4205 try:
4206 self.serv.settimeout(0.0)
4207 foo = self.serv.accept()
4208 except socket.timeout:
4209 self.fail("caught timeout instead of error (TCP)")
4210 except socket.error:
4211 ok = True
4212 except:
4213 self.fail("caught unexpected exception (TCP)")
4214 if not ok:
4215 self.fail("accept() returned success when we did not expect it")
4216
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004217 def testInterruptedTimeout(self):
4218 # XXX I don't know how to do this test on MSWindows or any other
4219 # plaform that doesn't support signal.alarm() or os.kill(), though
4220 # the bug should have existed on all platforms.
4221 if not hasattr(signal, "alarm"):
4222 return # can only test on *nix
4223 self.serv.settimeout(5.0) # must be longer than alarm
4224 class Alarm(Exception):
4225 pass
4226 def alarm_handler(signal, frame):
4227 raise Alarm
4228 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4229 try:
4230 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4231 try:
4232 foo = self.serv.accept()
4233 except socket.timeout:
4234 self.fail("caught timeout instead of Alarm")
4235 except Alarm:
4236 pass
4237 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004238 self.fail("caught other exception instead of Alarm:"
4239 " %s(%s):\n%s" %
4240 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004241 else:
4242 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004243 finally:
4244 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004245 except Alarm:
4246 self.fail("got Alarm in wrong place")
4247 finally:
4248 # no alarm can be pending. Safe to restore old handler.
4249 signal.signal(signal.SIGALRM, old_alarm)
4250
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004251class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004252
4253 def testUDPTimeout(self):
4254 def raise_timeout(*args, **kwargs):
4255 self.serv.settimeout(1.0)
4256 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004257 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004258 "Error generating a timeout exception (UDP)")
4259
4260 def testTimeoutZero(self):
4261 ok = False
4262 try:
4263 self.serv.settimeout(0.0)
4264 foo = self.serv.recv(1024)
4265 except socket.timeout:
4266 self.fail("caught timeout instead of error (UDP)")
4267 except socket.error:
4268 ok = True
4269 except:
4270 self.fail("caught unexpected exception (UDP)")
4271 if not ok:
4272 self.fail("recv() returned success when we did not expect it")
4273
4274class TestExceptions(unittest.TestCase):
4275
4276 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004277 self.assertTrue(issubclass(socket.error, Exception))
4278 self.assertTrue(issubclass(socket.herror, socket.error))
4279 self.assertTrue(issubclass(socket.gaierror, socket.error))
4280 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004281
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004282class TestLinuxAbstractNamespace(unittest.TestCase):
4283
4284 UNIX_PATH_MAX = 108
4285
4286 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004287 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004288 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4289 s1.bind(address)
4290 s1.listen(1)
4291 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4292 s2.connect(s1.getsockname())
4293 with s1.accept()[0] as s3:
4294 self.assertEqual(s1.getsockname(), address)
4295 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004296
4297 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004298 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004299 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4300 s.bind(address)
4301 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004302
4303 def testNameOverflow(self):
4304 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004305 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4306 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004307
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004308 def testStrName(self):
4309 # Check that an abstract name can be passed as a string.
4310 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4311 try:
4312 s.bind("\x00python\x00test\x00")
4313 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4314 finally:
4315 s.close()
4316
4317class TestUnixDomain(unittest.TestCase):
4318
4319 def setUp(self):
4320 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4321
4322 def tearDown(self):
4323 self.sock.close()
4324
4325 def encoded(self, path):
4326 # Return the given path encoded in the file system encoding,
4327 # or skip the test if this is not possible.
4328 try:
4329 return os.fsencode(path)
4330 except UnicodeEncodeError:
4331 self.skipTest(
4332 "Pathname {0!a} cannot be represented in file "
4333 "system encoding {1!r}".format(
4334 path, sys.getfilesystemencoding()))
4335
Antoine Pitrou16374872011-12-16 15:04:12 +01004336 def bind(self, sock, path):
4337 # Bind the socket
4338 try:
4339 sock.bind(path)
4340 except OSError as e:
4341 if str(e) == "AF_UNIX path too long":
4342 self.skipTest(
4343 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4344 .format(path))
4345 else:
4346 raise
4347
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004348 def testStrAddr(self):
4349 # Test binding to and retrieving a normal string pathname.
4350 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004351 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004352 self.addCleanup(support.unlink, path)
4353 self.assertEqual(self.sock.getsockname(), path)
4354
4355 def testBytesAddr(self):
4356 # Test binding to a bytes pathname.
4357 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004358 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004359 self.addCleanup(support.unlink, path)
4360 self.assertEqual(self.sock.getsockname(), path)
4361
4362 def testSurrogateescapeBind(self):
4363 # Test binding to a valid non-ASCII pathname, with the
4364 # non-ASCII bytes supplied using surrogateescape encoding.
4365 path = os.path.abspath(support.TESTFN_UNICODE)
4366 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004367 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004368 self.addCleanup(support.unlink, path)
4369 self.assertEqual(self.sock.getsockname(), path)
4370
4371 def testUnencodableAddr(self):
4372 # Test binding to a pathname that cannot be encoded in the
4373 # file system encoding.
4374 if support.TESTFN_UNENCODABLE is None:
4375 self.skipTest("No unencodable filename available")
4376 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004377 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004378 self.addCleanup(support.unlink, path)
4379 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004380
Victor Stinner45df8202010-04-28 22:31:17 +00004381@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004382class BufferIOTest(SocketConnectedTest):
4383 """
4384 Test the buffer versions of socket.recv() and socket.send().
4385 """
4386 def __init__(self, methodName='runTest'):
4387 SocketConnectedTest.__init__(self, methodName=methodName)
4388
Antoine Pitrou25480782010-03-17 22:50:28 +00004389 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004390 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004391 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004392 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004393 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004394 self.assertEqual(msg, MSG)
4395
Antoine Pitrou25480782010-03-17 22:50:28 +00004396 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004397 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004398 self.serv_conn.send(buf)
4399
Antoine Pitrou25480782010-03-17 22:50:28 +00004400 def testRecvIntoBytearray(self):
4401 buf = bytearray(1024)
4402 nbytes = self.cli_conn.recv_into(buf)
4403 self.assertEqual(nbytes, len(MSG))
4404 msg = buf[:len(MSG)]
4405 self.assertEqual(msg, MSG)
4406
4407 _testRecvIntoBytearray = _testRecvIntoArray
4408
4409 def testRecvIntoMemoryview(self):
4410 buf = bytearray(1024)
4411 nbytes = self.cli_conn.recv_into(memoryview(buf))
4412 self.assertEqual(nbytes, len(MSG))
4413 msg = buf[:len(MSG)]
4414 self.assertEqual(msg, MSG)
4415
4416 _testRecvIntoMemoryview = _testRecvIntoArray
4417
4418 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004419 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004420 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004421 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004422 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004423 self.assertEqual(msg, MSG)
4424
Antoine Pitrou25480782010-03-17 22:50:28 +00004425 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004426 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004427 self.serv_conn.send(buf)
4428
Antoine Pitrou25480782010-03-17 22:50:28 +00004429 def testRecvFromIntoBytearray(self):
4430 buf = bytearray(1024)
4431 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4432 self.assertEqual(nbytes, len(MSG))
4433 msg = buf[:len(MSG)]
4434 self.assertEqual(msg, MSG)
4435
4436 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4437
4438 def testRecvFromIntoMemoryview(self):
4439 buf = bytearray(1024)
4440 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4441 self.assertEqual(nbytes, len(MSG))
4442 msg = buf[:len(MSG)]
4443 self.assertEqual(msg, MSG)
4444
4445 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4446
Christian Heimes043d6f62008-01-07 17:19:16 +00004447
4448TIPC_STYPE = 2000
4449TIPC_LOWER = 200
4450TIPC_UPPER = 210
4451
4452def isTipcAvailable():
4453 """Check if the TIPC module is loaded
4454
4455 The TIPC module is not loaded automatically on Ubuntu and probably
4456 other Linux distros.
4457 """
4458 if not hasattr(socket, "AF_TIPC"):
4459 return False
4460 if not os.path.isfile("/proc/modules"):
4461 return False
4462 with open("/proc/modules") as f:
4463 for line in f:
4464 if line.startswith("tipc "):
4465 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004466 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004467 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4468 return False
4469
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004470class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004471 def testRDM(self):
4472 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4473 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004474 self.addCleanup(srv.close)
4475 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004476
4477 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4478 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4479 TIPC_LOWER, TIPC_UPPER)
4480 srv.bind(srvaddr)
4481
4482 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4483 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4484 cli.sendto(MSG, sendaddr)
4485
4486 msg, recvaddr = srv.recvfrom(1024)
4487
4488 self.assertEqual(cli.getsockname(), recvaddr)
4489 self.assertEqual(msg, MSG)
4490
4491
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004492class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004493 def __init__(self, methodName = 'runTest'):
4494 unittest.TestCase.__init__(self, methodName = methodName)
4495 ThreadableTest.__init__(self)
4496
4497 def setUp(self):
4498 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004499 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004500 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4501 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4502 TIPC_LOWER, TIPC_UPPER)
4503 self.srv.bind(srvaddr)
4504 self.srv.listen(5)
4505 self.serverExplicitReady()
4506 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004507 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004508
4509 def clientSetUp(self):
4510 # The is a hittable race between serverExplicitReady() and the
4511 # accept() call; sleep a little while to avoid it, otherwise
4512 # we could get an exception
4513 time.sleep(0.1)
4514 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004515 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004516 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4517 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4518 self.cli.connect(addr)
4519 self.cliaddr = self.cli.getsockname()
4520
4521 def testStream(self):
4522 msg = self.conn.recv(1024)
4523 self.assertEqual(msg, MSG)
4524 self.assertEqual(self.cliaddr, self.connaddr)
4525
4526 def _testStream(self):
4527 self.cli.send(MSG)
4528 self.cli.close()
4529
4530
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004531@unittest.skipUnless(thread, 'Threading required for this test.')
4532class ContextManagersTest(ThreadedTCPSocketTest):
4533
4534 def _testSocketClass(self):
4535 # base test
4536 with socket.socket() as sock:
4537 self.assertFalse(sock._closed)
4538 self.assertTrue(sock._closed)
4539 # close inside with block
4540 with socket.socket() as sock:
4541 sock.close()
4542 self.assertTrue(sock._closed)
4543 # exception inside with block
4544 with socket.socket() as sock:
4545 self.assertRaises(socket.error, sock.sendall, b'foo')
4546 self.assertTrue(sock._closed)
4547
4548 def testCreateConnectionBase(self):
4549 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004550 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004551 data = conn.recv(1024)
4552 conn.sendall(data)
4553
4554 def _testCreateConnectionBase(self):
4555 address = self.serv.getsockname()
4556 with socket.create_connection(address) as sock:
4557 self.assertFalse(sock._closed)
4558 sock.sendall(b'foo')
4559 self.assertEqual(sock.recv(1024), b'foo')
4560 self.assertTrue(sock._closed)
4561
4562 def testCreateConnectionClose(self):
4563 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004564 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004565 data = conn.recv(1024)
4566 conn.sendall(data)
4567
4568 def _testCreateConnectionClose(self):
4569 address = self.serv.getsockname()
4570 with socket.create_connection(address) as sock:
4571 sock.close()
4572 self.assertTrue(sock._closed)
4573 self.assertRaises(socket.error, sock.sendall, b'foo')
4574
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004575
Antoine Pitroub1c54962010-10-14 15:05:38 +00004576@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4577 "SOCK_CLOEXEC not defined")
4578@unittest.skipUnless(fcntl, "module fcntl not available")
4579class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004580 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004581 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004582 with socket.socket(socket.AF_INET,
4583 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4584 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4585 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004586
4587
4588@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4589 "SOCK_NONBLOCK not defined")
4590class NonblockConstantTest(unittest.TestCase):
4591 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4592 if nonblock:
4593 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4594 self.assertEqual(s.gettimeout(), timeout)
4595 else:
4596 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4597 self.assertEqual(s.gettimeout(), None)
4598
Charles-François Natali239bb962011-06-03 12:55:15 +02004599 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004600 def test_SOCK_NONBLOCK(self):
4601 # a lot of it seems silly and redundant, but I wanted to test that
4602 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004603 with socket.socket(socket.AF_INET,
4604 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4605 self.checkNonblock(s)
4606 s.setblocking(1)
4607 self.checkNonblock(s, False)
4608 s.setblocking(0)
4609 self.checkNonblock(s)
4610 s.settimeout(None)
4611 self.checkNonblock(s, False)
4612 s.settimeout(2.0)
4613 self.checkNonblock(s, timeout=2.0)
4614 s.setblocking(1)
4615 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004616 # defaulttimeout
4617 t = socket.getdefaulttimeout()
4618 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004619 with socket.socket() as s:
4620 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004621 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004622 with socket.socket() as s:
4623 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004624 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004625 with socket.socket() as s:
4626 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004627 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004628 with socket.socket() as s:
4629 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004630 socket.setdefaulttimeout(t)
4631
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004632
Guido van Rossumb995eb72002-07-31 16:08:40 +00004633def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004634 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004635 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004636
4637 tests.extend([
4638 NonBlockingTCPTests,
4639 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004640 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004641 UnbufferedFileObjectClassTestCase,
4642 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004643 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004644 UnicodeReadFileObjectClassTestCase,
4645 UnicodeWriteFileObjectClassTestCase,
4646 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004647 NetworkConnectionNoServer,
4648 NetworkConnectionAttributesTest,
4649 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004650 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004651 CloexecConstantTest,
4652 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004653 ])
Dave Cole331708b2004-08-09 04:51:41 +00004654 if hasattr(socket, "socketpair"):
4655 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004656 if hasattr(socket, "AF_UNIX"):
4657 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004658 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004659 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004660 if isTipcAvailable():
4661 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004662 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004663 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004664 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004665 tests.extend([
4666 CmsgMacroTests,
4667 SendmsgUDPTest,
4668 RecvmsgUDPTest,
4669 RecvmsgIntoUDPTest,
4670 SendmsgUDP6Test,
4671 RecvmsgUDP6Test,
4672 RecvmsgRFC3542AncillaryUDP6Test,
4673 RecvmsgIntoRFC3542AncillaryUDP6Test,
4674 RecvmsgIntoUDP6Test,
4675 SendmsgTCPTest,
4676 RecvmsgTCPTest,
4677 RecvmsgIntoTCPTest,
4678 SendmsgSCTPStreamTest,
4679 RecvmsgSCTPStreamTest,
4680 RecvmsgIntoSCTPStreamTest,
4681 SendmsgUnixStreamTest,
4682 RecvmsgUnixStreamTest,
4683 RecvmsgIntoUnixStreamTest,
4684 RecvmsgSCMRightsStreamTest,
4685 RecvmsgIntoSCMRightsStreamTest,
4686 # These are slow when setitimer() is not available
4687 InterruptedRecvTimeoutTest,
4688 InterruptedSendTimeoutTest,
4689 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004690
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004691 thread_info = support.threading_setup()
4692 support.run_unittest(*tests)
4693 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004694
4695if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004696 test_main()