blob: d277e36cd2b973c72ae4d0044dce080d9272e9a3 [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):
1171 # these should all be successful
1172 socket.gethostbyname('испытание.python.org')
1173 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001174 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1175 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1176 # have a reverse entry yet
1177 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001178
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001179 def check_sendall_interrupted(self, with_timeout):
1180 # socketpair() is not stricly required, but it makes things easier.
1181 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1182 self.skipTest("signal.alarm and socket.socketpair required for this test")
1183 # Our signal handlers clobber the C errno by calling a math function
1184 # with an invalid domain value.
1185 def ok_handler(*args):
1186 self.assertRaises(ValueError, math.acosh, 0)
1187 def raising_handler(*args):
1188 self.assertRaises(ValueError, math.acosh, 0)
1189 1 // 0
1190 c, s = socket.socketpair()
1191 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1192 try:
1193 if with_timeout:
1194 # Just above the one second minimum for signal.alarm
1195 c.settimeout(1.5)
1196 with self.assertRaises(ZeroDivisionError):
1197 signal.alarm(1)
1198 c.sendall(b"x" * (1024**2))
1199 if with_timeout:
1200 signal.signal(signal.SIGALRM, ok_handler)
1201 signal.alarm(1)
1202 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1203 finally:
1204 signal.signal(signal.SIGALRM, old_alarm)
1205 c.close()
1206 s.close()
1207
1208 def test_sendall_interrupted(self):
1209 self.check_sendall_interrupted(False)
1210
1211 def test_sendall_interrupted_with_timeout(self):
1212 self.check_sendall_interrupted(True)
1213
Antoine Pitroue033e062010-10-29 10:38:18 +00001214 def test_dealloc_warn(self):
1215 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1216 r = repr(sock)
1217 with self.assertWarns(ResourceWarning) as cm:
1218 sock = None
1219 support.gc_collect()
1220 self.assertIn(r, str(cm.warning.args[0]))
1221 # An open socket file object gets dereferenced after the socket
1222 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1223 f = sock.makefile('rb')
1224 r = repr(sock)
1225 sock = None
1226 support.gc_collect()
1227 with self.assertWarns(ResourceWarning):
1228 f = None
1229 support.gc_collect()
1230
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001231 def test_name_closed_socketio(self):
1232 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1233 fp = sock.makefile("rb")
1234 fp.close()
1235 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1236
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001237 def test_pickle(self):
1238 sock = socket.socket()
1239 with sock:
1240 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1241 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1242
Antoine Pitrou3cade992011-05-10 19:19:13 +02001243 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001244 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1245 srv.bind((HOST, 0))
1246 # backlog = 0
1247 srv.listen(0)
1248 srv.close()
1249
Charles-François Natali42663332012-01-02 15:57:30 +01001250 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001251 def test_flowinfo(self):
1252 self.assertRaises(OverflowError, socket.getnameinfo,
1253 ('::1',0, 0xffffffff), 0)
1254 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1255 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1256
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001257
Charles-François Natali47413c12011-10-06 19:47:44 +02001258@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1259class BasicCANTest(unittest.TestCase):
1260
1261 def testCrucialConstants(self):
1262 socket.AF_CAN
1263 socket.PF_CAN
1264 socket.CAN_RAW
1265
1266 def testCreateSocket(self):
1267 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1268 pass
1269
1270 def testBindAny(self):
1271 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1272 s.bind(('', ))
1273
1274 def testTooLongInterfaceName(self):
1275 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1276 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001277 self.assertRaisesRegex(socket.error, 'interface name too long',
1278 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001279
1280 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1281 'socket.CAN_RAW_LOOPBACK required for this test.')
1282 def testLoopback(self):
1283 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1284 for loopback in (0, 1):
1285 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1286 loopback)
1287 self.assertEqual(loopback,
1288 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1289
1290 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1291 'socket.CAN_RAW_FILTER required for this test.')
1292 def testFilter(self):
1293 can_id, can_mask = 0x200, 0x700
1294 can_filter = struct.pack("=II", can_id, can_mask)
1295 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1296 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1297 self.assertEqual(can_filter,
1298 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1299
1300
1301@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1302@unittest.skipUnless(thread, 'Threading required for this test.')
1303class CANTest(ThreadedCANSocketTest):
1304
1305 """The CAN frame structure is defined in <linux/can.h>:
1306
1307 struct can_frame {
1308 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1309 __u8 can_dlc; /* data length code: 0 .. 8 */
1310 __u8 data[8] __attribute__((aligned(8)));
1311 };
1312 """
1313 can_frame_fmt = "=IB3x8s"
1314
1315 def __init__(self, methodName='runTest'):
1316 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1317
1318 @classmethod
1319 def build_can_frame(cls, can_id, data):
1320 """Build a CAN frame."""
1321 can_dlc = len(data)
1322 data = data.ljust(8, b'\x00')
1323 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1324
1325 @classmethod
1326 def dissect_can_frame(cls, frame):
1327 """Dissect a CAN frame."""
1328 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1329 return (can_id, can_dlc, data[:can_dlc])
1330
1331 def testSendFrame(self):
1332 cf, addr = self.s.recvfrom(self.bufsize)
1333 self.assertEqual(self.cf, cf)
1334 self.assertEqual(addr[0], self.interface)
1335 self.assertEqual(addr[1], socket.AF_CAN)
1336
1337 def _testSendFrame(self):
1338 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1339 self.cli.send(self.cf)
1340
1341 def testSendMaxFrame(self):
1342 cf, addr = self.s.recvfrom(self.bufsize)
1343 self.assertEqual(self.cf, cf)
1344
1345 def _testSendMaxFrame(self):
1346 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1347 self.cli.send(self.cf)
1348
1349 def testSendMultiFrames(self):
1350 cf, addr = self.s.recvfrom(self.bufsize)
1351 self.assertEqual(self.cf1, cf)
1352
1353 cf, addr = self.s.recvfrom(self.bufsize)
1354 self.assertEqual(self.cf2, cf)
1355
1356 def _testSendMultiFrames(self):
1357 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1358 self.cli.send(self.cf1)
1359
1360 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1361 self.cli.send(self.cf2)
1362
1363
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001364@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1365class BasicRDSTest(unittest.TestCase):
1366
1367 def testCrucialConstants(self):
1368 socket.AF_RDS
1369 socket.PF_RDS
1370
1371 def testCreateSocket(self):
1372 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1373 pass
1374
1375 def testSocketBufferSize(self):
1376 bufsize = 16384
1377 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1378 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1379 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1380
1381
1382@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1383@unittest.skipUnless(thread, 'Threading required for this test.')
1384class RDSTest(ThreadedRDSSocketTest):
1385
1386 def __init__(self, methodName='runTest'):
1387 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1388
Charles-François Natali240c55f2011-11-10 20:33:36 +01001389 def setUp(self):
1390 super().setUp()
1391 self.evt = threading.Event()
1392
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001393 def testSendAndRecv(self):
1394 data, addr = self.serv.recvfrom(self.bufsize)
1395 self.assertEqual(self.data, data)
1396 self.assertEqual(self.cli_addr, addr)
1397
1398 def _testSendAndRecv(self):
1399 self.data = b'spam'
1400 self.cli.sendto(self.data, 0, (HOST, self.port))
1401
1402 def testPeek(self):
1403 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1404 self.assertEqual(self.data, data)
1405 data, addr = self.serv.recvfrom(self.bufsize)
1406 self.assertEqual(self.data, data)
1407
1408 def _testPeek(self):
1409 self.data = b'spam'
1410 self.cli.sendto(self.data, 0, (HOST, self.port))
1411
1412 @requireAttrs(socket.socket, 'recvmsg')
1413 def testSendAndRecvMsg(self):
1414 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1415 self.assertEqual(self.data, data)
1416
1417 @requireAttrs(socket.socket, 'sendmsg')
1418 def _testSendAndRecvMsg(self):
1419 self.data = b'hello ' * 10
1420 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1421
1422 def testSendAndRecvMulti(self):
1423 data, addr = self.serv.recvfrom(self.bufsize)
1424 self.assertEqual(self.data1, data)
1425
1426 data, addr = self.serv.recvfrom(self.bufsize)
1427 self.assertEqual(self.data2, data)
1428
1429 def _testSendAndRecvMulti(self):
1430 self.data1 = b'bacon'
1431 self.cli.sendto(self.data1, 0, (HOST, self.port))
1432
1433 self.data2 = b'egg'
1434 self.cli.sendto(self.data2, 0, (HOST, self.port))
1435
1436 def testSelect(self):
1437 r, w, x = select.select([self.serv], [], [], 3.0)
1438 self.assertIn(self.serv, r)
1439 data, addr = self.serv.recvfrom(self.bufsize)
1440 self.assertEqual(self.data, data)
1441
1442 def _testSelect(self):
1443 self.data = b'select'
1444 self.cli.sendto(self.data, 0, (HOST, self.port))
1445
1446 def testCongestion(self):
1447 # wait until the sender is done
1448 self.evt.wait()
1449
1450 def _testCongestion(self):
1451 # test the behavior in case of congestion
1452 self.data = b'fill'
1453 self.cli.setblocking(False)
1454 try:
1455 # try to lower the receiver's socket buffer size
1456 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1457 except OSError:
1458 pass
1459 with self.assertRaises(OSError) as cm:
1460 try:
1461 # fill the receiver's socket buffer
1462 while True:
1463 self.cli.sendto(self.data, 0, (HOST, self.port))
1464 finally:
1465 # signal the receiver we're done
1466 self.evt.set()
1467 # sendto() should have failed with ENOBUFS
1468 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1469 # and we should have received a congestion notification through poll
1470 r, w, x = select.select([self.serv], [], [], 3.0)
1471 self.assertIn(self.serv, r)
1472
1473
Victor Stinner45df8202010-04-28 22:31:17 +00001474@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001475class BasicTCPTest(SocketConnectedTest):
1476
1477 def __init__(self, methodName='runTest'):
1478 SocketConnectedTest.__init__(self, methodName=methodName)
1479
1480 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001481 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001482 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001483 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001484
1485 def _testRecv(self):
1486 self.serv_conn.send(MSG)
1487
1488 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001489 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001490 seg1 = self.cli_conn.recv(len(MSG) - 3)
1491 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001492 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001493 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001494
1495 def _testOverFlowRecv(self):
1496 self.serv_conn.send(MSG)
1497
1498 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001499 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001500 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001501 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001502
1503 def _testRecvFrom(self):
1504 self.serv_conn.send(MSG)
1505
1506 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001507 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001508 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1509 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001510 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001511 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001512
1513 def _testOverFlowRecvFrom(self):
1514 self.serv_conn.send(MSG)
1515
1516 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001517 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001518 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001519 while 1:
1520 read = self.cli_conn.recv(1024)
1521 if not read:
1522 break
Guido van Rossume531e292002-08-08 20:28:34 +00001523 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001524 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001525
1526 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001527 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001528 self.serv_conn.sendall(big_chunk)
1529
1530 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001531 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001532 fd = self.cli_conn.fileno()
1533 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001534 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001535 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001536 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001537 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001538
1539 def _testFromFd(self):
1540 self.serv_conn.send(MSG)
1541
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001542 def testDup(self):
1543 # Testing dup()
1544 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001545 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001546 msg = sock.recv(1024)
1547 self.assertEqual(msg, MSG)
1548
1549 def _testDup(self):
1550 self.serv_conn.send(MSG)
1551
Guido van Rossum24e4af82002-06-12 19:18:08 +00001552 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001553 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001554 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001555 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001556 # wait for _testShutdown to finish: on OS X, when the server
1557 # closes the connection the client also becomes disconnected,
1558 # and the client's shutdown call will fail. (Issue #4397.)
1559 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001560
1561 def _testShutdown(self):
1562 self.serv_conn.send(MSG)
1563 self.serv_conn.shutdown(2)
1564
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001565 def testDetach(self):
1566 # Testing detach()
1567 fileno = self.cli_conn.fileno()
1568 f = self.cli_conn.detach()
1569 self.assertEqual(f, fileno)
1570 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001571 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1572 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001573 # ...but we can create another socket using the (still open)
1574 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001575 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001576 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001577 msg = sock.recv(1024)
1578 self.assertEqual(msg, MSG)
1579
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001580 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001581 self.serv_conn.send(MSG)
1582
Victor Stinner45df8202010-04-28 22:31:17 +00001583@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001584class BasicUDPTest(ThreadedUDPSocketTest):
1585
1586 def __init__(self, methodName='runTest'):
1587 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1588
1589 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001590 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001591 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001592 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001593
1594 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001595 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001596
Guido van Rossum1c938012002-06-12 21:17:20 +00001597 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001598 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001599 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001600 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001601
Guido van Rossum1c938012002-06-12 21:17:20 +00001602 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001603 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001604
Guido van Rossumd8faa362007-04-27 19:54:29 +00001605 def testRecvFromNegative(self):
1606 # Negative lengths passed to recvfrom should give ValueError.
1607 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1608
1609 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001610 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001611
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001612# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1613# same test code is used with different families and types of socket
1614# (e.g. stream, datagram), and tests using recvmsg() are repeated
1615# using recvmsg_into().
1616#
1617# The generic test classes such as SendmsgTests and
1618# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1619# supplied with sockets cli_sock and serv_sock representing the
1620# client's and the server's end of the connection respectively, and
1621# attributes cli_addr and serv_addr holding their (numeric where
1622# appropriate) addresses.
1623#
1624# The final concrete test classes combine these with subclasses of
1625# SocketTestBase which set up client and server sockets of a specific
1626# type, and with subclasses of SendrecvmsgBase such as
1627# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1628# sockets to cli_sock and serv_sock and override the methods and
1629# attributes of SendrecvmsgBase to fill in destination addresses if
1630# needed when sending, check for specific flags in msg_flags, etc.
1631#
1632# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1633# recvmsg_into().
1634
1635# XXX: like the other datagram (UDP) tests in this module, the code
1636# here assumes that datagram delivery on the local machine will be
1637# reliable.
1638
1639class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1640 # Base class for sendmsg()/recvmsg() tests.
1641
1642 # Time in seconds to wait before considering a test failed, or
1643 # None for no timeout. Not all tests actually set a timeout.
1644 fail_timeout = 3.0
1645
1646 def setUp(self):
1647 self.misc_event = threading.Event()
1648 super().setUp()
1649
1650 def sendToServer(self, msg):
1651 # Send msg to the server.
1652 return self.cli_sock.send(msg)
1653
1654 # Tuple of alternative default arguments for sendmsg() when called
1655 # via sendmsgToServer() (e.g. to include a destination address).
1656 sendmsg_to_server_defaults = ()
1657
1658 def sendmsgToServer(self, *args):
1659 # Call sendmsg() on self.cli_sock with the given arguments,
1660 # filling in any arguments which are not supplied with the
1661 # corresponding items of self.sendmsg_to_server_defaults, if
1662 # any.
1663 return self.cli_sock.sendmsg(
1664 *(args + self.sendmsg_to_server_defaults[len(args):]))
1665
1666 def doRecvmsg(self, sock, bufsize, *args):
1667 # Call recvmsg() on sock with given arguments and return its
1668 # result. Should be used for tests which can use either
1669 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1670 # this method with one which emulates it using recvmsg_into(),
1671 # thus allowing the same test to be used for both methods.
1672 result = sock.recvmsg(bufsize, *args)
1673 self.registerRecvmsgResult(result)
1674 return result
1675
1676 def registerRecvmsgResult(self, result):
1677 # Called by doRecvmsg() with the return value of recvmsg() or
1678 # recvmsg_into(). Can be overridden to arrange cleanup based
1679 # on the returned ancillary data, for instance.
1680 pass
1681
1682 def checkRecvmsgAddress(self, addr1, addr2):
1683 # Called to compare the received address with the address of
1684 # the peer.
1685 self.assertEqual(addr1, addr2)
1686
1687 # Flags that are normally unset in msg_flags
1688 msg_flags_common_unset = 0
1689 for name in ("MSG_CTRUNC", "MSG_OOB"):
1690 msg_flags_common_unset |= getattr(socket, name, 0)
1691
1692 # Flags that are normally set
1693 msg_flags_common_set = 0
1694
1695 # Flags set when a complete record has been received (e.g. MSG_EOR
1696 # for SCTP)
1697 msg_flags_eor_indicator = 0
1698
1699 # Flags set when a complete record has not been received
1700 # (e.g. MSG_TRUNC for datagram sockets)
1701 msg_flags_non_eor_indicator = 0
1702
1703 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1704 # Method to check the value of msg_flags returned by recvmsg[_into]().
1705 #
1706 # Checks that all bits in msg_flags_common_set attribute are
1707 # set in "flags" and all bits in msg_flags_common_unset are
1708 # unset.
1709 #
1710 # The "eor" argument specifies whether the flags should
1711 # indicate that a full record (or datagram) has been received.
1712 # If "eor" is None, no checks are done; otherwise, checks
1713 # that:
1714 #
1715 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1716 # set and all bits in msg_flags_non_eor_indicator are unset
1717 #
1718 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1719 # are set and all bits in msg_flags_eor_indicator are unset
1720 #
1721 # If "checkset" and/or "checkunset" are supplied, they require
1722 # the given bits to be set or unset respectively, overriding
1723 # what the attributes require for those bits.
1724 #
1725 # If any bits are set in "ignore", they will not be checked,
1726 # regardless of the other inputs.
1727 #
1728 # Will raise Exception if the inputs require a bit to be both
1729 # set and unset, and it is not ignored.
1730
1731 defaultset = self.msg_flags_common_set
1732 defaultunset = self.msg_flags_common_unset
1733
1734 if eor:
1735 defaultset |= self.msg_flags_eor_indicator
1736 defaultunset |= self.msg_flags_non_eor_indicator
1737 elif eor is not None:
1738 defaultset |= self.msg_flags_non_eor_indicator
1739 defaultunset |= self.msg_flags_eor_indicator
1740
1741 # Function arguments override defaults
1742 defaultset &= ~checkunset
1743 defaultunset &= ~checkset
1744
1745 # Merge arguments with remaining defaults, and check for conflicts
1746 checkset |= defaultset
1747 checkunset |= defaultunset
1748 inboth = checkset & checkunset & ~ignore
1749 if inboth:
1750 raise Exception("contradictory set, unset requirements for flags "
1751 "{0:#x}".format(inboth))
1752
1753 # Compare with given msg_flags value
1754 mask = (checkset | checkunset) & ~ignore
1755 self.assertEqual(flags & mask, checkset & mask)
1756
1757
1758class RecvmsgIntoMixin(SendrecvmsgBase):
1759 # Mixin to implement doRecvmsg() using recvmsg_into().
1760
1761 def doRecvmsg(self, sock, bufsize, *args):
1762 buf = bytearray(bufsize)
1763 result = sock.recvmsg_into([buf], *args)
1764 self.registerRecvmsgResult(result)
1765 self.assertGreaterEqual(result[0], 0)
1766 self.assertLessEqual(result[0], bufsize)
1767 return (bytes(buf[:result[0]]),) + result[1:]
1768
1769
1770class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1771 # Defines flags to be checked in msg_flags for datagram sockets.
1772
1773 @property
1774 def msg_flags_non_eor_indicator(self):
1775 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1776
1777
1778class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1779 # Defines flags to be checked in msg_flags for SCTP sockets.
1780
1781 @property
1782 def msg_flags_eor_indicator(self):
1783 return super().msg_flags_eor_indicator | socket.MSG_EOR
1784
1785
1786class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1787 # Base class for tests on connectionless-mode sockets. Users must
1788 # supply sockets on attributes cli and serv to be mapped to
1789 # cli_sock and serv_sock respectively.
1790
1791 @property
1792 def serv_sock(self):
1793 return self.serv
1794
1795 @property
1796 def cli_sock(self):
1797 return self.cli
1798
1799 @property
1800 def sendmsg_to_server_defaults(self):
1801 return ([], [], 0, self.serv_addr)
1802
1803 def sendToServer(self, msg):
1804 return self.cli_sock.sendto(msg, self.serv_addr)
1805
1806
1807class SendrecvmsgConnectedBase(SendrecvmsgBase):
1808 # Base class for tests on connected sockets. Users must supply
1809 # sockets on attributes serv_conn and cli_conn (representing the
1810 # connections *to* the server and the client), to be mapped to
1811 # cli_sock and serv_sock respectively.
1812
1813 @property
1814 def serv_sock(self):
1815 return self.cli_conn
1816
1817 @property
1818 def cli_sock(self):
1819 return self.serv_conn
1820
1821 def checkRecvmsgAddress(self, addr1, addr2):
1822 # Address is currently "unspecified" for a connected socket,
1823 # so we don't examine it
1824 pass
1825
1826
1827class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1828 # Base class to set a timeout on server's socket.
1829
1830 def setUp(self):
1831 super().setUp()
1832 self.serv_sock.settimeout(self.fail_timeout)
1833
1834
1835class SendmsgTests(SendrecvmsgServerTimeoutBase):
1836 # Tests for sendmsg() which can use any socket type and do not
1837 # involve recvmsg() or recvmsg_into().
1838
1839 def testSendmsg(self):
1840 # Send a simple message with sendmsg().
1841 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1842
1843 def _testSendmsg(self):
1844 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1845
1846 def testSendmsgDataGenerator(self):
1847 # Send from buffer obtained from a generator (not a sequence).
1848 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1849
1850 def _testSendmsgDataGenerator(self):
1851 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1852 len(MSG))
1853
1854 def testSendmsgAncillaryGenerator(self):
1855 # Gather (empty) ancillary data from a generator.
1856 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1857
1858 def _testSendmsgAncillaryGenerator(self):
1859 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1860 len(MSG))
1861
1862 def testSendmsgArray(self):
1863 # Send data from an array instead of the usual bytes object.
1864 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1865
1866 def _testSendmsgArray(self):
1867 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1868 len(MSG))
1869
1870 def testSendmsgGather(self):
1871 # Send message data from more than one buffer (gather write).
1872 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1873
1874 def _testSendmsgGather(self):
1875 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1876
1877 def testSendmsgBadArgs(self):
1878 # Check that sendmsg() rejects invalid arguments.
1879 self.assertEqual(self.serv_sock.recv(1000), b"done")
1880
1881 def _testSendmsgBadArgs(self):
1882 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1883 self.assertRaises(TypeError, self.sendmsgToServer,
1884 b"not in an iterable")
1885 self.assertRaises(TypeError, self.sendmsgToServer,
1886 object())
1887 self.assertRaises(TypeError, self.sendmsgToServer,
1888 [object()])
1889 self.assertRaises(TypeError, self.sendmsgToServer,
1890 [MSG, object()])
1891 self.assertRaises(TypeError, self.sendmsgToServer,
1892 [MSG], object())
1893 self.assertRaises(TypeError, self.sendmsgToServer,
1894 [MSG], [], object())
1895 self.assertRaises(TypeError, self.sendmsgToServer,
1896 [MSG], [], 0, object())
1897 self.sendToServer(b"done")
1898
1899 def testSendmsgBadCmsg(self):
1900 # Check that invalid ancillary data items are rejected.
1901 self.assertEqual(self.serv_sock.recv(1000), b"done")
1902
1903 def _testSendmsgBadCmsg(self):
1904 self.assertRaises(TypeError, self.sendmsgToServer,
1905 [MSG], [object()])
1906 self.assertRaises(TypeError, self.sendmsgToServer,
1907 [MSG], [(object(), 0, b"data")])
1908 self.assertRaises(TypeError, self.sendmsgToServer,
1909 [MSG], [(0, object(), b"data")])
1910 self.assertRaises(TypeError, self.sendmsgToServer,
1911 [MSG], [(0, 0, object())])
1912 self.assertRaises(TypeError, self.sendmsgToServer,
1913 [MSG], [(0, 0)])
1914 self.assertRaises(TypeError, self.sendmsgToServer,
1915 [MSG], [(0, 0, b"data", 42)])
1916 self.sendToServer(b"done")
1917
1918 @requireAttrs(socket, "CMSG_SPACE")
1919 def testSendmsgBadMultiCmsg(self):
1920 # Check that invalid ancillary data items are rejected when
1921 # more than one item is present.
1922 self.assertEqual(self.serv_sock.recv(1000), b"done")
1923
1924 @testSendmsgBadMultiCmsg.client_skip
1925 def _testSendmsgBadMultiCmsg(self):
1926 self.assertRaises(TypeError, self.sendmsgToServer,
1927 [MSG], [0, 0, b""])
1928 self.assertRaises(TypeError, self.sendmsgToServer,
1929 [MSG], [(0, 0, b""), object()])
1930 self.sendToServer(b"done")
1931
1932 def testSendmsgExcessCmsgReject(self):
1933 # Check that sendmsg() rejects excess ancillary data items
1934 # when the number that can be sent is limited.
1935 self.assertEqual(self.serv_sock.recv(1000), b"done")
1936
1937 def _testSendmsgExcessCmsgReject(self):
1938 if not hasattr(socket, "CMSG_SPACE"):
1939 # Can only send one item
1940 with self.assertRaises(socket.error) as cm:
1941 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1942 self.assertIsNone(cm.exception.errno)
1943 self.sendToServer(b"done")
1944
1945 def testSendmsgAfterClose(self):
1946 # Check that sendmsg() fails on a closed socket.
1947 pass
1948
1949 def _testSendmsgAfterClose(self):
1950 self.cli_sock.close()
1951 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1952
1953
1954class SendmsgStreamTests(SendmsgTests):
1955 # Tests for sendmsg() which require a stream socket and do not
1956 # involve recvmsg() or recvmsg_into().
1957
1958 def testSendmsgExplicitNoneAddr(self):
1959 # Check that peer address can be specified as None.
1960 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1961
1962 def _testSendmsgExplicitNoneAddr(self):
1963 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1964
1965 def testSendmsgTimeout(self):
1966 # Check that timeout works with sendmsg().
1967 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1968 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1969
1970 def _testSendmsgTimeout(self):
1971 try:
1972 self.cli_sock.settimeout(0.03)
1973 with self.assertRaises(socket.timeout):
1974 while True:
1975 self.sendmsgToServer([b"a"*512])
1976 finally:
1977 self.misc_event.set()
1978
1979 # XXX: would be nice to have more tests for sendmsg flags argument.
1980
1981 # Linux supports MSG_DONTWAIT when sending, but in general, it
1982 # only works when receiving. Could add other platforms if they
1983 # support it too.
1984 @skipWithClientIf(sys.platform not in {"linux2"},
1985 "MSG_DONTWAIT not known to work on this platform when "
1986 "sending")
1987 def testSendmsgDontWait(self):
1988 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1989 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1990 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1991
1992 @testSendmsgDontWait.client_skip
1993 def _testSendmsgDontWait(self):
1994 try:
1995 with self.assertRaises(socket.error) as cm:
1996 while True:
1997 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1998 self.assertIn(cm.exception.errno,
1999 (errno.EAGAIN, errno.EWOULDBLOCK))
2000 finally:
2001 self.misc_event.set()
2002
2003
2004class SendmsgConnectionlessTests(SendmsgTests):
2005 # Tests for sendmsg() which require a connectionless-mode
2006 # (e.g. datagram) socket, and do not involve recvmsg() or
2007 # recvmsg_into().
2008
2009 def testSendmsgNoDestAddr(self):
2010 # Check that sendmsg() fails when no destination address is
2011 # given for unconnected socket.
2012 pass
2013
2014 def _testSendmsgNoDestAddr(self):
2015 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2016 [MSG])
2017 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2018 [MSG], [], 0, None)
2019
2020
2021class RecvmsgGenericTests(SendrecvmsgBase):
2022 # Tests for recvmsg() which can also be emulated using
2023 # recvmsg_into(), and can use any socket type.
2024
2025 def testRecvmsg(self):
2026 # Receive a simple message with recvmsg[_into]().
2027 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2028 self.assertEqual(msg, MSG)
2029 self.checkRecvmsgAddress(addr, self.cli_addr)
2030 self.assertEqual(ancdata, [])
2031 self.checkFlags(flags, eor=True)
2032
2033 def _testRecvmsg(self):
2034 self.sendToServer(MSG)
2035
2036 def testRecvmsgExplicitDefaults(self):
2037 # Test recvmsg[_into]() with default arguments provided explicitly.
2038 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2039 len(MSG), 0, 0)
2040 self.assertEqual(msg, MSG)
2041 self.checkRecvmsgAddress(addr, self.cli_addr)
2042 self.assertEqual(ancdata, [])
2043 self.checkFlags(flags, eor=True)
2044
2045 def _testRecvmsgExplicitDefaults(self):
2046 self.sendToServer(MSG)
2047
2048 def testRecvmsgShorter(self):
2049 # Receive a message smaller than buffer.
2050 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2051 len(MSG) + 42)
2052 self.assertEqual(msg, MSG)
2053 self.checkRecvmsgAddress(addr, self.cli_addr)
2054 self.assertEqual(ancdata, [])
2055 self.checkFlags(flags, eor=True)
2056
2057 def _testRecvmsgShorter(self):
2058 self.sendToServer(MSG)
2059
Charles-François Natali8619cd72011-10-03 19:43:15 +02002060 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2061 # datagram is received (issue #13001).
2062 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002063 def testRecvmsgTrunc(self):
2064 # Receive part of message, check for truncation indicators.
2065 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2066 len(MSG) - 3)
2067 self.assertEqual(msg, MSG[:-3])
2068 self.checkRecvmsgAddress(addr, self.cli_addr)
2069 self.assertEqual(ancdata, [])
2070 self.checkFlags(flags, eor=False)
2071
Charles-François Natali8619cd72011-10-03 19:43:15 +02002072 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002073 def _testRecvmsgTrunc(self):
2074 self.sendToServer(MSG)
2075
2076 def testRecvmsgShortAncillaryBuf(self):
2077 # Test ancillary data buffer too small to hold any ancillary data.
2078 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2079 len(MSG), 1)
2080 self.assertEqual(msg, MSG)
2081 self.checkRecvmsgAddress(addr, self.cli_addr)
2082 self.assertEqual(ancdata, [])
2083 self.checkFlags(flags, eor=True)
2084
2085 def _testRecvmsgShortAncillaryBuf(self):
2086 self.sendToServer(MSG)
2087
2088 def testRecvmsgLongAncillaryBuf(self):
2089 # Test large ancillary data buffer.
2090 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2091 len(MSG), 10240)
2092 self.assertEqual(msg, MSG)
2093 self.checkRecvmsgAddress(addr, self.cli_addr)
2094 self.assertEqual(ancdata, [])
2095 self.checkFlags(flags, eor=True)
2096
2097 def _testRecvmsgLongAncillaryBuf(self):
2098 self.sendToServer(MSG)
2099
2100 def testRecvmsgAfterClose(self):
2101 # Check that recvmsg[_into]() fails on a closed socket.
2102 self.serv_sock.close()
2103 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2104
2105 def _testRecvmsgAfterClose(self):
2106 pass
2107
2108 def testRecvmsgTimeout(self):
2109 # Check that timeout works.
2110 try:
2111 self.serv_sock.settimeout(0.03)
2112 self.assertRaises(socket.timeout,
2113 self.doRecvmsg, self.serv_sock, len(MSG))
2114 finally:
2115 self.misc_event.set()
2116
2117 def _testRecvmsgTimeout(self):
2118 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2119
2120 @requireAttrs(socket, "MSG_PEEK")
2121 def testRecvmsgPeek(self):
2122 # Check that MSG_PEEK in flags enables examination of pending
2123 # data without consuming it.
2124
2125 # Receive part of data with MSG_PEEK.
2126 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2127 len(MSG) - 3, 0,
2128 socket.MSG_PEEK)
2129 self.assertEqual(msg, MSG[:-3])
2130 self.checkRecvmsgAddress(addr, self.cli_addr)
2131 self.assertEqual(ancdata, [])
2132 # Ignoring MSG_TRUNC here (so this test is the same for stream
2133 # and datagram sockets). Some wording in POSIX seems to
2134 # suggest that it needn't be set when peeking, but that may
2135 # just be a slip.
2136 self.checkFlags(flags, eor=False,
2137 ignore=getattr(socket, "MSG_TRUNC", 0))
2138
2139 # Receive all data with MSG_PEEK.
2140 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2141 len(MSG), 0,
2142 socket.MSG_PEEK)
2143 self.assertEqual(msg, MSG)
2144 self.checkRecvmsgAddress(addr, self.cli_addr)
2145 self.assertEqual(ancdata, [])
2146 self.checkFlags(flags, eor=True)
2147
2148 # Check that the same data can still be received normally.
2149 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2150 self.assertEqual(msg, MSG)
2151 self.checkRecvmsgAddress(addr, self.cli_addr)
2152 self.assertEqual(ancdata, [])
2153 self.checkFlags(flags, eor=True)
2154
2155 @testRecvmsgPeek.client_skip
2156 def _testRecvmsgPeek(self):
2157 self.sendToServer(MSG)
2158
2159 @requireAttrs(socket.socket, "sendmsg")
2160 def testRecvmsgFromSendmsg(self):
2161 # Test receiving with recvmsg[_into]() when message is sent
2162 # using sendmsg().
2163 self.serv_sock.settimeout(self.fail_timeout)
2164 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2165 self.assertEqual(msg, MSG)
2166 self.checkRecvmsgAddress(addr, self.cli_addr)
2167 self.assertEqual(ancdata, [])
2168 self.checkFlags(flags, eor=True)
2169
2170 @testRecvmsgFromSendmsg.client_skip
2171 def _testRecvmsgFromSendmsg(self):
2172 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2173
2174
2175class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2176 # Tests which require a stream socket and can use either recvmsg()
2177 # or recvmsg_into().
2178
2179 def testRecvmsgEOF(self):
2180 # Receive end-of-stream indicator (b"", peer socket closed).
2181 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2182 self.assertEqual(msg, b"")
2183 self.checkRecvmsgAddress(addr, self.cli_addr)
2184 self.assertEqual(ancdata, [])
2185 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2186
2187 def _testRecvmsgEOF(self):
2188 self.cli_sock.close()
2189
2190 def testRecvmsgOverflow(self):
2191 # Receive a message in more than one chunk.
2192 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2193 len(MSG) - 3)
2194 self.checkRecvmsgAddress(addr, self.cli_addr)
2195 self.assertEqual(ancdata, [])
2196 self.checkFlags(flags, eor=False)
2197
2198 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2199 self.checkRecvmsgAddress(addr, self.cli_addr)
2200 self.assertEqual(ancdata, [])
2201 self.checkFlags(flags, eor=True)
2202
2203 msg = seg1 + seg2
2204 self.assertEqual(msg, MSG)
2205
2206 def _testRecvmsgOverflow(self):
2207 self.sendToServer(MSG)
2208
2209
2210class RecvmsgTests(RecvmsgGenericTests):
2211 # Tests for recvmsg() which can use any socket type.
2212
2213 def testRecvmsgBadArgs(self):
2214 # Check that recvmsg() rejects invalid arguments.
2215 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2216 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2217 -1, 0, 0)
2218 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2219 len(MSG), -1, 0)
2220 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2221 [bytearray(10)], 0, 0)
2222 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2223 object(), 0, 0)
2224 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2225 len(MSG), object(), 0)
2226 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2227 len(MSG), 0, object())
2228
2229 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2230 self.assertEqual(msg, MSG)
2231 self.checkRecvmsgAddress(addr, self.cli_addr)
2232 self.assertEqual(ancdata, [])
2233 self.checkFlags(flags, eor=True)
2234
2235 def _testRecvmsgBadArgs(self):
2236 self.sendToServer(MSG)
2237
2238
2239class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2240 # Tests for recvmsg_into() which can use any socket type.
2241
2242 def testRecvmsgIntoBadArgs(self):
2243 # Check that recvmsg_into() rejects invalid arguments.
2244 buf = bytearray(len(MSG))
2245 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2246 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2247 len(MSG), 0, 0)
2248 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2249 buf, 0, 0)
2250 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2251 [object()], 0, 0)
2252 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2253 [b"I'm not writable"], 0, 0)
2254 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2255 [buf, object()], 0, 0)
2256 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2257 [buf], -1, 0)
2258 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2259 [buf], object(), 0)
2260 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2261 [buf], 0, object())
2262
2263 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2264 self.assertEqual(nbytes, len(MSG))
2265 self.assertEqual(buf, bytearray(MSG))
2266 self.checkRecvmsgAddress(addr, self.cli_addr)
2267 self.assertEqual(ancdata, [])
2268 self.checkFlags(flags, eor=True)
2269
2270 def _testRecvmsgIntoBadArgs(self):
2271 self.sendToServer(MSG)
2272
2273 def testRecvmsgIntoGenerator(self):
2274 # Receive into buffer obtained from a generator (not a sequence).
2275 buf = bytearray(len(MSG))
2276 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2277 (o for o in [buf]))
2278 self.assertEqual(nbytes, len(MSG))
2279 self.assertEqual(buf, bytearray(MSG))
2280 self.checkRecvmsgAddress(addr, self.cli_addr)
2281 self.assertEqual(ancdata, [])
2282 self.checkFlags(flags, eor=True)
2283
2284 def _testRecvmsgIntoGenerator(self):
2285 self.sendToServer(MSG)
2286
2287 def testRecvmsgIntoArray(self):
2288 # Receive into an array rather than the usual bytearray.
2289 buf = array.array("B", [0] * len(MSG))
2290 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2291 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002292 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002293 self.checkRecvmsgAddress(addr, self.cli_addr)
2294 self.assertEqual(ancdata, [])
2295 self.checkFlags(flags, eor=True)
2296
2297 def _testRecvmsgIntoArray(self):
2298 self.sendToServer(MSG)
2299
2300 def testRecvmsgIntoScatter(self):
2301 # Receive into multiple buffers (scatter write).
2302 b1 = bytearray(b"----")
2303 b2 = bytearray(b"0123456789")
2304 b3 = bytearray(b"--------------")
2305 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2306 [b1, memoryview(b2)[2:9], b3])
2307 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2308 self.assertEqual(b1, bytearray(b"Mary"))
2309 self.assertEqual(b2, bytearray(b"01 had a 9"))
2310 self.assertEqual(b3, bytearray(b"little lamb---"))
2311 self.checkRecvmsgAddress(addr, self.cli_addr)
2312 self.assertEqual(ancdata, [])
2313 self.checkFlags(flags, eor=True)
2314
2315 def _testRecvmsgIntoScatter(self):
2316 self.sendToServer(b"Mary had a little lamb")
2317
2318
2319class CmsgMacroTests(unittest.TestCase):
2320 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2321 # assumptions used by sendmsg() and recvmsg[_into](), which share
2322 # code with these functions.
2323
2324 # Match the definition in socketmodule.c
2325 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2326
2327 @requireAttrs(socket, "CMSG_LEN")
2328 def testCMSG_LEN(self):
2329 # Test CMSG_LEN() with various valid and invalid values,
2330 # checking the assumptions used by recvmsg() and sendmsg().
2331 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2332 values = list(range(257)) + list(range(toobig - 257, toobig))
2333
2334 # struct cmsghdr has at least three members, two of which are ints
2335 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2336 for n in values:
2337 ret = socket.CMSG_LEN(n)
2338 # This is how recvmsg() calculates the data size
2339 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2340 self.assertLessEqual(ret, self.socklen_t_limit)
2341
2342 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2343 # sendmsg() shares code with these functions, and requires
2344 # that it reject values over the limit.
2345 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2346 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2347
2348 @requireAttrs(socket, "CMSG_SPACE")
2349 def testCMSG_SPACE(self):
2350 # Test CMSG_SPACE() with various valid and invalid values,
2351 # checking the assumptions used by sendmsg().
2352 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2353 values = list(range(257)) + list(range(toobig - 257, toobig))
2354
2355 last = socket.CMSG_SPACE(0)
2356 # struct cmsghdr has at least three members, two of which are ints
2357 self.assertGreater(last, array.array("i").itemsize * 2)
2358 for n in values:
2359 ret = socket.CMSG_SPACE(n)
2360 self.assertGreaterEqual(ret, last)
2361 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2362 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2363 self.assertLessEqual(ret, self.socklen_t_limit)
2364 last = ret
2365
2366 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2367 # sendmsg() shares code with these functions, and requires
2368 # that it reject values over the limit.
2369 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2370 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2371
2372
2373class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2374 # Tests for file descriptor passing on Unix-domain sockets.
2375
2376 # Invalid file descriptor value that's unlikely to evaluate to a
2377 # real FD even if one of its bytes is replaced with a different
2378 # value (which shouldn't actually happen).
2379 badfd = -0x5555
2380
2381 def newFDs(self, n):
2382 # Return a list of n file descriptors for newly-created files
2383 # containing their list indices as ASCII numbers.
2384 fds = []
2385 for i in range(n):
2386 fd, path = tempfile.mkstemp()
2387 self.addCleanup(os.unlink, path)
2388 self.addCleanup(os.close, fd)
2389 os.write(fd, str(i).encode())
2390 fds.append(fd)
2391 return fds
2392
2393 def checkFDs(self, fds):
2394 # Check that the file descriptors in the given list contain
2395 # their correct list indices as ASCII numbers.
2396 for n, fd in enumerate(fds):
2397 os.lseek(fd, 0, os.SEEK_SET)
2398 self.assertEqual(os.read(fd, 1024), str(n).encode())
2399
2400 def registerRecvmsgResult(self, result):
2401 self.addCleanup(self.closeRecvmsgFDs, result)
2402
2403 def closeRecvmsgFDs(self, recvmsg_result):
2404 # Close all file descriptors specified in the ancillary data
2405 # of the given return value from recvmsg() or recvmsg_into().
2406 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2407 if (cmsg_level == socket.SOL_SOCKET and
2408 cmsg_type == socket.SCM_RIGHTS):
2409 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002410 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002411 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2412 for fd in fds:
2413 os.close(fd)
2414
2415 def createAndSendFDs(self, n):
2416 # Send n new file descriptors created by newFDs() to the
2417 # server, with the constant MSG as the non-ancillary data.
2418 self.assertEqual(
2419 self.sendmsgToServer([MSG],
2420 [(socket.SOL_SOCKET,
2421 socket.SCM_RIGHTS,
2422 array.array("i", self.newFDs(n)))]),
2423 len(MSG))
2424
2425 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2426 # Check that constant MSG was received with numfds file
2427 # descriptors in a maximum of maxcmsgs control messages (which
2428 # must contain only complete integers). By default, check
2429 # that MSG_CTRUNC is unset, but ignore any flags in
2430 # ignoreflags.
2431 msg, ancdata, flags, addr = result
2432 self.assertEqual(msg, MSG)
2433 self.checkRecvmsgAddress(addr, self.cli_addr)
2434 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2435 ignore=ignoreflags)
2436
2437 self.assertIsInstance(ancdata, list)
2438 self.assertLessEqual(len(ancdata), maxcmsgs)
2439 fds = array.array("i")
2440 for item in ancdata:
2441 self.assertIsInstance(item, tuple)
2442 cmsg_level, cmsg_type, cmsg_data = item
2443 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2444 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2445 self.assertIsInstance(cmsg_data, bytes)
2446 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002447 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002448
2449 self.assertEqual(len(fds), numfds)
2450 self.checkFDs(fds)
2451
2452 def testFDPassSimple(self):
2453 # Pass a single FD (array read from bytes object).
2454 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2455 len(MSG), 10240))
2456
2457 def _testFDPassSimple(self):
2458 self.assertEqual(
2459 self.sendmsgToServer(
2460 [MSG],
2461 [(socket.SOL_SOCKET,
2462 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002463 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002464 len(MSG))
2465
2466 def testMultipleFDPass(self):
2467 # Pass multiple FDs in a single array.
2468 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2469 len(MSG), 10240))
2470
2471 def _testMultipleFDPass(self):
2472 self.createAndSendFDs(4)
2473
2474 @requireAttrs(socket, "CMSG_SPACE")
2475 def testFDPassCMSG_SPACE(self):
2476 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2477 self.checkRecvmsgFDs(
2478 4, self.doRecvmsg(self.serv_sock, len(MSG),
2479 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2480
2481 @testFDPassCMSG_SPACE.client_skip
2482 def _testFDPassCMSG_SPACE(self):
2483 self.createAndSendFDs(4)
2484
2485 def testFDPassCMSG_LEN(self):
2486 # Test using CMSG_LEN() to calculate ancillary buffer size.
2487 self.checkRecvmsgFDs(1,
2488 self.doRecvmsg(self.serv_sock, len(MSG),
2489 socket.CMSG_LEN(4 * SIZEOF_INT)),
2490 # RFC 3542 says implementations may set
2491 # MSG_CTRUNC if there isn't enough space
2492 # for trailing padding.
2493 ignoreflags=socket.MSG_CTRUNC)
2494
2495 def _testFDPassCMSG_LEN(self):
2496 self.createAndSendFDs(1)
2497
Nick Coghlan2496f332011-09-19 20:26:31 +10002498 # Issue #12958: The following test has problems on Mac OS X
2499 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002500 @requireAttrs(socket, "CMSG_SPACE")
2501 def testFDPassSeparate(self):
2502 # Pass two FDs in two separate arrays. Arrays may be combined
2503 # into a single control message by the OS.
2504 self.checkRecvmsgFDs(2,
2505 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2506 maxcmsgs=2)
2507
2508 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002509 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002510 def _testFDPassSeparate(self):
2511 fd0, fd1 = self.newFDs(2)
2512 self.assertEqual(
2513 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2514 socket.SCM_RIGHTS,
2515 array.array("i", [fd0])),
2516 (socket.SOL_SOCKET,
2517 socket.SCM_RIGHTS,
2518 array.array("i", [fd1]))]),
2519 len(MSG))
2520
Nick Coghlan2496f332011-09-19 20:26:31 +10002521 # Issue #12958: The following test has problems on Mac OS X
2522 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002523 @requireAttrs(socket, "CMSG_SPACE")
2524 def testFDPassSeparateMinSpace(self):
2525 # Pass two FDs in two separate arrays, receiving them into the
2526 # minimum space for two arrays.
2527 self.checkRecvmsgFDs(2,
2528 self.doRecvmsg(self.serv_sock, len(MSG),
2529 socket.CMSG_SPACE(SIZEOF_INT) +
2530 socket.CMSG_LEN(SIZEOF_INT)),
2531 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2532
2533 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002534 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002535 def _testFDPassSeparateMinSpace(self):
2536 fd0, fd1 = self.newFDs(2)
2537 self.assertEqual(
2538 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2539 socket.SCM_RIGHTS,
2540 array.array("i", [fd0])),
2541 (socket.SOL_SOCKET,
2542 socket.SCM_RIGHTS,
2543 array.array("i", [fd1]))]),
2544 len(MSG))
2545
2546 def sendAncillaryIfPossible(self, msg, ancdata):
2547 # Try to send msg and ancdata to server, but if the system
2548 # call fails, just send msg with no ancillary data.
2549 try:
2550 nbytes = self.sendmsgToServer([msg], ancdata)
2551 except socket.error as e:
2552 # Check that it was the system call that failed
2553 self.assertIsInstance(e.errno, int)
2554 nbytes = self.sendmsgToServer([msg])
2555 self.assertEqual(nbytes, len(msg))
2556
2557 def testFDPassEmpty(self):
2558 # Try to pass an empty FD array. Can receive either no array
2559 # or an empty array.
2560 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2561 len(MSG), 10240),
2562 ignoreflags=socket.MSG_CTRUNC)
2563
2564 def _testFDPassEmpty(self):
2565 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2566 socket.SCM_RIGHTS,
2567 b"")])
2568
2569 def testFDPassPartialInt(self):
2570 # Try to pass a truncated FD array.
2571 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2572 len(MSG), 10240)
2573 self.assertEqual(msg, MSG)
2574 self.checkRecvmsgAddress(addr, self.cli_addr)
2575 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2576 self.assertLessEqual(len(ancdata), 1)
2577 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2578 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2579 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2580 self.assertLess(len(cmsg_data), SIZEOF_INT)
2581
2582 def _testFDPassPartialInt(self):
2583 self.sendAncillaryIfPossible(
2584 MSG,
2585 [(socket.SOL_SOCKET,
2586 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002587 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002588
2589 @requireAttrs(socket, "CMSG_SPACE")
2590 def testFDPassPartialIntInMiddle(self):
2591 # Try to pass two FD arrays, the first of which is truncated.
2592 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2593 len(MSG), 10240)
2594 self.assertEqual(msg, MSG)
2595 self.checkRecvmsgAddress(addr, self.cli_addr)
2596 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2597 self.assertLessEqual(len(ancdata), 2)
2598 fds = array.array("i")
2599 # Arrays may have been combined in a single control message
2600 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2601 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2602 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002603 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002604 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2605 self.assertLessEqual(len(fds), 2)
2606 self.checkFDs(fds)
2607
2608 @testFDPassPartialIntInMiddle.client_skip
2609 def _testFDPassPartialIntInMiddle(self):
2610 fd0, fd1 = self.newFDs(2)
2611 self.sendAncillaryIfPossible(
2612 MSG,
2613 [(socket.SOL_SOCKET,
2614 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002615 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002616 (socket.SOL_SOCKET,
2617 socket.SCM_RIGHTS,
2618 array.array("i", [fd1]))])
2619
2620 def checkTruncatedHeader(self, result, ignoreflags=0):
2621 # Check that no ancillary data items are returned when data is
2622 # truncated inside the cmsghdr structure.
2623 msg, ancdata, flags, addr = result
2624 self.assertEqual(msg, MSG)
2625 self.checkRecvmsgAddress(addr, self.cli_addr)
2626 self.assertEqual(ancdata, [])
2627 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2628 ignore=ignoreflags)
2629
2630 def testCmsgTruncNoBufSize(self):
2631 # Check that no ancillary data is received when no buffer size
2632 # is specified.
2633 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2634 # BSD seems to set MSG_CTRUNC only
2635 # if an item has been partially
2636 # received.
2637 ignoreflags=socket.MSG_CTRUNC)
2638
2639 def _testCmsgTruncNoBufSize(self):
2640 self.createAndSendFDs(1)
2641
2642 def testCmsgTrunc0(self):
2643 # Check that no ancillary data is received when buffer size is 0.
2644 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2645 ignoreflags=socket.MSG_CTRUNC)
2646
2647 def _testCmsgTrunc0(self):
2648 self.createAndSendFDs(1)
2649
2650 # Check that no ancillary data is returned for various non-zero
2651 # (but still too small) buffer sizes.
2652
2653 def testCmsgTrunc1(self):
2654 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2655
2656 def _testCmsgTrunc1(self):
2657 self.createAndSendFDs(1)
2658
2659 def testCmsgTrunc2Int(self):
2660 # The cmsghdr structure has at least three members, two of
2661 # which are ints, so we still shouldn't see any ancillary
2662 # data.
2663 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2664 SIZEOF_INT * 2))
2665
2666 def _testCmsgTrunc2Int(self):
2667 self.createAndSendFDs(1)
2668
2669 def testCmsgTruncLen0Minus1(self):
2670 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2671 socket.CMSG_LEN(0) - 1))
2672
2673 def _testCmsgTruncLen0Minus1(self):
2674 self.createAndSendFDs(1)
2675
2676 # The following tests try to truncate the control message in the
2677 # middle of the FD array.
2678
2679 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2680 # Check that file descriptor data is truncated to between
2681 # mindata and maxdata bytes when received with buffer size
2682 # ancbuf, and that any complete file descriptor numbers are
2683 # valid.
2684 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2685 len(MSG), ancbuf)
2686 self.assertEqual(msg, MSG)
2687 self.checkRecvmsgAddress(addr, self.cli_addr)
2688 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2689
2690 if mindata == 0 and ancdata == []:
2691 return
2692 self.assertEqual(len(ancdata), 1)
2693 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2694 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2695 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2696 self.assertGreaterEqual(len(cmsg_data), mindata)
2697 self.assertLessEqual(len(cmsg_data), maxdata)
2698 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002699 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002700 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2701 self.checkFDs(fds)
2702
2703 def testCmsgTruncLen0(self):
2704 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2705
2706 def _testCmsgTruncLen0(self):
2707 self.createAndSendFDs(1)
2708
2709 def testCmsgTruncLen0Plus1(self):
2710 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2711
2712 def _testCmsgTruncLen0Plus1(self):
2713 self.createAndSendFDs(2)
2714
2715 def testCmsgTruncLen1(self):
2716 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2717 maxdata=SIZEOF_INT)
2718
2719 def _testCmsgTruncLen1(self):
2720 self.createAndSendFDs(2)
2721
2722 def testCmsgTruncLen2Minus1(self):
2723 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2724 maxdata=(2 * SIZEOF_INT) - 1)
2725
2726 def _testCmsgTruncLen2Minus1(self):
2727 self.createAndSendFDs(2)
2728
2729
2730class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2731 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2732 # features of the RFC 3542 Advanced Sockets API for IPv6.
2733 # Currently we can only handle certain data items (e.g. traffic
2734 # class, hop limit, MTU discovery and fragmentation settings)
2735 # without resorting to unportable means such as the struct module,
2736 # but the tests here are aimed at testing the ancillary data
2737 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2738 # itself.
2739
2740 # Test value to use when setting hop limit of packet
2741 hop_limit = 2
2742
2743 # Test value to use when setting traffic class of packet.
2744 # -1 means "use kernel default".
2745 traffic_class = -1
2746
2747 def ancillaryMapping(self, ancdata):
2748 # Given ancillary data list ancdata, return a mapping from
2749 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2750 # Check that no (level, type) pair appears more than once.
2751 d = {}
2752 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2753 self.assertNotIn((cmsg_level, cmsg_type), d)
2754 d[(cmsg_level, cmsg_type)] = cmsg_data
2755 return d
2756
2757 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2758 # Receive hop limit into ancbufsize bytes of ancillary data
2759 # space. Check that data is MSG, ancillary data is not
2760 # truncated (but ignore any flags in ignoreflags), and hop
2761 # limit is between 0 and maxhop inclusive.
2762 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2763 socket.IPV6_RECVHOPLIMIT, 1)
2764 self.misc_event.set()
2765 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2766 len(MSG), ancbufsize)
2767
2768 self.assertEqual(msg, MSG)
2769 self.checkRecvmsgAddress(addr, self.cli_addr)
2770 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2771 ignore=ignoreflags)
2772
2773 self.assertEqual(len(ancdata), 1)
2774 self.assertIsInstance(ancdata[0], tuple)
2775 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2776 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2777 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2778 self.assertIsInstance(cmsg_data, bytes)
2779 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2780 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002781 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002782 self.assertGreaterEqual(a[0], 0)
2783 self.assertLessEqual(a[0], maxhop)
2784
2785 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2786 def testRecvHopLimit(self):
2787 # Test receiving the packet hop limit as ancillary data.
2788 self.checkHopLimit(ancbufsize=10240)
2789
2790 @testRecvHopLimit.client_skip
2791 def _testRecvHopLimit(self):
2792 # Need to wait until server has asked to receive ancillary
2793 # data, as implementations are not required to buffer it
2794 # otherwise.
2795 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2796 self.sendToServer(MSG)
2797
2798 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2799 def testRecvHopLimitCMSG_SPACE(self):
2800 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2801 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2802
2803 @testRecvHopLimitCMSG_SPACE.client_skip
2804 def _testRecvHopLimitCMSG_SPACE(self):
2805 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2806 self.sendToServer(MSG)
2807
2808 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2809 # 3542 says portable applications must provide space for trailing
2810 # padding. Implementations may set MSG_CTRUNC if there isn't
2811 # enough space for the padding.
2812
2813 @requireAttrs(socket.socket, "sendmsg")
2814 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2815 def testSetHopLimit(self):
2816 # Test setting hop limit on outgoing packet and receiving it
2817 # at the other end.
2818 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2819
2820 @testSetHopLimit.client_skip
2821 def _testSetHopLimit(self):
2822 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2823 self.assertEqual(
2824 self.sendmsgToServer([MSG],
2825 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2826 array.array("i", [self.hop_limit]))]),
2827 len(MSG))
2828
2829 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2830 ignoreflags=0):
2831 # Receive traffic class and hop limit into ancbufsize bytes of
2832 # ancillary data space. Check that data is MSG, ancillary
2833 # data is not truncated (but ignore any flags in ignoreflags),
2834 # and traffic class and hop limit are in range (hop limit no
2835 # more than maxhop).
2836 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2837 socket.IPV6_RECVHOPLIMIT, 1)
2838 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2839 socket.IPV6_RECVTCLASS, 1)
2840 self.misc_event.set()
2841 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2842 len(MSG), ancbufsize)
2843
2844 self.assertEqual(msg, MSG)
2845 self.checkRecvmsgAddress(addr, self.cli_addr)
2846 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2847 ignore=ignoreflags)
2848 self.assertEqual(len(ancdata), 2)
2849 ancmap = self.ancillaryMapping(ancdata)
2850
2851 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2852 self.assertEqual(len(tcdata), SIZEOF_INT)
2853 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002854 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002855 self.assertGreaterEqual(a[0], 0)
2856 self.assertLessEqual(a[0], 255)
2857
2858 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2859 self.assertEqual(len(hldata), SIZEOF_INT)
2860 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002861 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002862 self.assertGreaterEqual(a[0], 0)
2863 self.assertLessEqual(a[0], maxhop)
2864
2865 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2866 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2867 def testRecvTrafficClassAndHopLimit(self):
2868 # Test receiving traffic class and hop limit as ancillary data.
2869 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2870
2871 @testRecvTrafficClassAndHopLimit.client_skip
2872 def _testRecvTrafficClassAndHopLimit(self):
2873 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2874 self.sendToServer(MSG)
2875
2876 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2877 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2878 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2879 # Test receiving traffic class and hop limit, using
2880 # CMSG_SPACE() to calculate buffer size.
2881 self.checkTrafficClassAndHopLimit(
2882 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2883
2884 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2885 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2886 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2887 self.sendToServer(MSG)
2888
2889 @requireAttrs(socket.socket, "sendmsg")
2890 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2891 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2892 def testSetTrafficClassAndHopLimit(self):
2893 # Test setting traffic class and hop limit on outgoing packet,
2894 # and receiving them at the other end.
2895 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2896 maxhop=self.hop_limit)
2897
2898 @testSetTrafficClassAndHopLimit.client_skip
2899 def _testSetTrafficClassAndHopLimit(self):
2900 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2901 self.assertEqual(
2902 self.sendmsgToServer([MSG],
2903 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2904 array.array("i", [self.traffic_class])),
2905 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2906 array.array("i", [self.hop_limit]))]),
2907 len(MSG))
2908
2909 @requireAttrs(socket.socket, "sendmsg")
2910 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2911 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2912 def testOddCmsgSize(self):
2913 # Try to send ancillary data with first item one byte too
2914 # long. Fall back to sending with correct size if this fails,
2915 # and check that second item was handled correctly.
2916 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2917 maxhop=self.hop_limit)
2918
2919 @testOddCmsgSize.client_skip
2920 def _testOddCmsgSize(self):
2921 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2922 try:
2923 nbytes = self.sendmsgToServer(
2924 [MSG],
2925 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002926 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002927 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2928 array.array("i", [self.hop_limit]))])
2929 except socket.error as e:
2930 self.assertIsInstance(e.errno, int)
2931 nbytes = self.sendmsgToServer(
2932 [MSG],
2933 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2934 array.array("i", [self.traffic_class])),
2935 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2936 array.array("i", [self.hop_limit]))])
2937 self.assertEqual(nbytes, len(MSG))
2938
2939 # Tests for proper handling of truncated ancillary data
2940
2941 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2942 # Receive hop limit into ancbufsize bytes of ancillary data
2943 # space, which should be too small to contain the ancillary
2944 # data header (if ancbufsize is None, pass no second argument
2945 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2946 # (unless included in ignoreflags), and no ancillary data is
2947 # returned.
2948 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2949 socket.IPV6_RECVHOPLIMIT, 1)
2950 self.misc_event.set()
2951 args = () if ancbufsize is None else (ancbufsize,)
2952 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2953 len(MSG), *args)
2954
2955 self.assertEqual(msg, MSG)
2956 self.checkRecvmsgAddress(addr, self.cli_addr)
2957 self.assertEqual(ancdata, [])
2958 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2959 ignore=ignoreflags)
2960
2961 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2962 def testCmsgTruncNoBufSize(self):
2963 # Check that no ancillary data is received when no ancillary
2964 # buffer size is provided.
2965 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2966 # BSD seems to set
2967 # MSG_CTRUNC only if an item
2968 # has been partially
2969 # received.
2970 ignoreflags=socket.MSG_CTRUNC)
2971
2972 @testCmsgTruncNoBufSize.client_skip
2973 def _testCmsgTruncNoBufSize(self):
2974 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2975 self.sendToServer(MSG)
2976
2977 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2978 def testSingleCmsgTrunc0(self):
2979 # Check that no ancillary data is received when ancillary
2980 # buffer size is zero.
2981 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2982 ignoreflags=socket.MSG_CTRUNC)
2983
2984 @testSingleCmsgTrunc0.client_skip
2985 def _testSingleCmsgTrunc0(self):
2986 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2987 self.sendToServer(MSG)
2988
2989 # Check that no ancillary data is returned for various non-zero
2990 # (but still too small) buffer sizes.
2991
2992 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2993 def testSingleCmsgTrunc1(self):
2994 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2995
2996 @testSingleCmsgTrunc1.client_skip
2997 def _testSingleCmsgTrunc1(self):
2998 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2999 self.sendToServer(MSG)
3000
3001 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3002 def testSingleCmsgTrunc2Int(self):
3003 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3004
3005 @testSingleCmsgTrunc2Int.client_skip
3006 def _testSingleCmsgTrunc2Int(self):
3007 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3008 self.sendToServer(MSG)
3009
3010 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3011 def testSingleCmsgTruncLen0Minus1(self):
3012 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3013
3014 @testSingleCmsgTruncLen0Minus1.client_skip
3015 def _testSingleCmsgTruncLen0Minus1(self):
3016 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3017 self.sendToServer(MSG)
3018
3019 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3020 def testSingleCmsgTruncInData(self):
3021 # Test truncation of a control message inside its associated
3022 # data. The message may be returned with its data truncated,
3023 # or not returned at all.
3024 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3025 socket.IPV6_RECVHOPLIMIT, 1)
3026 self.misc_event.set()
3027 msg, ancdata, flags, addr = self.doRecvmsg(
3028 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3029
3030 self.assertEqual(msg, MSG)
3031 self.checkRecvmsgAddress(addr, self.cli_addr)
3032 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3033
3034 self.assertLessEqual(len(ancdata), 1)
3035 if ancdata:
3036 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3037 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3038 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3039 self.assertLess(len(cmsg_data), SIZEOF_INT)
3040
3041 @testSingleCmsgTruncInData.client_skip
3042 def _testSingleCmsgTruncInData(self):
3043 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3044 self.sendToServer(MSG)
3045
3046 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3047 # Receive traffic class and hop limit into ancbufsize bytes of
3048 # ancillary data space, which should be large enough to
3049 # contain the first item, but too small to contain the header
3050 # of the second. Check that data is MSG, MSG_CTRUNC is set
3051 # (unless included in ignoreflags), and only one ancillary
3052 # data item is returned.
3053 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3054 socket.IPV6_RECVHOPLIMIT, 1)
3055 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3056 socket.IPV6_RECVTCLASS, 1)
3057 self.misc_event.set()
3058 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3059 len(MSG), ancbufsize)
3060
3061 self.assertEqual(msg, MSG)
3062 self.checkRecvmsgAddress(addr, self.cli_addr)
3063 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3064 ignore=ignoreflags)
3065
3066 self.assertEqual(len(ancdata), 1)
3067 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3068 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3069 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3070 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3071 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003072 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003073 self.assertGreaterEqual(a[0], 0)
3074 self.assertLessEqual(a[0], 255)
3075
3076 # Try the above test with various buffer sizes.
3077
3078 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3079 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3080 def testSecondCmsgTrunc0(self):
3081 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3082 ignoreflags=socket.MSG_CTRUNC)
3083
3084 @testSecondCmsgTrunc0.client_skip
3085 def _testSecondCmsgTrunc0(self):
3086 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3087 self.sendToServer(MSG)
3088
3089 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3090 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3091 def testSecondCmsgTrunc1(self):
3092 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3093
3094 @testSecondCmsgTrunc1.client_skip
3095 def _testSecondCmsgTrunc1(self):
3096 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3097 self.sendToServer(MSG)
3098
3099 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3100 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3101 def testSecondCmsgTrunc2Int(self):
3102 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3103 2 * SIZEOF_INT)
3104
3105 @testSecondCmsgTrunc2Int.client_skip
3106 def _testSecondCmsgTrunc2Int(self):
3107 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3108 self.sendToServer(MSG)
3109
3110 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3111 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3112 def testSecondCmsgTruncLen0Minus1(self):
3113 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3114 socket.CMSG_LEN(0) - 1)
3115
3116 @testSecondCmsgTruncLen0Minus1.client_skip
3117 def _testSecondCmsgTruncLen0Minus1(self):
3118 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3119 self.sendToServer(MSG)
3120
3121 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3122 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3123 def testSecomdCmsgTruncInData(self):
3124 # Test truncation of the second of two control messages inside
3125 # its associated data.
3126 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3127 socket.IPV6_RECVHOPLIMIT, 1)
3128 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3129 socket.IPV6_RECVTCLASS, 1)
3130 self.misc_event.set()
3131 msg, ancdata, flags, addr = self.doRecvmsg(
3132 self.serv_sock, len(MSG),
3133 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3134
3135 self.assertEqual(msg, MSG)
3136 self.checkRecvmsgAddress(addr, self.cli_addr)
3137 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3138
3139 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3140
3141 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3142 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3143 cmsg_types.remove(cmsg_type)
3144 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3145 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003146 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003147 self.assertGreaterEqual(a[0], 0)
3148 self.assertLessEqual(a[0], 255)
3149
3150 if ancdata:
3151 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3152 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3153 cmsg_types.remove(cmsg_type)
3154 self.assertLess(len(cmsg_data), SIZEOF_INT)
3155
3156 self.assertEqual(ancdata, [])
3157
3158 @testSecomdCmsgTruncInData.client_skip
3159 def _testSecomdCmsgTruncInData(self):
3160 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3161 self.sendToServer(MSG)
3162
3163
3164# Derive concrete test classes for different socket types.
3165
3166class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3167 SendrecvmsgConnectionlessBase,
3168 ThreadedSocketTestMixin, UDPTestBase):
3169 pass
3170
3171@requireAttrs(socket.socket, "sendmsg")
3172@unittest.skipUnless(thread, 'Threading required for this test.')
3173class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3174 pass
3175
3176@requireAttrs(socket.socket, "recvmsg")
3177@unittest.skipUnless(thread, 'Threading required for this test.')
3178class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3179 pass
3180
3181@requireAttrs(socket.socket, "recvmsg_into")
3182@unittest.skipUnless(thread, 'Threading required for this test.')
3183class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3184 pass
3185
3186
3187class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3188 SendrecvmsgConnectionlessBase,
3189 ThreadedSocketTestMixin, UDP6TestBase):
3190 pass
3191
3192@requireAttrs(socket.socket, "sendmsg")
3193@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3194@requireSocket("AF_INET6", "SOCK_DGRAM")
3195@unittest.skipUnless(thread, 'Threading required for this test.')
3196class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3197 pass
3198
3199@requireAttrs(socket.socket, "recvmsg")
3200@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3201@requireSocket("AF_INET6", "SOCK_DGRAM")
3202@unittest.skipUnless(thread, 'Threading required for this test.')
3203class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3204 pass
3205
3206@requireAttrs(socket.socket, "recvmsg_into")
3207@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3208@requireSocket("AF_INET6", "SOCK_DGRAM")
3209@unittest.skipUnless(thread, 'Threading required for this test.')
3210class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3211 pass
3212
3213@requireAttrs(socket.socket, "recvmsg")
3214@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3215@requireAttrs(socket, "IPPROTO_IPV6")
3216@requireSocket("AF_INET6", "SOCK_DGRAM")
3217@unittest.skipUnless(thread, 'Threading required for this test.')
3218class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3219 SendrecvmsgUDP6TestBase):
3220 pass
3221
3222@requireAttrs(socket.socket, "recvmsg_into")
3223@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3224@requireAttrs(socket, "IPPROTO_IPV6")
3225@requireSocket("AF_INET6", "SOCK_DGRAM")
3226@unittest.skipUnless(thread, 'Threading required for this test.')
3227class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3228 RFC3542AncillaryTest,
3229 SendrecvmsgUDP6TestBase):
3230 pass
3231
3232
3233class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3234 ConnectedStreamTestMixin, TCPTestBase):
3235 pass
3236
3237@requireAttrs(socket.socket, "sendmsg")
3238@unittest.skipUnless(thread, 'Threading required for this test.')
3239class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3240 pass
3241
3242@requireAttrs(socket.socket, "recvmsg")
3243@unittest.skipUnless(thread, 'Threading required for this test.')
3244class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3245 SendrecvmsgTCPTestBase):
3246 pass
3247
3248@requireAttrs(socket.socket, "recvmsg_into")
3249@unittest.skipUnless(thread, 'Threading required for this test.')
3250class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3251 SendrecvmsgTCPTestBase):
3252 pass
3253
3254
3255class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3256 SendrecvmsgConnectedBase,
3257 ConnectedStreamTestMixin, SCTPStreamBase):
3258 pass
3259
3260@requireAttrs(socket.socket, "sendmsg")
3261@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3262@unittest.skipUnless(thread, 'Threading required for this test.')
3263class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3264 pass
3265
3266@requireAttrs(socket.socket, "recvmsg")
3267@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3268@unittest.skipUnless(thread, 'Threading required for this test.')
3269class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3270 SendrecvmsgSCTPStreamTestBase):
3271 pass
3272
3273@requireAttrs(socket.socket, "recvmsg_into")
3274@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3275@unittest.skipUnless(thread, 'Threading required for this test.')
3276class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3277 SendrecvmsgSCTPStreamTestBase):
3278 pass
3279
3280
3281class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3282 ConnectedStreamTestMixin, UnixStreamBase):
3283 pass
3284
3285@requireAttrs(socket.socket, "sendmsg")
3286@requireAttrs(socket, "AF_UNIX")
3287@unittest.skipUnless(thread, 'Threading required for this test.')
3288class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3289 pass
3290
3291@requireAttrs(socket.socket, "recvmsg")
3292@requireAttrs(socket, "AF_UNIX")
3293@unittest.skipUnless(thread, 'Threading required for this test.')
3294class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3295 SendrecvmsgUnixStreamTestBase):
3296 pass
3297
3298@requireAttrs(socket.socket, "recvmsg_into")
3299@requireAttrs(socket, "AF_UNIX")
3300@unittest.skipUnless(thread, 'Threading required for this test.')
3301class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3302 SendrecvmsgUnixStreamTestBase):
3303 pass
3304
3305@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3306@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3307@unittest.skipUnless(thread, 'Threading required for this test.')
3308class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3309 pass
3310
3311@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3312@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3313@unittest.skipUnless(thread, 'Threading required for this test.')
3314class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3315 SendrecvmsgUnixStreamTestBase):
3316 pass
3317
3318
3319# Test interrupting the interruptible send/receive methods with a
3320# signal when a timeout is set. These tests avoid having multiple
3321# threads alive during the test so that the OS cannot deliver the
3322# signal to the wrong one.
3323
3324class InterruptedTimeoutBase(unittest.TestCase):
3325 # Base class for interrupted send/receive tests. Installs an
3326 # empty handler for SIGALRM and removes it on teardown, along with
3327 # any scheduled alarms.
3328
3329 def setUp(self):
3330 super().setUp()
3331 orig_alrm_handler = signal.signal(signal.SIGALRM,
3332 lambda signum, frame: None)
3333 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3334 self.addCleanup(self.setAlarm, 0)
3335
3336 # Timeout for socket operations
3337 timeout = 4.0
3338
3339 # Provide setAlarm() method to schedule delivery of SIGALRM after
3340 # given number of seconds, or cancel it if zero, and an
3341 # appropriate time value to use. Use setitimer() if available.
3342 if hasattr(signal, "setitimer"):
3343 alarm_time = 0.05
3344
3345 def setAlarm(self, seconds):
3346 signal.setitimer(signal.ITIMER_REAL, seconds)
3347 else:
3348 # Old systems may deliver the alarm up to one second early
3349 alarm_time = 2
3350
3351 def setAlarm(self, seconds):
3352 signal.alarm(seconds)
3353
3354
3355# Require siginterrupt() in order to ensure that system calls are
3356# interrupted by default.
3357@requireAttrs(signal, "siginterrupt")
3358@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3359 "Don't have signal.alarm or signal.setitimer")
3360class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3361 # Test interrupting the recv*() methods with signals when a
3362 # timeout is set.
3363
3364 def setUp(self):
3365 super().setUp()
3366 self.serv.settimeout(self.timeout)
3367
3368 def checkInterruptedRecv(self, func, *args, **kwargs):
3369 # Check that func(*args, **kwargs) raises socket.error with an
3370 # errno of EINTR when interrupted by a signal.
3371 self.setAlarm(self.alarm_time)
3372 with self.assertRaises(socket.error) as cm:
3373 func(*args, **kwargs)
3374 self.assertNotIsInstance(cm.exception, socket.timeout)
3375 self.assertEqual(cm.exception.errno, errno.EINTR)
3376
3377 def testInterruptedRecvTimeout(self):
3378 self.checkInterruptedRecv(self.serv.recv, 1024)
3379
3380 def testInterruptedRecvIntoTimeout(self):
3381 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3382
3383 def testInterruptedRecvfromTimeout(self):
3384 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3385
3386 def testInterruptedRecvfromIntoTimeout(self):
3387 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3388
3389 @requireAttrs(socket.socket, "recvmsg")
3390 def testInterruptedRecvmsgTimeout(self):
3391 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3392
3393 @requireAttrs(socket.socket, "recvmsg_into")
3394 def testInterruptedRecvmsgIntoTimeout(self):
3395 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3396
3397
3398# Require siginterrupt() in order to ensure that system calls are
3399# interrupted by default.
3400@requireAttrs(signal, "siginterrupt")
3401@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3402 "Don't have signal.alarm or signal.setitimer")
3403@unittest.skipUnless(thread, 'Threading required for this test.')
3404class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3405 ThreadSafeCleanupTestCase,
3406 SocketListeningTestMixin, TCPTestBase):
3407 # Test interrupting the interruptible send*() methods with signals
3408 # when a timeout is set.
3409
3410 def setUp(self):
3411 super().setUp()
3412 self.serv_conn = self.newSocket()
3413 self.addCleanup(self.serv_conn.close)
3414 # Use a thread to complete the connection, but wait for it to
3415 # terminate before running the test, so that there is only one
3416 # thread to accept the signal.
3417 cli_thread = threading.Thread(target=self.doConnect)
3418 cli_thread.start()
3419 self.cli_conn, addr = self.serv.accept()
3420 self.addCleanup(self.cli_conn.close)
3421 cli_thread.join()
3422 self.serv_conn.settimeout(self.timeout)
3423
3424 def doConnect(self):
3425 self.serv_conn.connect(self.serv_addr)
3426
3427 def checkInterruptedSend(self, func, *args, **kwargs):
3428 # Check that func(*args, **kwargs), run in a loop, raises
3429 # socket.error with an errno of EINTR when interrupted by a
3430 # signal.
3431 with self.assertRaises(socket.error) as cm:
3432 while True:
3433 self.setAlarm(self.alarm_time)
3434 func(*args, **kwargs)
3435 self.assertNotIsInstance(cm.exception, socket.timeout)
3436 self.assertEqual(cm.exception.errno, errno.EINTR)
3437
Nick Coghlan2496f332011-09-19 20:26:31 +10003438 # Issue #12958: The following tests have problems on Mac OS X
3439 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003440 def testInterruptedSendTimeout(self):
3441 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3442
Nick Coghlan2496f332011-09-19 20:26:31 +10003443 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003444 def testInterruptedSendtoTimeout(self):
3445 # Passing an actual address here as Python's wrapper for
3446 # sendto() doesn't allow passing a zero-length one; POSIX
3447 # requires that the address is ignored since the socket is
3448 # connection-mode, however.
3449 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3450 self.serv_addr)
3451
Nick Coghlan2496f332011-09-19 20:26:31 +10003452 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003453 @requireAttrs(socket.socket, "sendmsg")
3454 def testInterruptedSendmsgTimeout(self):
3455 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3456
3457
Victor Stinner45df8202010-04-28 22:31:17 +00003458@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003459class TCPCloserTest(ThreadedTCPSocketTest):
3460
3461 def testClose(self):
3462 conn, addr = self.serv.accept()
3463 conn.close()
3464
3465 sd = self.cli
3466 read, write, err = select.select([sd], [], [], 1.0)
3467 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003468 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003469
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003470 # Calling close() many times should be safe.
3471 conn.close()
3472 conn.close()
3473
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003474 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003475 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003476 time.sleep(1.0)
3477
Victor Stinner45df8202010-04-28 22:31:17 +00003478@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003479class BasicSocketPairTest(SocketPairTest):
3480
3481 def __init__(self, methodName='runTest'):
3482 SocketPairTest.__init__(self, methodName=methodName)
3483
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003484 def _check_defaults(self, sock):
3485 self.assertIsInstance(sock, socket.socket)
3486 if hasattr(socket, 'AF_UNIX'):
3487 self.assertEqual(sock.family, socket.AF_UNIX)
3488 else:
3489 self.assertEqual(sock.family, socket.AF_INET)
3490 self.assertEqual(sock.type, socket.SOCK_STREAM)
3491 self.assertEqual(sock.proto, 0)
3492
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003493 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003494 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003495
3496 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003497 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003498
Dave Cole331708b2004-08-09 04:51:41 +00003499 def testRecv(self):
3500 msg = self.serv.recv(1024)
3501 self.assertEqual(msg, MSG)
3502
3503 def _testRecv(self):
3504 self.cli.send(MSG)
3505
3506 def testSend(self):
3507 self.serv.send(MSG)
3508
3509 def _testSend(self):
3510 msg = self.cli.recv(1024)
3511 self.assertEqual(msg, MSG)
3512
Victor Stinner45df8202010-04-28 22:31:17 +00003513@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003514class NonBlockingTCPTests(ThreadedTCPSocketTest):
3515
3516 def __init__(self, methodName='runTest'):
3517 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3518
3519 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003520 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003521 self.serv.setblocking(0)
3522 start = time.time()
3523 try:
3524 self.serv.accept()
3525 except socket.error:
3526 pass
3527 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003528 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003529
3530 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003531 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003532
Antoine Pitroub1c54962010-10-14 15:05:38 +00003533 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003534 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003535 def testInitNonBlocking(self):
3536 # reinit server socket
3537 self.serv.close()
3538 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003539 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003540 self.port = support.bind_port(self.serv)
3541 self.serv.listen(1)
3542 # actual testing
3543 start = time.time()
3544 try:
3545 self.serv.accept()
3546 except socket.error:
3547 pass
3548 end = time.time()
3549 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3550
3551 def _testInitNonBlocking(self):
3552 pass
3553
Antoine Pitrou600232b2011-01-05 21:03:42 +00003554 def testInheritFlags(self):
3555 # Issue #7995: when calling accept() on a listening socket with a
3556 # timeout, the resulting socket should not be non-blocking.
3557 self.serv.settimeout(10)
3558 try:
3559 conn, addr = self.serv.accept()
3560 message = conn.recv(len(MSG))
3561 finally:
3562 conn.close()
3563 self.serv.settimeout(None)
3564
3565 def _testInheritFlags(self):
3566 time.sleep(0.1)
3567 self.cli.connect((HOST, self.port))
3568 time.sleep(0.5)
3569 self.cli.send(MSG)
3570
Guido van Rossum24e4af82002-06-12 19:18:08 +00003571 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003572 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003573 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003574 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003575 conn, addr = self.serv.accept()
3576 except socket.error:
3577 pass
3578 else:
3579 self.fail("Error trying to do non-blocking accept.")
3580 read, write, err = select.select([self.serv], [], [])
3581 if self.serv in read:
3582 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003583 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003584 else:
3585 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003586
Guido van Rossum24e4af82002-06-12 19:18:08 +00003587 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003588 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003589 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003590
3591 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003592 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003593 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003594 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003595
3596 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003597 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003598 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003599
3600 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003601 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003602 conn, addr = self.serv.accept()
3603 conn.setblocking(0)
3604 try:
3605 msg = conn.recv(len(MSG))
3606 except socket.error:
3607 pass
3608 else:
3609 self.fail("Error trying to do non-blocking recv.")
3610 read, write, err = select.select([conn], [], [])
3611 if conn in read:
3612 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003613 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003614 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003615 else:
3616 self.fail("Error during select call to non-blocking socket.")
3617
3618 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003619 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003620 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003621 self.cli.send(MSG)
3622
Victor Stinner45df8202010-04-28 22:31:17 +00003623@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003624class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003625 """Unit tests for the object returned by socket.makefile()
3626
Antoine Pitrou834bd812010-10-13 16:17:14 +00003627 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003628 the client connection. You can read from this file to
3629 get output from the server.
3630
Antoine Pitrou834bd812010-10-13 16:17:14 +00003631 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003632 server connection. You can write to this file to send output
3633 to the client.
3634 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003635
Guido van Rossume9f66142002-08-07 15:46:19 +00003636 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003637 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003638 errors = 'strict'
3639 newline = None
3640
3641 read_mode = 'rb'
3642 read_msg = MSG
3643 write_mode = 'wb'
3644 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003645
Guido van Rossum24e4af82002-06-12 19:18:08 +00003646 def __init__(self, methodName='runTest'):
3647 SocketConnectedTest.__init__(self, methodName=methodName)
3648
3649 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003650 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3651 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003652 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003653 self.read_file = self.cli_conn.makefile(
3654 self.read_mode, self.bufsize,
3655 encoding = self.encoding,
3656 errors = self.errors,
3657 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003658
3659 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003660 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003661 self.read_file.close()
3662 self.assertTrue(self.read_file.closed)
3663 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003664 SocketConnectedTest.tearDown(self)
3665
3666 def clientSetUp(self):
3667 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003668 self.write_file = self.serv_conn.makefile(
3669 self.write_mode, self.bufsize,
3670 encoding = self.encoding,
3671 errors = self.errors,
3672 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003673
3674 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003675 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003676 self.write_file.close()
3677 self.assertTrue(self.write_file.closed)
3678 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003679 SocketConnectedTest.clientTearDown(self)
3680
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003681 def testReadAfterTimeout(self):
3682 # Issue #7322: A file object must disallow further reads
3683 # after a timeout has occurred.
3684 self.cli_conn.settimeout(1)
3685 self.read_file.read(3)
3686 # First read raises a timeout
3687 self.assertRaises(socket.timeout, self.read_file.read, 1)
3688 # Second read is disallowed
3689 with self.assertRaises(IOError) as ctx:
3690 self.read_file.read(1)
3691 self.assertIn("cannot read from timed out object", str(ctx.exception))
3692
3693 def _testReadAfterTimeout(self):
3694 self.write_file.write(self.write_msg[0:3])
3695 self.write_file.flush()
3696 self.serv_finished.wait()
3697
Guido van Rossum24e4af82002-06-12 19:18:08 +00003698 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003699 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003700 first_seg = self.read_file.read(len(self.read_msg)-3)
3701 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003702 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003703 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003704
3705 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003706 self.write_file.write(self.write_msg)
3707 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003708
Guido van Rossum8c943832002-08-08 01:00:28 +00003709 def testFullRead(self):
3710 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003711 msg = self.read_file.read()
3712 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003713
3714 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003715 self.write_file.write(self.write_msg)
3716 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003717
Guido van Rossum24e4af82002-06-12 19:18:08 +00003718 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003719 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003720 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003721 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003722 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003723 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003724 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003725 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003726 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003727
3728 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003729 self.write_file.write(self.write_msg)
3730 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003731
3732 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003733 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003734 line = self.read_file.readline()
3735 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003736
3737 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003738 self.write_file.write(self.write_msg)
3739 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003740
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003741 def testCloseAfterMakefile(self):
3742 # The file returned by makefile should keep the socket open.
3743 self.cli_conn.close()
3744 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003745 msg = self.read_file.read()
3746 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003747
3748 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003749 self.write_file.write(self.write_msg)
3750 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003751
3752 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003753 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003754 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003755 if isinstance(self.read_msg, str):
3756 msg = msg.decode()
3757 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003758
3759 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003760 self.write_file.write(self.write_msg)
3761 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003762
Tim Peters116d83c2004-03-28 02:20:45 +00003763 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003764 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003765
3766 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003767 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003768
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003769 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003770 self.assertEqual(self.read_file.mode, self.read_mode)
3771 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003772
3773 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003774 self.assertEqual(self.write_file.mode, self.write_mode)
3775 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003776
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003777 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003778 self.read_file.close()
3779 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003780 self.cli_conn.close()
3781 self.assertRaises(socket.error, self.cli_conn.getsockname)
3782
3783 def _testRealClose(self):
3784 pass
3785
3786
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003787class FileObjectInterruptedTestCase(unittest.TestCase):
3788 """Test that the file object correctly handles EINTR internally."""
3789
3790 class MockSocket(object):
3791 def __init__(self, recv_funcs=()):
3792 # A generator that returns callables that we'll call for each
3793 # call to recv().
3794 self._recv_step = iter(recv_funcs)
3795
3796 def recv_into(self, buffer):
3797 data = next(self._recv_step)()
3798 assert len(buffer) >= len(data)
3799 buffer[:len(data)] = data
3800 return len(data)
3801
3802 def _decref_socketios(self):
3803 pass
3804
3805 def _textiowrap_for_test(self, buffering=-1):
3806 raw = socket.SocketIO(self, "r")
3807 if buffering < 0:
3808 buffering = io.DEFAULT_BUFFER_SIZE
3809 if buffering == 0:
3810 return raw
3811 buffer = io.BufferedReader(raw, buffering)
3812 text = io.TextIOWrapper(buffer, None, None)
3813 text.mode = "rb"
3814 return text
3815
3816 @staticmethod
3817 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003818 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003819
3820 def _textiowrap_mock_socket(self, mock, buffering=-1):
3821 raw = socket.SocketIO(mock, "r")
3822 if buffering < 0:
3823 buffering = io.DEFAULT_BUFFER_SIZE
3824 if buffering == 0:
3825 return raw
3826 buffer = io.BufferedReader(raw, buffering)
3827 text = io.TextIOWrapper(buffer, None, None)
3828 text.mode = "rb"
3829 return text
3830
3831 def _test_readline(self, size=-1, buffering=-1):
3832 mock_sock = self.MockSocket(recv_funcs=[
3833 lambda : b"This is the first line\nAnd the sec",
3834 self._raise_eintr,
3835 lambda : b"ond line is here\n",
3836 lambda : b"",
3837 lambda : b"", # XXX(gps): io library does an extra EOF read
3838 ])
3839 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003840 self.assertEqual(fo.readline(size), "This is the first line\n")
3841 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003842
3843 def _test_read(self, size=-1, buffering=-1):
3844 mock_sock = self.MockSocket(recv_funcs=[
3845 lambda : b"This is the first line\nAnd the sec",
3846 self._raise_eintr,
3847 lambda : b"ond line is here\n",
3848 lambda : b"",
3849 lambda : b"", # XXX(gps): io library does an extra EOF read
3850 ])
3851 expecting = (b"This is the first line\n"
3852 b"And the second line is here\n")
3853 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3854 if buffering == 0:
3855 data = b''
3856 else:
3857 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003858 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003859 while len(data) != len(expecting):
3860 part = fo.read(size)
3861 if not part:
3862 break
3863 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003864 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003865
3866 def test_default(self):
3867 self._test_readline()
3868 self._test_readline(size=100)
3869 self._test_read()
3870 self._test_read(size=100)
3871
3872 def test_with_1k_buffer(self):
3873 self._test_readline(buffering=1024)
3874 self._test_readline(size=100, buffering=1024)
3875 self._test_read(buffering=1024)
3876 self._test_read(size=100, buffering=1024)
3877
3878 def _test_readline_no_buffer(self, size=-1):
3879 mock_sock = self.MockSocket(recv_funcs=[
3880 lambda : b"a",
3881 lambda : b"\n",
3882 lambda : b"B",
3883 self._raise_eintr,
3884 lambda : b"b",
3885 lambda : b"",
3886 ])
3887 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003888 self.assertEqual(fo.readline(size), b"a\n")
3889 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003890
3891 def test_no_buffer(self):
3892 self._test_readline_no_buffer()
3893 self._test_readline_no_buffer(size=4)
3894 self._test_read(buffering=0)
3895 self._test_read(size=100, buffering=0)
3896
3897
Guido van Rossume9f66142002-08-07 15:46:19 +00003898class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3899
3900 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003901
Guido van Rossume9f66142002-08-07 15:46:19 +00003902 In this case (and in this case only), it should be possible to
3903 create a file object, read a line from it, create another file
3904 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003905 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003906 when reading multiple requests from the same socket."""
3907
3908 bufsize = 0 # Use unbuffered mode
3909
3910 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003911 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003912 line = self.read_file.readline() # first line
3913 self.assertEqual(line, b"A. " + self.write_msg) # first line
3914 self.read_file = self.cli_conn.makefile('rb', 0)
3915 line = self.read_file.readline() # second line
3916 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003917
3918 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003919 self.write_file.write(b"A. " + self.write_msg)
3920 self.write_file.write(b"B. " + self.write_msg)
3921 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003922
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003923 def testMakefileClose(self):
3924 # The file returned by makefile should keep the socket open...
3925 self.cli_conn.close()
3926 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003927 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003928 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003929 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003930 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3931
3932 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003933 self.write_file.write(self.write_msg)
3934 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003935
3936 def testMakefileCloseSocketDestroy(self):
3937 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003938 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003939 refcount_after = sys.getrefcount(self.cli_conn)
3940 self.assertEqual(refcount_before - 1, refcount_after)
3941
3942 def _testMakefileCloseSocketDestroy(self):
3943 pass
3944
Antoine Pitrou98b46702010-09-18 22:59:00 +00003945 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003946 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003947 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3948
3949 def testSmallReadNonBlocking(self):
3950 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003951 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3952 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003953 self.evt1.set()
3954 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003955 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003956 if first_seg is None:
3957 # Data not arrived (can happen under Windows), wait a bit
3958 time.sleep(0.5)
3959 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003960 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003961 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003962 self.assertEqual(n, 3)
3963 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003964 self.assertEqual(msg, self.read_msg)
3965 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3966 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003967
3968 def _testSmallReadNonBlocking(self):
3969 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003970 self.write_file.write(self.write_msg)
3971 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003972 self.evt2.set()
3973 # Avoid cloding the socket before the server test has finished,
3974 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3975 self.serv_finished.wait(5.0)
3976
3977 def testWriteNonBlocking(self):
3978 self.cli_finished.wait(5.0)
3979 # The client thread can't skip directly - the SkipTest exception
3980 # would appear as a failure.
3981 if self.serv_skipped:
3982 self.skipTest(self.serv_skipped)
3983
3984 def _testWriteNonBlocking(self):
3985 self.serv_skipped = None
3986 self.serv_conn.setblocking(False)
3987 # Try to saturate the socket buffer pipe with repeated large writes.
3988 BIG = b"x" * (1024 ** 2)
3989 LIMIT = 10
3990 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003991 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003992 self.assertGreater(n, 0)
3993 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003994 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003995 if n is None:
3996 # Succeeded
3997 break
3998 self.assertGreater(n, 0)
3999 else:
4000 # Let us know that this test didn't manage to establish
4001 # the expected conditions. This is not a failure in itself but,
4002 # if it happens repeatedly, the test should be fixed.
4003 self.serv_skipped = "failed to saturate the socket buffer"
4004
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004005
Guido van Rossum8c943832002-08-08 01:00:28 +00004006class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4007
4008 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4009
4010
4011class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4012
4013 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004014
Thomas Woutersb2137042007-02-01 18:02:27 +00004015
Antoine Pitrou834bd812010-10-13 16:17:14 +00004016class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4017 """Tests for socket.makefile() in text mode (rather than binary)"""
4018
4019 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004020 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004021 write_mode = 'wb'
4022 write_msg = MSG
4023 newline = ''
4024
4025
4026class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4027 """Tests for socket.makefile() in text mode (rather than binary)"""
4028
4029 read_mode = 'rb'
4030 read_msg = MSG
4031 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004032 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004033 newline = ''
4034
4035
4036class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4037 """Tests for socket.makefile() in text mode (rather than binary)"""
4038
4039 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004040 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004041 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004042 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004043 newline = ''
4044
4045
Guido van Rossumd8faa362007-04-27 19:54:29 +00004046class NetworkConnectionTest(object):
4047 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004048
Guido van Rossumd8faa362007-04-27 19:54:29 +00004049 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004050 # We're inherited below by BasicTCPTest2, which also inherits
4051 # BasicTCPTest, which defines self.port referenced below.
4052 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004053 self.serv_conn = self.cli
4054
4055class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4056 """Tests that NetworkConnection does not break existing TCP functionality.
4057 """
4058
4059class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004060
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004061 class MockSocket(socket.socket):
4062 def connect(self, *args):
4063 raise socket.timeout('timed out')
4064
4065 @contextlib.contextmanager
4066 def mocked_socket_module(self):
4067 """Return a socket which times out on connect"""
4068 old_socket = socket.socket
4069 socket.socket = self.MockSocket
4070 try:
4071 yield
4072 finally:
4073 socket.socket = old_socket
4074
4075 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004076 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004077 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004078 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004079 with self.assertRaises(socket.error) as cm:
4080 cli.connect((HOST, port))
4081 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4082
4083 def test_create_connection(self):
4084 # Issue #9792: errors raised by create_connection() should have
4085 # a proper errno attribute.
4086 port = support.find_unused_port()
4087 with self.assertRaises(socket.error) as cm:
4088 socket.create_connection((HOST, port))
4089 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4090
4091 def test_create_connection_timeout(self):
4092 # Issue #9792: create_connection() should not recast timeout errors
4093 # as generic socket errors.
4094 with self.mocked_socket_module():
4095 with self.assertRaises(socket.timeout):
4096 socket.create_connection((HOST, 1234))
4097
Guido van Rossumd8faa362007-04-27 19:54:29 +00004098
Victor Stinner45df8202010-04-28 22:31:17 +00004099@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004100class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4101
4102 def __init__(self, methodName='runTest'):
4103 SocketTCPTest.__init__(self, methodName=methodName)
4104 ThreadableTest.__init__(self)
4105
4106 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004107 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004108
4109 def clientTearDown(self):
4110 self.cli.close()
4111 self.cli = None
4112 ThreadableTest.clientTearDown(self)
4113
4114 def _justAccept(self):
4115 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004116 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004117
4118 testFamily = _justAccept
4119 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004120 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004121 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004122 self.assertEqual(self.cli.family, 2)
4123
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004124 testSourceAddress = _justAccept
4125 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004126 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4127 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004128 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004129 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004130 # The port number being used is sufficient to show that the bind()
4131 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004132
Guido van Rossumd8faa362007-04-27 19:54:29 +00004133 testTimeoutDefault = _justAccept
4134 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004135 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004136 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004137 socket.setdefaulttimeout(42)
4138 try:
4139 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004140 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004141 finally:
4142 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004143 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004144
4145 testTimeoutNone = _justAccept
4146 def _testTimeoutNone(self):
4147 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004148 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004149 socket.setdefaulttimeout(30)
4150 try:
4151 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004152 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004153 finally:
4154 socket.setdefaulttimeout(None)
4155 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004156
4157 testTimeoutValueNamed = _justAccept
4158 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004159 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004160 self.assertEqual(self.cli.gettimeout(), 30)
4161
4162 testTimeoutValueNonamed = _justAccept
4163 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004164 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004165 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004166 self.assertEqual(self.cli.gettimeout(), 30)
4167
Victor Stinner45df8202010-04-28 22:31:17 +00004168@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004169class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4170
4171 def __init__(self, methodName='runTest'):
4172 SocketTCPTest.__init__(self, methodName=methodName)
4173 ThreadableTest.__init__(self)
4174
4175 def clientSetUp(self):
4176 pass
4177
4178 def clientTearDown(self):
4179 self.cli.close()
4180 self.cli = None
4181 ThreadableTest.clientTearDown(self)
4182
4183 def testInsideTimeout(self):
4184 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004185 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004186 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004187 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004188 testOutsideTimeout = testInsideTimeout
4189
4190 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004191 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004192 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004193 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004194
4195 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004196 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004197 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004198
4199
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004200class TCPTimeoutTest(SocketTCPTest):
4201
4202 def testTCPTimeout(self):
4203 def raise_timeout(*args, **kwargs):
4204 self.serv.settimeout(1.0)
4205 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004206 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004207 "Error generating a timeout exception (TCP)")
4208
4209 def testTimeoutZero(self):
4210 ok = False
4211 try:
4212 self.serv.settimeout(0.0)
4213 foo = self.serv.accept()
4214 except socket.timeout:
4215 self.fail("caught timeout instead of error (TCP)")
4216 except socket.error:
4217 ok = True
4218 except:
4219 self.fail("caught unexpected exception (TCP)")
4220 if not ok:
4221 self.fail("accept() returned success when we did not expect it")
4222
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004223 def testInterruptedTimeout(self):
4224 # XXX I don't know how to do this test on MSWindows or any other
4225 # plaform that doesn't support signal.alarm() or os.kill(), though
4226 # the bug should have existed on all platforms.
4227 if not hasattr(signal, "alarm"):
4228 return # can only test on *nix
4229 self.serv.settimeout(5.0) # must be longer than alarm
4230 class Alarm(Exception):
4231 pass
4232 def alarm_handler(signal, frame):
4233 raise Alarm
4234 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4235 try:
4236 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4237 try:
4238 foo = self.serv.accept()
4239 except socket.timeout:
4240 self.fail("caught timeout instead of Alarm")
4241 except Alarm:
4242 pass
4243 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004244 self.fail("caught other exception instead of Alarm:"
4245 " %s(%s):\n%s" %
4246 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004247 else:
4248 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004249 finally:
4250 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004251 except Alarm:
4252 self.fail("got Alarm in wrong place")
4253 finally:
4254 # no alarm can be pending. Safe to restore old handler.
4255 signal.signal(signal.SIGALRM, old_alarm)
4256
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004257class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004258
4259 def testUDPTimeout(self):
4260 def raise_timeout(*args, **kwargs):
4261 self.serv.settimeout(1.0)
4262 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004263 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004264 "Error generating a timeout exception (UDP)")
4265
4266 def testTimeoutZero(self):
4267 ok = False
4268 try:
4269 self.serv.settimeout(0.0)
4270 foo = self.serv.recv(1024)
4271 except socket.timeout:
4272 self.fail("caught timeout instead of error (UDP)")
4273 except socket.error:
4274 ok = True
4275 except:
4276 self.fail("caught unexpected exception (UDP)")
4277 if not ok:
4278 self.fail("recv() returned success when we did not expect it")
4279
4280class TestExceptions(unittest.TestCase):
4281
4282 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004283 self.assertTrue(issubclass(socket.error, Exception))
4284 self.assertTrue(issubclass(socket.herror, socket.error))
4285 self.assertTrue(issubclass(socket.gaierror, socket.error))
4286 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004287
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004288class TestLinuxAbstractNamespace(unittest.TestCase):
4289
4290 UNIX_PATH_MAX = 108
4291
4292 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004293 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004294 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4295 s1.bind(address)
4296 s1.listen(1)
4297 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4298 s2.connect(s1.getsockname())
4299 with s1.accept()[0] as s3:
4300 self.assertEqual(s1.getsockname(), address)
4301 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004302
4303 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004304 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004305 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4306 s.bind(address)
4307 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004308
4309 def testNameOverflow(self):
4310 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004311 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4312 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004313
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004314 def testStrName(self):
4315 # Check that an abstract name can be passed as a string.
4316 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4317 try:
4318 s.bind("\x00python\x00test\x00")
4319 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4320 finally:
4321 s.close()
4322
4323class TestUnixDomain(unittest.TestCase):
4324
4325 def setUp(self):
4326 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4327
4328 def tearDown(self):
4329 self.sock.close()
4330
4331 def encoded(self, path):
4332 # Return the given path encoded in the file system encoding,
4333 # or skip the test if this is not possible.
4334 try:
4335 return os.fsencode(path)
4336 except UnicodeEncodeError:
4337 self.skipTest(
4338 "Pathname {0!a} cannot be represented in file "
4339 "system encoding {1!r}".format(
4340 path, sys.getfilesystemencoding()))
4341
Antoine Pitrou16374872011-12-16 15:04:12 +01004342 def bind(self, sock, path):
4343 # Bind the socket
4344 try:
4345 sock.bind(path)
4346 except OSError as e:
4347 if str(e) == "AF_UNIX path too long":
4348 self.skipTest(
4349 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4350 .format(path))
4351 else:
4352 raise
4353
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004354 def testStrAddr(self):
4355 # Test binding to and retrieving a normal string pathname.
4356 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004357 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004358 self.addCleanup(support.unlink, path)
4359 self.assertEqual(self.sock.getsockname(), path)
4360
4361 def testBytesAddr(self):
4362 # Test binding to a bytes pathname.
4363 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004364 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004365 self.addCleanup(support.unlink, path)
4366 self.assertEqual(self.sock.getsockname(), path)
4367
4368 def testSurrogateescapeBind(self):
4369 # Test binding to a valid non-ASCII pathname, with the
4370 # non-ASCII bytes supplied using surrogateescape encoding.
4371 path = os.path.abspath(support.TESTFN_UNICODE)
4372 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004373 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004374 self.addCleanup(support.unlink, path)
4375 self.assertEqual(self.sock.getsockname(), path)
4376
4377 def testUnencodableAddr(self):
4378 # Test binding to a pathname that cannot be encoded in the
4379 # file system encoding.
4380 if support.TESTFN_UNENCODABLE is None:
4381 self.skipTest("No unencodable filename available")
4382 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004383 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004384 self.addCleanup(support.unlink, path)
4385 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004386
Victor Stinner45df8202010-04-28 22:31:17 +00004387@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004388class BufferIOTest(SocketConnectedTest):
4389 """
4390 Test the buffer versions of socket.recv() and socket.send().
4391 """
4392 def __init__(self, methodName='runTest'):
4393 SocketConnectedTest.__init__(self, methodName=methodName)
4394
Antoine Pitrou25480782010-03-17 22:50:28 +00004395 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004396 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004397 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004398 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004399 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004400 self.assertEqual(msg, MSG)
4401
Antoine Pitrou25480782010-03-17 22:50:28 +00004402 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004403 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004404 self.serv_conn.send(buf)
4405
Antoine Pitrou25480782010-03-17 22:50:28 +00004406 def testRecvIntoBytearray(self):
4407 buf = bytearray(1024)
4408 nbytes = self.cli_conn.recv_into(buf)
4409 self.assertEqual(nbytes, len(MSG))
4410 msg = buf[:len(MSG)]
4411 self.assertEqual(msg, MSG)
4412
4413 _testRecvIntoBytearray = _testRecvIntoArray
4414
4415 def testRecvIntoMemoryview(self):
4416 buf = bytearray(1024)
4417 nbytes = self.cli_conn.recv_into(memoryview(buf))
4418 self.assertEqual(nbytes, len(MSG))
4419 msg = buf[:len(MSG)]
4420 self.assertEqual(msg, MSG)
4421
4422 _testRecvIntoMemoryview = _testRecvIntoArray
4423
4424 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004425 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004426 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004427 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004428 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004429 self.assertEqual(msg, MSG)
4430
Antoine Pitrou25480782010-03-17 22:50:28 +00004431 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004432 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004433 self.serv_conn.send(buf)
4434
Antoine Pitrou25480782010-03-17 22:50:28 +00004435 def testRecvFromIntoBytearray(self):
4436 buf = bytearray(1024)
4437 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4438 self.assertEqual(nbytes, len(MSG))
4439 msg = buf[:len(MSG)]
4440 self.assertEqual(msg, MSG)
4441
4442 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4443
4444 def testRecvFromIntoMemoryview(self):
4445 buf = bytearray(1024)
4446 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4447 self.assertEqual(nbytes, len(MSG))
4448 msg = buf[:len(MSG)]
4449 self.assertEqual(msg, MSG)
4450
4451 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4452
Christian Heimes043d6f62008-01-07 17:19:16 +00004453
4454TIPC_STYPE = 2000
4455TIPC_LOWER = 200
4456TIPC_UPPER = 210
4457
4458def isTipcAvailable():
4459 """Check if the TIPC module is loaded
4460
4461 The TIPC module is not loaded automatically on Ubuntu and probably
4462 other Linux distros.
4463 """
4464 if not hasattr(socket, "AF_TIPC"):
4465 return False
4466 if not os.path.isfile("/proc/modules"):
4467 return False
4468 with open("/proc/modules") as f:
4469 for line in f:
4470 if line.startswith("tipc "):
4471 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004472 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004473 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4474 return False
4475
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004476class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004477 def testRDM(self):
4478 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4479 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004480 self.addCleanup(srv.close)
4481 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004482
4483 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4484 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4485 TIPC_LOWER, TIPC_UPPER)
4486 srv.bind(srvaddr)
4487
4488 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4489 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4490 cli.sendto(MSG, sendaddr)
4491
4492 msg, recvaddr = srv.recvfrom(1024)
4493
4494 self.assertEqual(cli.getsockname(), recvaddr)
4495 self.assertEqual(msg, MSG)
4496
4497
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004498class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004499 def __init__(self, methodName = 'runTest'):
4500 unittest.TestCase.__init__(self, methodName = methodName)
4501 ThreadableTest.__init__(self)
4502
4503 def setUp(self):
4504 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004505 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004506 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4507 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4508 TIPC_LOWER, TIPC_UPPER)
4509 self.srv.bind(srvaddr)
4510 self.srv.listen(5)
4511 self.serverExplicitReady()
4512 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004513 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004514
4515 def clientSetUp(self):
4516 # The is a hittable race between serverExplicitReady() and the
4517 # accept() call; sleep a little while to avoid it, otherwise
4518 # we could get an exception
4519 time.sleep(0.1)
4520 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004521 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004522 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4523 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4524 self.cli.connect(addr)
4525 self.cliaddr = self.cli.getsockname()
4526
4527 def testStream(self):
4528 msg = self.conn.recv(1024)
4529 self.assertEqual(msg, MSG)
4530 self.assertEqual(self.cliaddr, self.connaddr)
4531
4532 def _testStream(self):
4533 self.cli.send(MSG)
4534 self.cli.close()
4535
4536
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004537@unittest.skipUnless(thread, 'Threading required for this test.')
4538class ContextManagersTest(ThreadedTCPSocketTest):
4539
4540 def _testSocketClass(self):
4541 # base test
4542 with socket.socket() as sock:
4543 self.assertFalse(sock._closed)
4544 self.assertTrue(sock._closed)
4545 # close inside with block
4546 with socket.socket() as sock:
4547 sock.close()
4548 self.assertTrue(sock._closed)
4549 # exception inside with block
4550 with socket.socket() as sock:
4551 self.assertRaises(socket.error, sock.sendall, b'foo')
4552 self.assertTrue(sock._closed)
4553
4554 def testCreateConnectionBase(self):
4555 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004556 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004557 data = conn.recv(1024)
4558 conn.sendall(data)
4559
4560 def _testCreateConnectionBase(self):
4561 address = self.serv.getsockname()
4562 with socket.create_connection(address) as sock:
4563 self.assertFalse(sock._closed)
4564 sock.sendall(b'foo')
4565 self.assertEqual(sock.recv(1024), b'foo')
4566 self.assertTrue(sock._closed)
4567
4568 def testCreateConnectionClose(self):
4569 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004570 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004571 data = conn.recv(1024)
4572 conn.sendall(data)
4573
4574 def _testCreateConnectionClose(self):
4575 address = self.serv.getsockname()
4576 with socket.create_connection(address) as sock:
4577 sock.close()
4578 self.assertTrue(sock._closed)
4579 self.assertRaises(socket.error, sock.sendall, b'foo')
4580
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004581
Antoine Pitroub1c54962010-10-14 15:05:38 +00004582@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4583 "SOCK_CLOEXEC not defined")
4584@unittest.skipUnless(fcntl, "module fcntl not available")
4585class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004586 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004587 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004588 with socket.socket(socket.AF_INET,
4589 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4590 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4591 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004592
4593
4594@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4595 "SOCK_NONBLOCK not defined")
4596class NonblockConstantTest(unittest.TestCase):
4597 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4598 if nonblock:
4599 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4600 self.assertEqual(s.gettimeout(), timeout)
4601 else:
4602 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4603 self.assertEqual(s.gettimeout(), None)
4604
Charles-François Natali239bb962011-06-03 12:55:15 +02004605 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004606 def test_SOCK_NONBLOCK(self):
4607 # a lot of it seems silly and redundant, but I wanted to test that
4608 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004609 with socket.socket(socket.AF_INET,
4610 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4611 self.checkNonblock(s)
4612 s.setblocking(1)
4613 self.checkNonblock(s, False)
4614 s.setblocking(0)
4615 self.checkNonblock(s)
4616 s.settimeout(None)
4617 self.checkNonblock(s, False)
4618 s.settimeout(2.0)
4619 self.checkNonblock(s, timeout=2.0)
4620 s.setblocking(1)
4621 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004622 # defaulttimeout
4623 t = socket.getdefaulttimeout()
4624 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004625 with socket.socket() as s:
4626 self.checkNonblock(s)
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(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004631 with socket.socket() as s:
4632 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004633 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004634 with socket.socket() as s:
4635 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004636 socket.setdefaulttimeout(t)
4637
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004638
Guido van Rossumb995eb72002-07-31 16:08:40 +00004639def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004640 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004641 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004642
4643 tests.extend([
4644 NonBlockingTCPTests,
4645 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004646 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004647 UnbufferedFileObjectClassTestCase,
4648 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004649 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004650 UnicodeReadFileObjectClassTestCase,
4651 UnicodeWriteFileObjectClassTestCase,
4652 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004653 NetworkConnectionNoServer,
4654 NetworkConnectionAttributesTest,
4655 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004656 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004657 CloexecConstantTest,
4658 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004659 ])
Dave Cole331708b2004-08-09 04:51:41 +00004660 if hasattr(socket, "socketpair"):
4661 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004662 if hasattr(socket, "AF_UNIX"):
4663 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004664 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004665 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004666 if isTipcAvailable():
4667 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004668 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004669 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004670 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004671 tests.extend([
4672 CmsgMacroTests,
4673 SendmsgUDPTest,
4674 RecvmsgUDPTest,
4675 RecvmsgIntoUDPTest,
4676 SendmsgUDP6Test,
4677 RecvmsgUDP6Test,
4678 RecvmsgRFC3542AncillaryUDP6Test,
4679 RecvmsgIntoRFC3542AncillaryUDP6Test,
4680 RecvmsgIntoUDP6Test,
4681 SendmsgTCPTest,
4682 RecvmsgTCPTest,
4683 RecvmsgIntoTCPTest,
4684 SendmsgSCTPStreamTest,
4685 RecvmsgSCTPStreamTest,
4686 RecvmsgIntoSCTPStreamTest,
4687 SendmsgUnixStreamTest,
4688 RecvmsgUnixStreamTest,
4689 RecvmsgIntoUnixStreamTest,
4690 RecvmsgSCMRightsStreamTest,
4691 RecvmsgIntoSCMRightsStreamTest,
4692 # These are slow when setitimer() is not available
4693 InterruptedRecvTimeoutTest,
4694 InterruptedSendTimeoutTest,
4695 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004696
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004697 thread_info = support.threading_setup()
4698 support.run_unittest(*tests)
4699 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004700
4701if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004702 test_main()